xref: /aosp_15_r20/external/llvm/unittests/ADT/HashingTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/HashingTest.cpp ----------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Hashing.h unit tests.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Hashing.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h"
17*9880d681SAndroid Build Coastguard Worker #include <deque>
18*9880d681SAndroid Build Coastguard Worker #include <list>
19*9880d681SAndroid Build Coastguard Worker #include <map>
20*9880d681SAndroid Build Coastguard Worker #include <vector>
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker namespace llvm {
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker // Helper for test code to print hash codes.
PrintTo(const hash_code & code,std::ostream * os)25*9880d681SAndroid Build Coastguard Worker void PrintTo(const hash_code &code, std::ostream *os) {
26*9880d681SAndroid Build Coastguard Worker   *os << static_cast<size_t>(code);
27*9880d681SAndroid Build Coastguard Worker }
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker // Fake an object that is recognized as hashable data to test super large
30*9880d681SAndroid Build Coastguard Worker // objects.
31*9880d681SAndroid Build Coastguard Worker struct LargeTestInteger { uint64_t arr[8]; };
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker struct NonPOD {
34*9880d681SAndroid Build Coastguard Worker   uint64_t x, y;
NonPODllvm::NonPOD35*9880d681SAndroid Build Coastguard Worker   NonPOD(uint64_t x, uint64_t y) : x(x), y(y) {}
hash_value(const NonPOD & obj)36*9880d681SAndroid Build Coastguard Worker   friend hash_code hash_value(const NonPOD &obj) {
37*9880d681SAndroid Build Coastguard Worker     return hash_combine(obj.x, obj.y);
38*9880d681SAndroid Build Coastguard Worker   }
39*9880d681SAndroid Build Coastguard Worker };
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker namespace hashing {
42*9880d681SAndroid Build Coastguard Worker namespace detail {
43*9880d681SAndroid Build Coastguard Worker template <> struct is_hashable_data<LargeTestInteger> : std::true_type {};
44*9880d681SAndroid Build Coastguard Worker } // namespace detail
45*9880d681SAndroid Build Coastguard Worker } // namespace hashing
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker } // namespace llvm
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker using namespace llvm;
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker namespace {
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker enum TestEnumeration {
54*9880d681SAndroid Build Coastguard Worker   TE_Foo = 42,
55*9880d681SAndroid Build Coastguard Worker   TE_Bar = 43
56*9880d681SAndroid Build Coastguard Worker };
57*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashValueBasicTest)58*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashValueBasicTest) {
59*9880d681SAndroid Build Coastguard Worker   int x = 42, y = 43, c = 'x';
60*9880d681SAndroid Build Coastguard Worker   void *p = nullptr;
61*9880d681SAndroid Build Coastguard Worker   uint64_t i = 71;
62*9880d681SAndroid Build Coastguard Worker   const unsigned ci = 71;
63*9880d681SAndroid Build Coastguard Worker   volatile int vi = 71;
64*9880d681SAndroid Build Coastguard Worker   const volatile int cvi = 71;
65*9880d681SAndroid Build Coastguard Worker   uintptr_t addr = reinterpret_cast<uintptr_t>(&y);
66*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(42), hash_value(x));
67*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(42), hash_value(TE_Foo));
68*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_value(42), hash_value(y));
69*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_value(42), hash_value(TE_Bar));
70*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_value(42), hash_value(p));
71*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(71), hash_value(i));
72*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(71), hash_value(ci));
73*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(71), hash_value(vi));
74*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(71), hash_value(cvi));
75*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(c), hash_value('x'));
76*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value('4'), hash_value('0' + 4));
77*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(addr), hash_value(&y));
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashValueStdPair)80*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashValueStdPair) {
81*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(42, 43), hash_value(std::make_pair(42, 43)));
82*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(43, 42), hash_value(std::make_pair(42, 43)));
83*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42ull, 43ull)));
84*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42, 43ull)));
85*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(42, 43), hash_value(std::make_pair(42ull, 43)));
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker   // Note that pairs are implicitly flattened to a direct sequence of data and
88*9880d681SAndroid Build Coastguard Worker   // hashed efficiently as a consequence.
89*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(42, 43, 44),
90*9880d681SAndroid Build Coastguard Worker             hash_value(std::make_pair(42, std::make_pair(43, 44))));
91*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_value(std::make_pair(42, std::make_pair(43, 44))),
92*9880d681SAndroid Build Coastguard Worker             hash_value(std::make_pair(std::make_pair(42, 43), 44)));
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker   // Ensure that pairs which have padding bytes *inside* them don't get treated
95*9880d681SAndroid Build Coastguard Worker   // this way.
96*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine('0', hash_combine(1ull, '2')),
97*9880d681SAndroid Build Coastguard Worker             hash_value(std::make_pair('0', std::make_pair(1ull, '2'))));
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   // Ensure that non-POD pairs don't explode the traits used.
100*9880d681SAndroid Build Coastguard Worker   NonPOD obj1(1, 2), obj2(3, 4), obj3(5, 6);
101*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(obj1, hash_combine(obj2, obj3)),
102*9880d681SAndroid Build Coastguard Worker             hash_value(std::make_pair(obj1, std::make_pair(obj2, obj3))));
103*9880d681SAndroid Build Coastguard Worker }
104*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashValueStdString)105*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashValueStdString) {
106*9880d681SAndroid Build Coastguard Worker   std::string s = "Hello World!";
107*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(s.c_str(), s.c_str() + s.size()), hash_value(s));
108*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(s.c_str(), s.c_str() + s.size() - 1),
109*9880d681SAndroid Build Coastguard Worker             hash_value(s.substr(0, s.size() - 1)));
110*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(s.c_str() + 1, s.c_str() + s.size() - 1),
111*9880d681SAndroid Build Coastguard Worker             hash_value(s.substr(1, s.size() - 2)));
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker   std::wstring ws = L"Hello Wide World!";
114*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(ws.c_str(), ws.c_str() + ws.size()),
115*9880d681SAndroid Build Coastguard Worker             hash_value(ws));
116*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(ws.c_str(), ws.c_str() + ws.size() - 1),
117*9880d681SAndroid Build Coastguard Worker             hash_value(ws.substr(0, ws.size() - 1)));
118*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(ws.c_str() + 1, ws.c_str() + ws.size() - 1),
119*9880d681SAndroid Build Coastguard Worker             hash_value(ws.substr(1, ws.size() - 2)));
120*9880d681SAndroid Build Coastguard Worker }
121*9880d681SAndroid Build Coastguard Worker 
begin(T (& arr)[N])122*9880d681SAndroid Build Coastguard Worker template <typename T, size_t N> T *begin(T (&arr)[N]) { return arr; }
end(T (& arr)[N])123*9880d681SAndroid Build Coastguard Worker template <typename T, size_t N> T *end(T (&arr)[N]) { return arr + N; }
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker // Provide a dummy, hashable type designed for easy verification: its hash is
126*9880d681SAndroid Build Coastguard Worker // the same as its value.
127*9880d681SAndroid Build Coastguard Worker struct HashableDummy { size_t value; };
hash_value(HashableDummy dummy)128*9880d681SAndroid Build Coastguard Worker hash_code hash_value(HashableDummy dummy) { return dummy.value; }
129*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashCombineRangeBasicTest)130*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashCombineRangeBasicTest) {
131*9880d681SAndroid Build Coastguard Worker   // Leave this uninitialized in the hope that valgrind will catch bad reads.
132*9880d681SAndroid Build Coastguard Worker   int dummy;
133*9880d681SAndroid Build Coastguard Worker   hash_code dummy_hash = hash_combine_range(&dummy, &dummy);
134*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_code(0), dummy_hash);
135*9880d681SAndroid Build Coastguard Worker 
136*9880d681SAndroid Build Coastguard Worker   const int arr1[] = { 1, 2, 3 };
137*9880d681SAndroid Build Coastguard Worker   hash_code arr1_hash = hash_combine_range(begin(arr1), end(arr1));
138*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(dummy_hash, arr1_hash);
139*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(arr1_hash, hash_combine_range(begin(arr1), end(arr1)));
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker   const std::vector<int> vec(begin(arr1), end(arr1));
142*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(arr1_hash, hash_combine_range(vec.begin(), vec.end()));
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker   const std::list<int> list(begin(arr1), end(arr1));
145*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(arr1_hash, hash_combine_range(list.begin(), list.end()));
146*9880d681SAndroid Build Coastguard Worker 
147*9880d681SAndroid Build Coastguard Worker   const std::deque<int> deque(begin(arr1), end(arr1));
148*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(arr1_hash, hash_combine_range(deque.begin(), deque.end()));
149*9880d681SAndroid Build Coastguard Worker 
150*9880d681SAndroid Build Coastguard Worker   const int arr2[] = { 3, 2, 1 };
151*9880d681SAndroid Build Coastguard Worker   hash_code arr2_hash = hash_combine_range(begin(arr2), end(arr2));
152*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(dummy_hash, arr2_hash);
153*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(arr1_hash, arr2_hash);
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker   const int arr3[] = { 1, 1, 2, 3 };
156*9880d681SAndroid Build Coastguard Worker   hash_code arr3_hash = hash_combine_range(begin(arr3), end(arr3));
157*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(dummy_hash, arr3_hash);
158*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(arr1_hash, arr3_hash);
159*9880d681SAndroid Build Coastguard Worker 
160*9880d681SAndroid Build Coastguard Worker   const int arr4[] = { 1, 2, 3, 3 };
161*9880d681SAndroid Build Coastguard Worker   hash_code arr4_hash = hash_combine_range(begin(arr4), end(arr4));
162*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(dummy_hash, arr4_hash);
163*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(arr1_hash, arr4_hash);
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker   const size_t arr5[] = { 1, 2, 3 };
166*9880d681SAndroid Build Coastguard Worker   const HashableDummy d_arr5[] = { {1}, {2}, {3} };
167*9880d681SAndroid Build Coastguard Worker   hash_code arr5_hash = hash_combine_range(begin(arr5), end(arr5));
168*9880d681SAndroid Build Coastguard Worker   hash_code d_arr5_hash = hash_combine_range(begin(d_arr5), end(d_arr5));
169*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(arr5_hash, d_arr5_hash);
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashCombineRangeLengthDiff)172*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashCombineRangeLengthDiff) {
173*9880d681SAndroid Build Coastguard Worker   // Test that as only the length varies, we compute different hash codes for
174*9880d681SAndroid Build Coastguard Worker   // sequences.
175*9880d681SAndroid Build Coastguard Worker   std::map<size_t, size_t> code_to_size;
176*9880d681SAndroid Build Coastguard Worker   std::vector<char> all_one_c(256, '\xff');
177*9880d681SAndroid Build Coastguard Worker   for (unsigned Idx = 1, Size = all_one_c.size(); Idx < Size; ++Idx) {
178*9880d681SAndroid Build Coastguard Worker     hash_code code = hash_combine_range(&all_one_c[0], &all_one_c[0] + Idx);
179*9880d681SAndroid Build Coastguard Worker     std::map<size_t, size_t>::iterator
180*9880d681SAndroid Build Coastguard Worker       I = code_to_size.insert(std::make_pair(code, Idx)).first;
181*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Idx, I->second);
182*9880d681SAndroid Build Coastguard Worker   }
183*9880d681SAndroid Build Coastguard Worker   code_to_size.clear();
184*9880d681SAndroid Build Coastguard Worker   std::vector<char> all_zero_c(256, '\0');
185*9880d681SAndroid Build Coastguard Worker   for (unsigned Idx = 1, Size = all_zero_c.size(); Idx < Size; ++Idx) {
186*9880d681SAndroid Build Coastguard Worker     hash_code code = hash_combine_range(&all_zero_c[0], &all_zero_c[0] + Idx);
187*9880d681SAndroid Build Coastguard Worker     std::map<size_t, size_t>::iterator
188*9880d681SAndroid Build Coastguard Worker       I = code_to_size.insert(std::make_pair(code, Idx)).first;
189*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Idx, I->second);
190*9880d681SAndroid Build Coastguard Worker   }
191*9880d681SAndroid Build Coastguard Worker   code_to_size.clear();
192*9880d681SAndroid Build Coastguard Worker   std::vector<unsigned> all_one_int(512, -1);
193*9880d681SAndroid Build Coastguard Worker   for (unsigned Idx = 1, Size = all_one_int.size(); Idx < Size; ++Idx) {
194*9880d681SAndroid Build Coastguard Worker     hash_code code = hash_combine_range(&all_one_int[0], &all_one_int[0] + Idx);
195*9880d681SAndroid Build Coastguard Worker     std::map<size_t, size_t>::iterator
196*9880d681SAndroid Build Coastguard Worker       I = code_to_size.insert(std::make_pair(code, Idx)).first;
197*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Idx, I->second);
198*9880d681SAndroid Build Coastguard Worker   }
199*9880d681SAndroid Build Coastguard Worker   code_to_size.clear();
200*9880d681SAndroid Build Coastguard Worker   std::vector<unsigned> all_zero_int(512, 0);
201*9880d681SAndroid Build Coastguard Worker   for (unsigned Idx = 1, Size = all_zero_int.size(); Idx < Size; ++Idx) {
202*9880d681SAndroid Build Coastguard Worker     hash_code code = hash_combine_range(&all_zero_int[0], &all_zero_int[0] + Idx);
203*9880d681SAndroid Build Coastguard Worker     std::map<size_t, size_t>::iterator
204*9880d681SAndroid Build Coastguard Worker       I = code_to_size.insert(std::make_pair(code, Idx)).first;
205*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Idx, I->second);
206*9880d681SAndroid Build Coastguard Worker   }
207*9880d681SAndroid Build Coastguard Worker }
208*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashCombineRangeGoldenTest)209*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashCombineRangeGoldenTest) {
210*9880d681SAndroid Build Coastguard Worker   struct { const char *s; uint64_t hash; } golden_data[] = {
211*9880d681SAndroid Build Coastguard Worker #if SIZE_MAX == UINT64_MAX
212*9880d681SAndroid Build Coastguard Worker     { "a",                                0xaeb6f9d5517c61f8ULL },
213*9880d681SAndroid Build Coastguard Worker     { "ab",                               0x7ab1edb96be496b4ULL },
214*9880d681SAndroid Build Coastguard Worker     { "abc",                              0xe38e60bf19c71a3fULL },
215*9880d681SAndroid Build Coastguard Worker     { "abcde",                            0xd24461a66de97f6eULL },
216*9880d681SAndroid Build Coastguard Worker     { "abcdefgh",                         0x4ef872ec411dec9dULL },
217*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklm",                    0xe8a865539f4eadfeULL },
218*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstu",            0x261cdf85faaf4e79ULL },
219*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstuvwxyzabcdef", 0x43ba70e4198e3b2aULL },
220*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstuvwxyzabcdef"
221*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzghijkl"
222*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzmnopqr"
223*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzstuvwx"
224*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzyzabcd", 0xdcd57fb2afdf72beULL },
225*9880d681SAndroid Build Coastguard Worker     { "a",                                0xaeb6f9d5517c61f8ULL },
226*9880d681SAndroid Build Coastguard Worker     { "aa",                               0xf2b3b69a9736a1ebULL },
227*9880d681SAndroid Build Coastguard Worker     { "aaa",                              0xf752eb6f07b1cafeULL },
228*9880d681SAndroid Build Coastguard Worker     { "aaaaa",                            0x812bd21e1236954cULL },
229*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaa",                         0xff07a2cff08ac587ULL },
230*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaa",                    0x84ac949d54d704ecULL },
231*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaa",            0xcb2c8fb6be8f5648ULL },
232*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0xcc40ab7f164091b6ULL },
233*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
234*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
235*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
236*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
237*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0xc58e174c1e78ffe9ULL },
238*9880d681SAndroid Build Coastguard Worker     { "z",                                0x1ba160d7e8f8785cULL },
239*9880d681SAndroid Build Coastguard Worker     { "zz",                               0x2c5c03172f1285d7ULL },
240*9880d681SAndroid Build Coastguard Worker     { "zzz",                              0x9d2c4f4b507a2ac3ULL },
241*9880d681SAndroid Build Coastguard Worker     { "zzzzz",                            0x0f03b9031735693aULL },
242*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzz",                         0xe674147c8582c08eULL },
243*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzz",                    0x3162d9fa6938db83ULL },
244*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzz",            0x37b9a549e013620cULL },
245*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x8921470aff885016ULL },
246*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
247*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
248*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
249*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
250*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0xf60fdcd9beb08441ULL },
251*9880d681SAndroid Build Coastguard Worker     { "a",                                0xaeb6f9d5517c61f8ULL },
252*9880d681SAndroid Build Coastguard Worker     { "ab",                               0x7ab1edb96be496b4ULL },
253*9880d681SAndroid Build Coastguard Worker     { "aba",                              0x3edb049950884d0aULL },
254*9880d681SAndroid Build Coastguard Worker     { "ababa",                            0x8f2de9e73a97714bULL },
255*9880d681SAndroid Build Coastguard Worker     { "abababab",                         0xee14a29ddf0ce54cULL },
256*9880d681SAndroid Build Coastguard Worker     { "ababababababa",                    0x38b3ddaada2d52b4ULL },
257*9880d681SAndroid Build Coastguard Worker     { "ababababababababababa",            0xd3665364219f2b85ULL },
258*9880d681SAndroid Build Coastguard Worker     { "abababababababababababababababab", 0xa75cd6afbf1bc972ULL },
259*9880d681SAndroid Build Coastguard Worker     { "abababababababababababababababab"
260*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
261*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
262*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
263*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab", 0x840192d129f7a22bULL }
264*9880d681SAndroid Build Coastguard Worker #elif SIZE_MAX == UINT32_MAX
265*9880d681SAndroid Build Coastguard Worker     { "a",                                0x000000004605f745ULL },
266*9880d681SAndroid Build Coastguard Worker     { "ab",                               0x00000000d5f06301ULL },
267*9880d681SAndroid Build Coastguard Worker     { "abc",                              0x00000000559fe1eeULL },
268*9880d681SAndroid Build Coastguard Worker     { "abcde",                            0x00000000424028d7ULL },
269*9880d681SAndroid Build Coastguard Worker     { "abcdefgh",                         0x000000007bb119f8ULL },
270*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklm",                    0x00000000edbca513ULL },
271*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstu",            0x000000007c15712eULL },
272*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstuvwxyzabcdef", 0x000000000b3aad66ULL },
273*9880d681SAndroid Build Coastguard Worker     { "abcdefghijklmnopqrstuvwxyzabcdef"
274*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzghijkl"
275*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzmnopqr"
276*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzstuvwx"
277*9880d681SAndroid Build Coastguard Worker       "abcdefghijklmnopqrstuvwxyzyzabcd", 0x000000008c758c8bULL },
278*9880d681SAndroid Build Coastguard Worker     { "a",                                0x000000004605f745ULL },
279*9880d681SAndroid Build Coastguard Worker     { "aa",                               0x00000000dc0a52daULL },
280*9880d681SAndroid Build Coastguard Worker     { "aaa",                              0x00000000b309274fULL },
281*9880d681SAndroid Build Coastguard Worker     { "aaaaa",                            0x00000000203b5ef6ULL },
282*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaa",                         0x00000000a429e18fULL },
283*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaa",                    0x000000008662070bULL },
284*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaa",            0x000000003f11151cULL },
285*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0x000000008600fe20ULL },
286*9880d681SAndroid Build Coastguard Worker     { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
287*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
288*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
289*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
290*9880d681SAndroid Build Coastguard Worker       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0x000000004e0e0804ULL },
291*9880d681SAndroid Build Coastguard Worker     { "z",                                0x00000000c5e405e9ULL },
292*9880d681SAndroid Build Coastguard Worker     { "zz",                               0x00000000a8d8a2c6ULL },
293*9880d681SAndroid Build Coastguard Worker     { "zzz",                              0x00000000fc2af672ULL },
294*9880d681SAndroid Build Coastguard Worker     { "zzzzz",                            0x0000000047d9efe6ULL },
295*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzz",                         0x0000000080d77794ULL },
296*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzz",                    0x00000000405f93adULL },
297*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzz",            0x00000000fc72838dULL },
298*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x000000007ce160f1ULL },
299*9880d681SAndroid Build Coastguard Worker     { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
300*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
301*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
302*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
303*9880d681SAndroid Build Coastguard Worker       "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", 0x00000000aed9ed1bULL },
304*9880d681SAndroid Build Coastguard Worker     { "a",                                0x000000004605f745ULL },
305*9880d681SAndroid Build Coastguard Worker     { "ab",                               0x00000000d5f06301ULL },
306*9880d681SAndroid Build Coastguard Worker     { "aba",                              0x00000000a85cd91bULL },
307*9880d681SAndroid Build Coastguard Worker     { "ababa",                            0x000000009e3bb52eULL },
308*9880d681SAndroid Build Coastguard Worker     { "abababab",                         0x000000002709b3b9ULL },
309*9880d681SAndroid Build Coastguard Worker     { "ababababababa",                    0x000000003a234174ULL },
310*9880d681SAndroid Build Coastguard Worker     { "ababababababababababa",            0x000000005c63e5ceULL },
311*9880d681SAndroid Build Coastguard Worker     { "abababababababababababababababab", 0x0000000013f74334ULL },
312*9880d681SAndroid Build Coastguard Worker     { "abababababababababababababababab"
313*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
314*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
315*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab"
316*9880d681SAndroid Build Coastguard Worker       "abababababababababababababababab", 0x00000000c1a6f135ULL },
317*9880d681SAndroid Build Coastguard Worker #else
318*9880d681SAndroid Build Coastguard Worker #error This test only supports 64-bit and 32-bit systems.
319*9880d681SAndroid Build Coastguard Worker #endif
320*9880d681SAndroid Build Coastguard Worker   };
321*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < sizeof(golden_data)/sizeof(*golden_data); ++i) {
322*9880d681SAndroid Build Coastguard Worker     StringRef str = golden_data[i].s;
323*9880d681SAndroid Build Coastguard Worker     hash_code hash = hash_combine_range(str.begin(), str.end());
324*9880d681SAndroid Build Coastguard Worker #if 0 // Enable this to generate paste-able text for the above structure.
325*9880d681SAndroid Build Coastguard Worker     std::string member_str = "\"" + str.str() + "\",";
326*9880d681SAndroid Build Coastguard Worker     fprintf(stderr, " { %-35s 0x%016llxULL },\n",
327*9880d681SAndroid Build Coastguard Worker             member_str.c_str(), static_cast<uint64_t>(hash));
328*9880d681SAndroid Build Coastguard Worker #endif
329*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<size_t>(golden_data[i].hash),
330*9880d681SAndroid Build Coastguard Worker               static_cast<size_t>(hash));
331*9880d681SAndroid Build Coastguard Worker   }
332*9880d681SAndroid Build Coastguard Worker }
333*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashCombineBasicTest)334*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashCombineBasicTest) {
335*9880d681SAndroid Build Coastguard Worker   // Hashing a sequence of homogenous types matches range hashing.
336*9880d681SAndroid Build Coastguard Worker   const int i1 = 42, i2 = 43, i3 = 123, i4 = 999, i5 = 0, i6 = 79;
337*9880d681SAndroid Build Coastguard Worker   const int arr1[] = { i1, i2, i3, i4, i5, i6 };
338*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 1), hash_combine(i1));
339*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 2), hash_combine(i1, i2));
340*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 3), hash_combine(i1, i2, i3));
341*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 4), hash_combine(i1, i2, i3, i4));
342*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 5),
343*9880d681SAndroid Build Coastguard Worker             hash_combine(i1, i2, i3, i4, i5));
344*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(arr1, arr1 + 6),
345*9880d681SAndroid Build Coastguard Worker             hash_combine(i1, i2, i3, i4, i5, i6));
346*9880d681SAndroid Build Coastguard Worker 
347*9880d681SAndroid Build Coastguard Worker   // Hashing a sequence of heterogeneous types which *happen* to all produce the
348*9880d681SAndroid Build Coastguard Worker   // same data for hashing produces the same as a range-based hash of the
349*9880d681SAndroid Build Coastguard Worker   // fundamental values.
350*9880d681SAndroid Build Coastguard Worker   const size_t s1 = 1024, s2 = 8888, s3 = 9000000;
351*9880d681SAndroid Build Coastguard Worker   const HashableDummy d1 = { 1024 }, d2 = { 8888 }, d3 = { 9000000 };
352*9880d681SAndroid Build Coastguard Worker   const size_t arr2[] = { s1, s2, s3 };
353*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(begin(arr2), end(arr2)),
354*9880d681SAndroid Build Coastguard Worker             hash_combine(s1, s2, s3));
355*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(s1, s2, d3));
356*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(s1, d2, s3));
357*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, s2, s3));
358*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, d2, s3));
359*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(s1, s2, s3), hash_combine(d1, d2, d3));
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker   // Permuting values causes hashes to change.
362*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i1, i1, i2));
363*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i1, i2, i1));
364*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i1, i1));
365*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i2, i1));
366*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i1), hash_combine(i2, i2, i2));
367*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i2, i1, i1), hash_combine(i1, i1, i2));
368*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i1, i2), hash_combine(i1, i2, i1));
369*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i2, i1), hash_combine(i2, i1, i1));
370*9880d681SAndroid Build Coastguard Worker 
371*9880d681SAndroid Build Coastguard Worker   // Changing type w/o changing value causes hashes to change.
372*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i2, i3), hash_combine((char)i1, i2, i3));
373*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i2, i3), hash_combine(i1, (char)i2, i3));
374*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(hash_combine(i1, i2, i3), hash_combine(i1, i2, (char)i3));
375*9880d681SAndroid Build Coastguard Worker 
376*9880d681SAndroid Build Coastguard Worker   // This is array of uint64, but it should have the exact same byte pattern as
377*9880d681SAndroid Build Coastguard Worker   // an array of LargeTestIntegers.
378*9880d681SAndroid Build Coastguard Worker   const uint64_t bigarr[] = {
379*9880d681SAndroid Build Coastguard Worker     0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
380*9880d681SAndroid Build Coastguard Worker     0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
381*9880d681SAndroid Build Coastguard Worker     0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
382*9880d681SAndroid Build Coastguard Worker     0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
383*9880d681SAndroid Build Coastguard Worker     0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
384*9880d681SAndroid Build Coastguard Worker     0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
385*9880d681SAndroid Build Coastguard Worker     0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
386*9880d681SAndroid Build Coastguard Worker     0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
387*9880d681SAndroid Build Coastguard Worker     0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL
388*9880d681SAndroid Build Coastguard Worker   };
389*9880d681SAndroid Build Coastguard Worker   // Hash a preposterously large integer, both aligned with the buffer and
390*9880d681SAndroid Build Coastguard Worker   // misaligned.
391*9880d681SAndroid Build Coastguard Worker   const LargeTestInteger li = { {
392*9880d681SAndroid Build Coastguard Worker     0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL,
393*9880d681SAndroid Build Coastguard Worker     0xdeadbeafdeadbeefULL, 0xfefefefededededeULL, 0xafafafafededededULL,
394*9880d681SAndroid Build Coastguard Worker     0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL
395*9880d681SAndroid Build Coastguard Worker   } };
396*9880d681SAndroid Build Coastguard Worker   // Rotate the storage from 'li'.
397*9880d681SAndroid Build Coastguard Worker   const LargeTestInteger l2 = { {
398*9880d681SAndroid Build Coastguard Worker     0xacacacacbcbcbcbcULL, 0xccddeeffeeddccbbULL, 0xdeadbeafdeadbeefULL,
399*9880d681SAndroid Build Coastguard Worker     0xfefefefededededeULL, 0xafafafafededededULL, 0xffffeeeeddddccccULL,
400*9880d681SAndroid Build Coastguard Worker     0xaaaacbcbffffababULL, 0xaaaaaaaaababababULL
401*9880d681SAndroid Build Coastguard Worker   } };
402*9880d681SAndroid Build Coastguard Worker   const LargeTestInteger l3 = { {
403*9880d681SAndroid Build Coastguard Worker     0xccddeeffeeddccbbULL, 0xdeadbeafdeadbeefULL, 0xfefefefededededeULL,
404*9880d681SAndroid Build Coastguard Worker     0xafafafafededededULL, 0xffffeeeeddddccccULL, 0xaaaacbcbffffababULL,
405*9880d681SAndroid Build Coastguard Worker     0xaaaaaaaaababababULL, 0xacacacacbcbcbcbcULL
406*9880d681SAndroid Build Coastguard Worker   } };
407*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(begin(bigarr), end(bigarr)),
408*9880d681SAndroid Build Coastguard Worker             hash_combine(li, li, li));
409*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 9),
410*9880d681SAndroid Build Coastguard Worker             hash_combine(bigarr[0], l2));
411*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 10),
412*9880d681SAndroid Build Coastguard Worker             hash_combine(bigarr[0], bigarr[1], l3));
413*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 17),
414*9880d681SAndroid Build Coastguard Worker             hash_combine(li, bigarr[0], l2));
415*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 18),
416*9880d681SAndroid Build Coastguard Worker             hash_combine(li, bigarr[0], bigarr[1], l3));
417*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 18),
418*9880d681SAndroid Build Coastguard Worker             hash_combine(bigarr[0], l2, bigarr[9], l3));
419*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine_range(bigarr, bigarr + 20),
420*9880d681SAndroid Build Coastguard Worker             hash_combine(bigarr[0], l2, bigarr[9], l3, bigarr[18], bigarr[19]));
421*9880d681SAndroid Build Coastguard Worker }
422*9880d681SAndroid Build Coastguard Worker 
TEST(HashingTest,HashCombineArgs18)423*9880d681SAndroid Build Coastguard Worker TEST(HashingTest, HashCombineArgs18) {
424*9880d681SAndroid Build Coastguard Worker   // This tests that we can pass in up to 18 args.
425*9880d681SAndroid Build Coastguard Worker #define CHECK_SAME(...)                                                        \
426*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(hash_combine(__VA_ARGS__), hash_combine(__VA_ARGS__))
427*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18);
428*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
429*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
430*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
431*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
432*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
433*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
434*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
435*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
436*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8, 9);
437*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7, 8);
438*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6, 7);
439*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5, 6);
440*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4, 5);
441*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3, 4);
442*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2, 3);
443*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1, 2);
444*9880d681SAndroid Build Coastguard Worker   CHECK_SAME(1);
445*9880d681SAndroid Build Coastguard Worker #undef CHECK_SAME
446*9880d681SAndroid Build Coastguard Worker }
447*9880d681SAndroid Build Coastguard Worker 
448*9880d681SAndroid Build Coastguard Worker }
449