xref: /llvm-project/clang/unittests/Format/TokenAnnotatorTest.cpp (revision bb4f6c4dca98a47054117708015bb2724256ee83)
1 //===- unittest/Format/TokenAnnotatorTest.cpp - Formatting unit tests -----===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/Format/Format.h"
10 
11 #include "FormatTestUtils.h"
12 #include "TestLexer.h"
13 #include "gtest/gtest.h"
14 
15 namespace clang {
16 namespace format {
17 
18 // Not really the equality, but everything we need.
19 static bool operator==(const FormatToken &LHS,
20                        const FormatToken &RHS) noexcept {
21   return LHS.Tok.getKind() == RHS.Tok.getKind() &&
22          LHS.getType() == RHS.getType();
23 }
24 
25 namespace {
26 
27 class TokenAnnotatorTest : public ::testing::Test {
28 protected:
29   TokenList annotate(llvm::StringRef Code,
30                      const FormatStyle &Style = getLLVMStyle()) {
31     return TestLexer(Allocator, Buffers, Style).annotate(Code);
32   }
33   llvm::SpecificBumpPtrAllocator<FormatToken> Allocator;
34   std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
35 };
36 
37 #define EXPECT_TOKEN_KIND(FormatTok, Kind)                                     \
38   EXPECT_EQ((FormatTok)->Tok.getKind(), Kind) << *(FormatTok)
39 #define EXPECT_TOKEN_TYPE(FormatTok, Type)                                     \
40   EXPECT_EQ((FormatTok)->getType(), Type) << *(FormatTok)
41 #define EXPECT_TOKEN_PRECEDENCE(FormatTok, Prec)                               \
42   EXPECT_EQ((FormatTok)->getPrecedence(), Prec) << *(FormatTok)
43 #define EXPECT_TOKEN(FormatTok, Kind, Type)                                    \
44   do {                                                                         \
45     EXPECT_TOKEN_KIND(FormatTok, Kind);                                        \
46     EXPECT_TOKEN_TYPE(FormatTok, Type);                                        \
47   } while (false)
48 
49 TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
50   auto Tokens = annotate("auto x = [](const decltype(x) &ptr) {};");
51   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
52   EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);
53   EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);
54   EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);
55   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
56   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
57 
58   Tokens = annotate("auto x = [](const decltype(x) *ptr) {};");
59   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
60   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
61   EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);
62 
63   Tokens = annotate("#define lambda [](const decltype(x) &ptr) {}");
64   EXPECT_EQ(Tokens.size(), 17u) << Tokens;
65   EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);
66   EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);
67   EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);
68   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
69   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
70 
71   Tokens = annotate("#define lambda [](const decltype(x) *ptr) {}");
72   EXPECT_EQ(Tokens.size(), 17u) << Tokens;
73   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
74   EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);
75 
76   Tokens = annotate("void f() {\n"
77                     "  while (p < a && *p == 'a')\n"
78                     "    p++;\n"
79                     "}");
80   EXPECT_EQ(Tokens.size(), 21u) << Tokens;
81   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
82   EXPECT_TOKEN(Tokens[11], tok::star, TT_UnaryOperator);
83 
84   Tokens = annotate("case *x:");
85   EXPECT_EQ(Tokens.size(), 5u) << Tokens;
86   EXPECT_TOKEN(Tokens[1], tok::star, TT_UnaryOperator);
87   Tokens = annotate("case &x:");
88   EXPECT_EQ(Tokens.size(), 5u) << Tokens;
89   EXPECT_TOKEN(Tokens[1], tok::amp, TT_UnaryOperator);
90 
91   Tokens = annotate("bool b = 3 == int{3} && true;\n");
92   EXPECT_EQ(Tokens.size(), 13u) << Tokens;
93   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);
94 
95   Tokens = annotate("struct {\n"
96                     "} *ptr;");
97   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
98   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
99   Tokens = annotate("union {\n"
100                     "} *ptr;");
101   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
102   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
103   Tokens = annotate("class {\n"
104                     "} *ptr;");
105   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
106   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
107 
108   Tokens = annotate("struct {\n"
109                     "} &&ptr = {};");
110   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
111   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
112   Tokens = annotate("union {\n"
113                     "} &&ptr = {};");
114   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
115   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
116   Tokens = annotate("class {\n"
117                     "} &&ptr = {};");
118   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
119   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
120   Tokens = annotate("int i = int{42} * 2;");
121   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
122   EXPECT_TOKEN(Tokens[7], tok::star, TT_BinaryOperator);
123 
124   Tokens = annotate("delete[] *ptr;");
125   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
126   EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);
127   Tokens = annotate("delete[] **ptr;");
128   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
129   EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);
130   EXPECT_TOKEN(Tokens[4], tok::star, TT_UnaryOperator);
131   Tokens = annotate("delete[] *(ptr);");
132   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
133   EXPECT_TOKEN(Tokens[3], tok::star, TT_UnaryOperator);
134 
135   Tokens = annotate("void f() { void (*fnptr)(char* foo); }");
136   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
137   EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionTypeLParen);
138   // FIXME: The star of a function pointer probably makes more sense as
139   // TT_PointerOrReference.
140   EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);
141   EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);
142 
143   Tokens = annotate("void f() { void (*fnptr)(t* foo); }");
144   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
145   EXPECT_TOKEN(Tokens[6], tok::l_paren, TT_FunctionTypeLParen);
146   EXPECT_TOKEN(Tokens[7], tok::star, TT_UnaryOperator);
147   EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);
148 
149   Tokens = annotate("if (Foo * Bar / Test)");
150   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
151   EXPECT_TOKEN(Tokens[3], tok::star, TT_BinaryOperator);
152 
153   Tokens = annotate("if (Class* obj {getObj()})");
154   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
155   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
156 
157   Tokens = annotate("if (Foo* Bar = getObj())");
158   ASSERT_EQ(Tokens.size(), 11u) << Tokens;
159   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
160 
161   Tokens = annotate("int f3() { return sizeof(Foo&); }");
162   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
163   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
164 
165   Tokens = annotate("int f4() { return sizeof(Foo&&); }");
166   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
167   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference);
168 
169   Tokens = annotate("void f5() { int f6(Foo&, Bar&); }");
170   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
171   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
172   EXPECT_TOKEN(Tokens[12], tok::amp, TT_PointerOrReference);
173 
174   Tokens = annotate("void f7() { int f8(Foo&&, Bar&&); }");
175   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
176   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference);
177   EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_PointerOrReference);
178 
179   Tokens = annotate("Type1 &val1 = val2;");
180   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
181   EXPECT_TOKEN(Tokens[1], tok::amp, TT_PointerOrReference);
182 
183   Tokens = annotate("Type1 *val1 = &val2;");
184   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
185   EXPECT_TOKEN(Tokens[1], tok::star, TT_PointerOrReference);
186   EXPECT_TOKEN(Tokens[4], tok::amp, TT_UnaryOperator);
187 
188   Tokens = annotate("val1 & val2;");
189   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
190   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
191 
192   Tokens = annotate("val1 & val2.member;");
193   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
194   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
195 
196   Tokens = annotate("val1 & val2.*member;");
197   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
198   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
199 
200   Tokens = annotate("val1.*member & val2;");
201   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
202   EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);
203 
204   Tokens = annotate("val1 & val2->*member;");
205   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
206   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
207 
208   Tokens = annotate("val1->member & val2;");
209   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
210   EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);
211 
212   Tokens = annotate("val1 & val2 & val3;");
213   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
214   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
215   EXPECT_TOKEN(Tokens[3], tok::amp, TT_BinaryOperator);
216 
217   Tokens = annotate("val1 & val2 // comment\n"
218                     "     & val3;");
219   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
220   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
221   EXPECT_TOKEN(Tokens[4], tok::amp, TT_BinaryOperator);
222 
223   Tokens =
224       annotate("val1 & val2.member & val3.member() & val4 & val5->member;");
225   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
226   EXPECT_TOKEN(Tokens[1], tok::amp, TT_BinaryOperator);
227   EXPECT_TOKEN(Tokens[5], tok::amp, TT_BinaryOperator);
228   EXPECT_TOKEN(Tokens[11], tok::amp, TT_BinaryOperator);
229   EXPECT_TOKEN(Tokens[13], tok::amp, TT_BinaryOperator);
230 
231   Tokens = annotate("class c {\n"
232                     "  void func(type &a) { a & member; }\n"
233                     "  anotherType &member;\n"
234                     "}");
235   ASSERT_EQ(Tokens.size(), 22u) << Tokens;
236   EXPECT_TOKEN(Tokens[7], tok::amp, TT_PointerOrReference);
237   EXPECT_TOKEN(Tokens[12], tok::amp, TT_BinaryOperator);
238   EXPECT_TOKEN(Tokens[17], tok::amp, TT_PointerOrReference);
239 
240   Tokens = annotate("struct S {\n"
241                     "  auto Mem = C & D;\n"
242                     "}");
243   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
244   EXPECT_TOKEN(Tokens[7], tok::amp, TT_BinaryOperator);
245 
246   Tokens =
247       annotate("template <typename T> void swap() noexcept(Bar<T> && Foo<T>);");
248   ASSERT_EQ(Tokens.size(), 23u) << Tokens;
249   EXPECT_TOKEN(Tokens[15], tok::ampamp, TT_BinaryOperator);
250 
251   Tokens = annotate("template <typename T> struct S {\n"
252                     "  explicit(Bar<T> && Foo<T>) S(const S &);\n"
253                     "};");
254   ASSERT_EQ(Tokens.size(), 30u) << Tokens;
255   EXPECT_TOKEN(Tokens[14], tok::ampamp, TT_BinaryOperator);
256 
257   Tokens = annotate("template <bool B = C && D> struct S {};");
258   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
259   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_BinaryOperator);
260 
261   Tokens = annotate("template <typename T, bool B = C && D> struct S {};");
262   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
263   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);
264 }
265 
266 TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {
267   auto Tokens = annotate("x - 0");
268   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
269   EXPECT_TOKEN(Tokens[1], tok::minus, TT_BinaryOperator);
270   Tokens = annotate("0 + 0");
271   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
272   EXPECT_TOKEN(Tokens[1], tok::plus, TT_BinaryOperator);
273   Tokens = annotate("x + +0");
274   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
275   EXPECT_TOKEN(Tokens[2], tok::plus, TT_UnaryOperator);
276   Tokens = annotate("x ? -0 : +0");
277   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
278   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
279   EXPECT_TOKEN(Tokens[5], tok::plus, TT_UnaryOperator);
280   Tokens = annotate("(-0)");
281   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
282   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
283   Tokens = annotate("0, -0");
284   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
285   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
286   Tokens = annotate("for (; -1;) {\n}");
287   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
288   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
289   Tokens = annotate("x = -1;");
290   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
291   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
292   Tokens = annotate("x[-1]");
293   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
294   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
295   Tokens = annotate("x = {-1};");
296   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
297   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
298   Tokens = annotate("case -x:");
299   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
300   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
301   Tokens = annotate("co_await -x;");
302   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
303   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
304   Tokens = annotate("co_return -x;");
305   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
306   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
307   Tokens = annotate("co_yield -x;");
308   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
309   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
310   Tokens = annotate("delete -x;");
311   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
312   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
313   Tokens = annotate("return -x;");
314   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
315   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
316   Tokens = annotate("throw -x;");
317   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
318   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
319   Tokens = annotate("sizeof -x");
320   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
321   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
322   Tokens = annotate("co_await +x;");
323   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
324   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
325   Tokens = annotate("co_return +x;");
326   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
327   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
328   Tokens = annotate("co_yield +x;");
329   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
330   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
331   Tokens = annotate("delete +x;");
332   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
333   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
334   Tokens = annotate("return +x;");
335   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
336   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
337   Tokens = annotate("throw +x;");
338   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
339   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
340   Tokens = annotate("sizeof +x");
341   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
342   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
343   Tokens = annotate("(int)-x");
344   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
345   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
346   Tokens = annotate("(-x)");
347   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
348   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
349   Tokens = annotate("!+x");
350   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
351   EXPECT_TOKEN(Tokens[0], tok::exclaim, TT_UnaryOperator);
352   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
353 }
354 
355 TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
356   auto Tokens = annotate("class C {};");
357   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
358   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
359 
360   Tokens = annotate("const class C {} c;");
361   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
362   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);
363 
364   Tokens = annotate("const class {} c;");
365   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
366   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
367 
368   Tokens = annotate("class [[deprecated(\"\")]] C { int i; };");
369   EXPECT_EQ(Tokens.size(), 17u) << Tokens;
370   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_ClassLBrace);
371 }
372 
373 TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
374   auto Tokens = annotate("struct S {};");
375   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
376   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
377 }
378 
379 TEST_F(TokenAnnotatorTest, UnderstandsUnions) {
380   auto Tokens = annotate("union U {};");
381   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
382   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
383 
384   Tokens = annotate("union U { void f() { return; } };");
385   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
386   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
387   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);
388 }
389 
390 TEST_F(TokenAnnotatorTest, UnderstandsEnums) {
391   auto Tokens = annotate("enum E {};");
392   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
393   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_EnumLBrace);
394 }
395 
396 TEST_F(TokenAnnotatorTest, UnderstandsDefaultedAndDeletedFunctions) {
397   auto Tokens = annotate("auto operator<=>(const T &) const & = default;");
398   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
399   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
400 
401   Tokens = annotate("template <typename T> void F(T) && = delete;");
402   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
403   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
404 }
405 
406 TEST_F(TokenAnnotatorTest, UnderstandsVariables) {
407   auto Tokens =
408       annotate("inline bool var = is_integral_v<int> && is_signed_v<int>;");
409   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
410   EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_BinaryOperator);
411 }
412 
413 TEST_F(TokenAnnotatorTest, UnderstandsVariableTemplates) {
414   auto Tokens =
415       annotate("template <typename T> "
416                "inline bool var = is_integral_v<int> && is_signed_v<int>;");
417   EXPECT_EQ(Tokens.size(), 20u) << Tokens;
418   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
419 }
420 
421 TEST_F(TokenAnnotatorTest, UnderstandsTemplatesInMacros) {
422   auto Tokens =
423       annotate("#define FOO(typeName) \\\n"
424                "  { #typeName, foo<FooType>(new foo<realClass>(#typeName)) }");
425   ASSERT_EQ(Tokens.size(), 27u) << Tokens;
426   EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener);
427   EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
428   EXPECT_TOKEN(Tokens[17], tok::less, TT_TemplateOpener);
429   EXPECT_TOKEN(Tokens[19], tok::greater, TT_TemplateCloser);
430 }
431 
432 TEST_F(TokenAnnotatorTest, UnderstandsGreaterAfterTemplateCloser) {
433   auto Tokens = annotate("if (std::tuple_size_v<T> > 0)");
434   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
435   EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);
436   EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
437   EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);
438 }
439 
440 TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
441   FormatStyle Style = getLLVMStyle();
442   Style.WhitespaceSensitiveMacros.push_back("FOO");
443 
444   auto Tokens = annotate("FOO(1+2 )\n", Style);
445   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
446   EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);
447 
448   Tokens = annotate("FOO(a:b:c)\n", Style);
449   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
450   EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);
451 }
452 
453 TEST_F(TokenAnnotatorTest, UnderstandsDelete) {
454   auto Tokens = annotate("delete (void *)p;");
455   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
456   EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);
457 
458   Tokens = annotate("delete[] (void *)p;");
459   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
460   EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);
461 
462   Tokens = annotate("delete[] /*comment*/ (void *)p;");
463   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
464   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
465 
466   Tokens = annotate("delete[/*comment*/] (void *)p;");
467   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
468   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
469 
470   Tokens = annotate("delete/*comment*/[] (void *)p;");
471   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
472   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
473 }
474 
475 TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
476   auto Tokens = annotate("(void)p;");
477   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
478   EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);
479 
480   Tokens = annotate("auto x = (Foo)p;");
481   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
482   EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_CastRParen);
483 
484   Tokens = annotate("(std::vector<int>)p;");
485   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
486   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
487 
488   Tokens = annotate("return (Foo)p;");
489   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
490   EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);
491 
492   Tokens = annotate("throw (Foo)p;");
493   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
494   EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);
495 }
496 
497 TEST_F(TokenAnnotatorTest, UnderstandsDynamicExceptionSpecifier) {
498   auto Tokens = annotate("void f() throw(int);");
499   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
500   EXPECT_TOKEN(Tokens[4], tok::kw_throw, TT_Unknown);
501 }
502 
503 TEST_F(TokenAnnotatorTest, UnderstandsFunctionRefQualifiers) {
504   auto Tokens = annotate("void f() &;");
505   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
506   EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);
507 
508   Tokens = annotate("void operator=(T) &&;");
509   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
510   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);
511 
512   Tokens = annotate("template <typename T> void f() &;");
513   EXPECT_EQ(Tokens.size(), 12u) << Tokens;
514   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
515 
516   Tokens = annotate("template <typename T> void operator=(T) &;");
517   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
518   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
519 }
520 
521 TEST_F(TokenAnnotatorTest, UnderstandsOverloadedOperators) {
522   auto Tokens = annotate("x.operator+()");
523   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
524   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
525   EXPECT_TOKEN(Tokens[3], tok::plus, TT_OverloadedOperator);
526   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
527   Tokens = annotate("x.operator=()");
528   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
529   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
530   EXPECT_TOKEN(Tokens[3], tok::equal, TT_OverloadedOperator);
531   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
532   Tokens = annotate("x.operator+=()");
533   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
534   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
535   EXPECT_TOKEN(Tokens[3], tok::plusequal, TT_OverloadedOperator);
536   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
537   Tokens = annotate("x.operator,()");
538   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
539   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
540   EXPECT_TOKEN(Tokens[3], tok::comma, TT_OverloadedOperator);
541   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
542   Tokens = annotate("x.operator()()");
543   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
544   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
545   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperator);
546   EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_OverloadedOperator);
547   EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);
548   Tokens = annotate("x.operator[]()");
549   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
550   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
551   // EXPECT_TOKEN(Tokens[3], tok::l_square, TT_OverloadedOperator);
552   // EXPECT_TOKEN(Tokens[4], tok::r_square, TT_OverloadedOperator);
553   EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);
554   Tokens = annotate("x.operator\"\"_a()");
555   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
556   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
557   EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);
558   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
559   Tokens = annotate("x.operator\"\" _a()");
560   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
561   // FIXME
562   // EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
563   EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);
564   EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);
565   Tokens = annotate("x.operator\"\"if()");
566   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
567   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
568   EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);
569   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
570   Tokens = annotate("x.operator\"\"s()");
571   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
572   EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
573   EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);
574   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
575   Tokens = annotate("x.operator\"\" s()");
576   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
577   // FIXME
578   // EXPECT_TOKEN(Tokens[2], tok::kw_operator, TT_FunctionDeclarationName);
579   EXPECT_TOKEN(Tokens[3], tok::string_literal, TT_OverloadedOperator);
580   EXPECT_TOKEN(Tokens[5], tok::l_paren, TT_OverloadedOperatorLParen);
581 
582   Tokens = annotate("int operator+(int);");
583   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
584   EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);
585   EXPECT_TOKEN(Tokens[2], tok::plus, TT_OverloadedOperator);
586   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen);
587   Tokens = annotate("auto operator=(T&) {}");
588   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
589   EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);
590   EXPECT_TOKEN(Tokens[2], tok::equal, TT_OverloadedOperator);
591   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_OverloadedOperatorLParen);
592   Tokens = annotate("auto operator()() {}");
593   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
594   EXPECT_TOKEN(Tokens[1], tok::kw_operator, TT_FunctionDeclarationName);
595   EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_OverloadedOperator);
596   EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_OverloadedOperator);
597   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
598 }
599 
600 TEST_F(TokenAnnotatorTest, OverloadedOperatorInTemplate) {
601   struct {
602     const char *Text;
603     tok::TokenKind Kind;
604   } Operators[] = {{"+", tok::plus},
605                    {"-", tok::minus},
606                    // FIXME:
607                    // {"*", tok::star},
608                    {"/", tok::slash},
609                    {"%", tok::percent},
610                    {"^", tok::caret},
611                    // FIXME:
612                    // {"&", tok::amp},
613                    {"|", tok::pipe},
614                    {"~", tok::tilde},
615                    {"!", tok::exclaim},
616                    {"=", tok::equal},
617                    // FIXME:
618                    // {"<", tok::less},
619                    {">", tok::greater},
620                    {"+=", tok::plusequal},
621                    {"-=", tok::minusequal},
622                    {"*=", tok::starequal},
623                    {"/=", tok::slashequal},
624                    {"%=", tok::percentequal},
625                    {"^=", tok::caretequal},
626                    {"&=", tok::ampequal},
627                    {"|=", tok::pipeequal},
628                    {"<<", tok::lessless},
629                    {">>", tok::greatergreater},
630                    {">>=", tok::greatergreaterequal},
631                    {"<<=", tok::lesslessequal},
632                    {"==", tok::equalequal},
633                    {"!=", tok::exclaimequal},
634                    {"<=", tok::lessequal},
635                    {">=", tok::greaterequal},
636                    {"<=>", tok::spaceship},
637                    {"&&", tok::ampamp},
638                    {"||", tok::pipepipe},
639                    {"++", tok::plusplus},
640                    {"--", tok::minusminus},
641                    {",", tok::comma},
642                    {"->*", tok::arrowstar},
643                    {"->", tok::arrow}};
644 
645   for (const auto &Operator : Operators) {
646     std::string Input("C<&operator");
647     Input += Operator.Text;
648     Input += " > a;";
649     auto Tokens = annotate(std::string(Input));
650     ASSERT_EQ(Tokens.size(), 9u) << Tokens;
651     EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);
652     EXPECT_TOKEN(Tokens[4], Operator.Kind, TT_OverloadedOperator);
653     EXPECT_TOKEN(Tokens[5], tok::greater, TT_TemplateCloser);
654   }
655 
656   auto Tokens = annotate("C<&operator< <X>> lt;");
657   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
658   EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);
659   EXPECT_TOKEN(Tokens[4], tok::less, TT_OverloadedOperator);
660   EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);
661   EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
662   EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser);
663 }
664 
665 TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
666   auto Tokens = annotate("template <typename T>\n"
667                          "concept C = (Foo && Bar) && (Bar && Baz);");
668 
669   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
670   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
671   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
672   EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);
673 
674   Tokens = annotate("template <typename T>\n"
675                     "concept C = Foo && !Bar;");
676 
677   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
678   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);
679   EXPECT_TOKEN(Tokens[10], tok::exclaim, TT_UnaryOperator);
680 
681   Tokens = annotate("template <typename T>\n"
682                     "concept C = requires(T t) {\n"
683                     "  { t.foo() };\n"
684                     "} && Bar<T> && Baz<T>;");
685   ASSERT_EQ(Tokens.size(), 35u) << Tokens;
686   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
687   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
688   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
689   EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);
690   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
691 
692   Tokens = annotate("template<typename T>\n"
693                     "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"
694                     "struct Foo;");
695   ASSERT_EQ(Tokens.size(), 36u) << Tokens;
696   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
697   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
698   EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);
699   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
700   EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);
701   EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);
702   EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);
703   EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);
704   EXPECT_EQ(Tokens[31]->FakeRParens, 1u);
705   EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);
706 
707   Tokens =
708       annotate("template<typename T>\n"
709                "requires (C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"
710                "struct Foo;");
711   ASSERT_EQ(Tokens.size(), 38u) << Tokens;
712   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
713   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
714   EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);
715   EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);
716   EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);
717   EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);
718   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
719   EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);
720   EXPECT_EQ(Tokens[32]->FakeRParens, 1u);
721   EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);
722   EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);
723 
724   Tokens = annotate("template <typename T>\n"
725                     "void foo(T) noexcept requires Bar<T>;");
726   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
727   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
728 
729   Tokens = annotate("template <typename T>\n"
730                     "requires Bar<T> || Baz<T>\n"
731                     "auto foo(T) -> int;");
732   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
733   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
734   EXPECT_EQ(Tokens[11]->FakeLParens.size(), 0u);
735   EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);
736   EXPECT_TOKEN(Tokens[20], tok::arrow, TT_TrailingReturnArrow);
737 
738   Tokens = annotate("template <typename T>\n"
739                     "requires Bar<T>\n"
740                     "bool foo(T) { return false; }");
741   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
742   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
743   EXPECT_TRUE(Tokens[9]->ClosesRequiresClause);
744   EXPECT_TOKEN(Tokens[11], tok::identifier, TT_FunctionDeclarationName);
745 
746   Tokens = annotate("template <typename T>\n"
747                     "requires Bar<T>\n"
748                     "decltype(auto) foo(T) { return false; }");
749   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
750   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
751   EXPECT_TRUE(Tokens[9]->ClosesRequiresClause);
752   EXPECT_TOKEN(Tokens[14], tok::identifier, TT_FunctionDeclarationName);
753 
754   Tokens = annotate("template <typename T>\n"
755                     "struct S {\n"
756                     "  void foo() const requires Bar<T>;\n"
757                     "  void bar() const & requires Baz<T>;\n"
758                     "  void bar() && requires Baz2<T>;\n"
759                     "  void baz() const & noexcept requires Baz<T>;\n"
760                     "  void baz() && noexcept requires Baz2<T>;\n"
761                     "};\n"
762                     "\n"
763                     "void S::bar() const & requires Baz<T> { }");
764   ASSERT_EQ(Tokens.size(), 85u) << Tokens;
765   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
766   EXPECT_TOKEN(Tokens[24], tok::amp, TT_PointerOrReference);
767   EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);
768   EXPECT_TOKEN(Tokens[35], tok::ampamp, TT_PointerOrReference);
769   EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);
770   EXPECT_TOKEN(Tokens[47], tok::amp, TT_PointerOrReference);
771   EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);
772   EXPECT_TOKEN(Tokens[59], tok::ampamp, TT_PointerOrReference);
773   EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);
774   EXPECT_TOKEN(Tokens[76], tok::amp, TT_PointerOrReference);
775   EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);
776 
777   Tokens = annotate("void Class::member() && requires(Constant) {}");
778   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
779   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
780 
781   Tokens = annotate("void Class::member() && requires(Constant<T>) {}");
782   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
783   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
784 
785   Tokens =
786       annotate("void Class::member() && requires(Namespace::Constant<T>) {}");
787   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
788   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
789 
790   Tokens = annotate("void Class::member() && requires(typename "
791                     "Namespace::Outer<T>::Inner::Constant) {}");
792   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
793   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
794 
795   Tokens = annotate("struct [[nodiscard]] zero_t {\n"
796                     "  template<class T>\n"
797                     "    requires requires { number_zero_v<T>; }\n"
798                     "  [[nodiscard]] constexpr operator T() const { "
799                     "return number_zero_v<T>; }\n"
800                     "};");
801   ASSERT_EQ(Tokens.size(), 44u);
802   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
803   EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);
804   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);
805   EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);
806   EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);
807   EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);
808 
809   Tokens =
810       annotate("template <class A, class B> concept C ="
811                "std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;");
812   ASSERT_EQ(Tokens.size(), 31u) << Tokens;
813   EXPECT_TOKEN(Tokens[8], tok::kw_concept, TT_Unknown);
814   EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener);
815   EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener);
816   EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser);
817   EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener);
818   EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser);
819   EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser);
820 
821   Tokens = annotate("auto bar() -> int requires(is_integral_v<T>) {}");
822   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
823   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
824 
825   Tokens = annotate("auto bar() -> void requires(is_integral_v<T>) {}");
826   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
827   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
828 
829   Tokens = annotate("auto bar() -> MyType requires(is_integral_v<T>) {}");
830   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
831   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
832 
833   Tokens =
834       annotate("auto bar() -> SOME_MACRO_TYPE requires(is_integral_v<T>) {}");
835   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
836   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
837 
838   Tokens =
839       annotate("auto bar() -> qualified::type requires(is_integral_v<T>) {}");
840   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
841   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);
842 
843   Tokens =
844       annotate("auto bar() -> Template<type> requires(is_integral_v<T>) {}");
845   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
846   EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause);
847 }
848 
849 TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
850   auto Tokens = annotate("bool b = requires(int i) { i + 5; };");
851   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
852   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
853   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
854   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
855 
856   Tokens = annotate("if (requires(int i) { i + 5; }) return;");
857   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
858   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
859   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
860   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);
861 
862   Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");
863   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
864   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);
865   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);
866   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);
867 
868   Tokens = annotate("foo(requires(const T t) {});");
869   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
870   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
871   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
872   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
873 
874   Tokens = annotate("foo(requires(const int t) {});");
875   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
876   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
877   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
878   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
879 
880   Tokens = annotate("foo(requires(const T t) {});");
881   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
882   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
883   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
884   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
885 
886   Tokens = annotate("foo(requires(int const* volatile t) {});");
887   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
888   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
889   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
890   EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);
891   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
892 
893   Tokens = annotate("foo(requires(T const* volatile t) {});");
894   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
895   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
896   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
897   EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference);
898   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
899 
900   Tokens = annotate("foo(requires(T& t) {});");
901   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
902   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
903   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
904   EXPECT_TOKEN(Tokens[5], tok::amp, TT_PointerOrReference);
905   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
906 
907   Tokens = annotate("foo(requires(T&& t) {});");
908   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
909   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
910   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
911   EXPECT_TOKEN(Tokens[5], tok::ampamp, TT_PointerOrReference);
912   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
913 
914   Tokens = annotate("bool foo = requires(T& t) {};");
915   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
916   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
917   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
918   EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference);
919   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace);
920 
921   Tokens = annotate("bool foo = requires(T&& t) {};");
922   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
923   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
924   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
925   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);
926   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace);
927 
928   Tokens =
929       annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");
930   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
931   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
932   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
933   EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference);
934   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);
935 
936   Tokens = annotate("template <typename T>\n"
937                     "concept C = requires(T T) {\n"
938                     "  requires Bar<T> && Foo<T>;\n"
939                     "};");
940   ASSERT_EQ(Tokens.size(), 28u) << Tokens;
941   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
942   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
943   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
944   EXPECT_TOKEN(Tokens[14], tok::kw_requires,
945                TT_RequiresClauseInARequiresExpression);
946 
947   Tokens = annotate("template <typename T>\n"
948                     "concept C = requires(T T) {\n"
949                     "  { t.func() } -> std::same_as<int>;"
950                     "  requires Bar<T> && Foo<T>;\n"
951                     "};");
952   ASSERT_EQ(Tokens.size(), 43u) << Tokens;
953   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
954   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
955   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
956   EXPECT_TOKEN(Tokens[29], tok::kw_requires,
957                TT_RequiresClauseInARequiresExpression);
958 
959   // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.
960   Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "
961                     "requires true; };");
962   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
963   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
964   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
965   EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);
966 }
967 
968 TEST_F(TokenAnnotatorTest, UnderstandsPragmaRegion) {
969   // Everything after #pragma region should be ImplicitStringLiteral
970   auto Tokens = annotate("#pragma region Foo(Bar: Hello)");
971   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
972   EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ImplicitStringLiteral);
973   EXPECT_TOKEN(Tokens[6], tok::colon, TT_ImplicitStringLiteral);
974   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ImplicitStringLiteral);
975 
976   // Make sure it's annotated correctly inside a function as well
977   Tokens = annotate("void test(){\n#pragma region Foo(Bar: Hello)\n}");
978   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
979   EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ImplicitStringLiteral);
980   EXPECT_TOKEN(Tokens[11], tok::colon, TT_ImplicitStringLiteral);
981   EXPECT_TOKEN(Tokens[12], tok::identifier, TT_ImplicitStringLiteral);
982 }
983 
984 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
985   const char *BaseCode = nullptr;
986   const char *ConstrainedCode = nullptr;
987   auto BaseTokenCount = 0u;
988   auto RequiresTokenCount = 0u;
989   auto PrefixTokenCount = 0u;
990 
991   auto TestRequires = [&](int Line) {
992     const auto BaseTokens = annotate(BaseCode);
993     const auto ConstrainedTokens = annotate(ConstrainedCode);
994 
995 #define LINE " (Line " << Line << ')'
996 
997     ASSERT_EQ(BaseTokens.size(), BaseTokenCount) << BaseTokens << LINE;
998     ASSERT_EQ(ConstrainedTokens.size(), BaseTokenCount + RequiresTokenCount)
999         << LINE;
1000 
1001     for (auto I = 0u; I < BaseTokenCount; ++I) {
1002       EXPECT_EQ(
1003           *BaseTokens[I],
1004           *ConstrainedTokens[I < PrefixTokenCount ? I : I + RequiresTokenCount])
1005           << I << LINE;
1006     }
1007 
1008 #undef LINE
1009   };
1010 
1011   BaseCode = "template<typename T>\n"
1012              "T Pi = 3.14;";
1013   ConstrainedCode = "template<typename T>\n"
1014                     "  requires Foo<T>\n"
1015                     "T Pi = 3.14;";
1016   BaseTokenCount = 11;
1017   RequiresTokenCount = 5;
1018   PrefixTokenCount = 5;
1019   TestRequires(__LINE__);
1020 
1021   BaseCode = "template<typename T>\n"
1022              "struct Bar;";
1023   ConstrainedCode = "template<typename T>\n"
1024                     "  requires Foo<T>\n"
1025                     "struct Bar;";
1026   BaseTokenCount = 9;
1027   TestRequires(__LINE__);
1028 
1029   BaseCode = "template<typename T>\n"
1030              "struct Bar {\n"
1031              "  T foo();\n"
1032              "  T bar();\n"
1033              "};";
1034   ConstrainedCode = "template<typename T>\n"
1035                     "  requires Foo<T>\n"
1036                     "struct Bar {\n"
1037                     "  T foo();\n"
1038                     "  T bar();\n"
1039                     "};";
1040   BaseTokenCount = 21;
1041   TestRequires(__LINE__);
1042 
1043   BaseCode = "template<typename T>\n"
1044              "Bar(T) -> Bar<T>;";
1045   ConstrainedCode = "template<typename T>\n"
1046                     "  requires Foo<T>\n"
1047                     "Bar(T) -> Bar<T>;";
1048   BaseTokenCount = 16;
1049   TestRequires(__LINE__);
1050 
1051   BaseCode = "template<typename T>\n"
1052              "T foo();";
1053   ConstrainedCode = "template<typename T>\n"
1054                     "  requires Foo<T>\n"
1055                     "T foo();";
1056   BaseTokenCount = 11;
1057   TestRequires(__LINE__);
1058 
1059   BaseCode = "template<typename T>\n"
1060              "T foo() {\n"
1061              "  auto bar = baz();\n"
1062              "  return bar + T{};\n"
1063              "}";
1064   ConstrainedCode = "template<typename T>\n"
1065                     "  requires Foo<T>\n"
1066                     "T foo() {\n"
1067                     "  auto bar = baz();\n"
1068                     "  return bar + T{};\n"
1069                     "}";
1070   BaseTokenCount = 26;
1071   TestRequires(__LINE__);
1072 
1073   BaseCode = "template<typename T>\n"
1074              "T foo();";
1075   ConstrainedCode = "template<typename T>\n"
1076                     "T foo() requires Foo<T>;";
1077   BaseTokenCount = 11;
1078   PrefixTokenCount = 9;
1079   TestRequires(__LINE__);
1080 
1081   BaseCode = "template<typename T>\n"
1082              "T foo() {\n"
1083              "  auto bar = baz();\n"
1084              "  return bar + T{};\n"
1085              "}";
1086   ConstrainedCode = "template<typename T>\n"
1087                     "T foo() requires Foo<T> {\n"
1088                     "  auto bar = baz();\n"
1089                     "  return bar + T{};\n"
1090                     "}";
1091   BaseTokenCount = 26;
1092   TestRequires(__LINE__);
1093 
1094   BaseCode = "template<typename T>\n"
1095              "T foo();";
1096   ConstrainedCode = "template<typename T>\n"
1097                     "  requires(Foo<T>)\n"
1098                     "T foo();";
1099   BaseTokenCount = 11;
1100   RequiresTokenCount = 7;
1101   PrefixTokenCount = 5;
1102   TestRequires(__LINE__);
1103 
1104   BaseCode = "template<typename T>\n"
1105              "Bar(T) -> Bar<typename T::I>;";
1106   ConstrainedCode = "template<typename T>\n"
1107                     "  requires requires(T &&t) {\n"
1108                     "             typename T::I;\n"
1109                     "           }\n"
1110                     "Bar(T) -> Bar<typename T::I>;";
1111   BaseTokenCount = 19;
1112   RequiresTokenCount = 14;
1113   PrefixTokenCount = 5;
1114   TestRequires(__LINE__);
1115 
1116   BaseCode = "struct [[nodiscard]] zero_t {\n"
1117              "  template<class T>\n"
1118              "  [[nodiscard]] constexpr operator T() const { return v<T>; }\n"
1119              "};";
1120   ConstrainedCode =
1121       "struct [[nodiscard]] zero_t {\n"
1122       "  template<class T>\n"
1123       "    requires requires { v<T>; }\n"
1124       "  [[nodiscard]] constexpr operator T() const { return v<T>; }\n"
1125       "};";
1126   BaseTokenCount = 35;
1127   RequiresTokenCount = 9;
1128   PrefixTokenCount = 13;
1129   TestRequires(__LINE__);
1130 
1131   BaseCode = "constexpr Foo(Foo const &other)\n"
1132              "    : value{other.value} {\n"
1133              "  do_magic();\n"
1134              "  do_more_magic();\n"
1135              "}";
1136   ConstrainedCode = "constexpr Foo(Foo const &other)\n"
1137                     "  requires std::is_copy_constructible<T>\n"
1138                     "    : value{other.value} {\n"
1139                     "  do_magic();\n"
1140                     "  do_more_magic();\n"
1141                     "}";
1142   BaseTokenCount = 26;
1143   RequiresTokenCount = 7;
1144   PrefixTokenCount = 8;
1145   TestRequires(__LINE__);
1146 
1147   BaseCode = "constexpr Foo(Foo const &other)\n"
1148              "    : value{other.value} {\n"
1149              "  do_magic();\n"
1150              "  do_more_magic();\n"
1151              "}";
1152   ConstrainedCode = "constexpr Foo(Foo const &other)\n"
1153                     "  requires (std::is_copy_constructible<T>)\n"
1154                     "    : value{other.value} {\n"
1155                     "  do_magic();\n"
1156                     "  do_more_magic();\n"
1157                     "}";
1158   RequiresTokenCount = 9;
1159   TestRequires(__LINE__);
1160 }
1161 
1162 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
1163   auto Tokens = annotate("__asm{\n"
1164                          "a:\n"
1165                          "};");
1166   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1167   EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1168   EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
1169   EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
1170 }
1171 
1172 TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
1173   auto Tokens = annotate("int (^)() = ^ ()\n"
1174                          "  external_source_symbol() { //\n"
1175                          "  return 1;\n"
1176                          "};");
1177   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
1178   EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);
1179   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);
1180 
1181   Tokens = annotate("int *p = ^int*(){ //\n"
1182                     "  return nullptr;\n"
1183                     "}();");
1184   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
1185   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);
1186 }
1187 
1188 TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
1189   auto Tokens = annotate("[]() constexpr {}");
1190   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
1191   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1192   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
1193 
1194   Tokens = annotate("[]() consteval {}");
1195   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
1196   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1197   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
1198 
1199   Tokens = annotate("[]() mutable {}");
1200   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
1201   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1202   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
1203 
1204   Tokens = annotate("[]() static {}");
1205   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
1206   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1207   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
1208 
1209   Tokens = annotate("[]() -> auto {}");
1210   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
1211   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1212   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
1213   EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
1214 
1215   Tokens = annotate("[]() -> auto & {}");
1216   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1217   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1218   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
1219   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
1220 
1221   Tokens = annotate("[]() -> auto * {}");
1222   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1223   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1224   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
1225   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
1226 
1227   Tokens = annotate("[] {}");
1228   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
1229   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1230   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_LambdaLBrace);
1231 
1232   Tokens = annotate("[] noexcept {}");
1233   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1234   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1235   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_LambdaLBrace);
1236 
1237   Tokens = annotate("[] -> auto {}");
1238   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1239   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1240   EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);
1241   EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_LambdaLBrace);
1242 
1243   Tokens = annotate("[] <typename T> () {}");
1244   ASSERT_EQ(Tokens.size(), 11u) << Tokens;
1245   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1246   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1247   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_LambdaLBrace);
1248 
1249   Tokens = annotate("[] <typename T> {}");
1250   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
1251   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1252   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1253   EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
1254 
1255   Tokens = annotate("[] <typename... T> () {}");
1256   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1257   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1258   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1259   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
1260 
1261   Tokens = annotate("[] <typename... T> {}");
1262   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1263   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1264   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1265   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
1266 
1267   Tokens = annotate("[] <int... T> () {}");
1268   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1269   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1270   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1271   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
1272 
1273   Tokens = annotate("[] <int... T> {}");
1274   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1275   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1276   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1277   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
1278 
1279   Tokens = annotate("[] <Foo... T> () {}");
1280   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1281   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1282   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1283   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
1284 
1285   Tokens = annotate("[] <Foo... T> {}");
1286   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1287   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1288   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1289   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
1290 
1291   // Lambdas with a requires-clause
1292   Tokens = annotate("[] <typename T> (T t) requires Bar<T> {}");
1293   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
1294   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1295   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1296   EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);
1297   EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);
1298   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);
1299 
1300   Tokens = annotate("[] <typename T> (T &&t) requires Bar<T> {}");
1301   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
1302   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1303   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1304   EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_PointerOrReference);
1305   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
1306   EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);
1307   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_LambdaLBrace);
1308 
1309   Tokens = annotate("[] <typename T> (T t) requires Foo<T> || Bar<T> {}");
1310   ASSERT_EQ(Tokens.size(), 23u) << Tokens;
1311   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1312   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1313   EXPECT_TOKEN(Tokens[10], tok::kw_requires, TT_RequiresClause);
1314   EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);
1315   EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
1316 
1317   Tokens = annotate("[] <typename T> (T t) -> T requires Bar<T> {}");
1318   ASSERT_EQ(Tokens.size(), 20u) << Tokens;
1319   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1320   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1321   EXPECT_TOKEN(Tokens[10], tok::arrow, TT_LambdaArrow);
1322   EXPECT_TOKEN(Tokens[12], tok::kw_requires, TT_RequiresClause);
1323   EXPECT_TRUE(Tokens[16]->ClosesRequiresClause);
1324   EXPECT_TOKEN(Tokens[17], tok::l_brace, TT_LambdaLBrace);
1325 
1326   Tokens = annotate("[] <typename T> requires Bar<T> (T t) {}");
1327   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
1328   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1329   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1330   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1331   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1332   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_LambdaLBrace);
1333 
1334   Tokens = annotate("[] <typename T> requires Bar<T> (T &&t) {}");
1335   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
1336   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1337   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1338   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1339   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1340   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_PointerOrReference);
1341   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_LambdaLBrace);
1342 
1343   Tokens = annotate("[] <typename T> requires Foo<T> || Bar<T> (T t) {}");
1344   ASSERT_EQ(Tokens.size(), 23u) << Tokens;
1345   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1346   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1347   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1348   EXPECT_TRUE(Tokens[15]->ClosesRequiresClause);
1349   EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
1350 
1351   Tokens = annotate("[] <typename T> requires true (T&& t) {}");
1352   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
1353   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1354   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1355   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1356   EXPECT_TRUE(Tokens[7]->ClosesRequiresClause);
1357   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
1358   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);
1359 
1360   Tokens = annotate("[] <typename T> requires Bar<T> {}");
1361   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
1362   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1363   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1364   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1365   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1366   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_LambdaLBrace);
1367 
1368   Tokens = annotate("[] <typename T> requires Bar<T> noexcept {}");
1369   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
1370   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1371   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1372   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1373   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1374   EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_LambdaLBrace);
1375 
1376   Tokens = annotate("[] <typename T> requires Bar<T> -> T {}");
1377   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
1378   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1379   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1380   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1381   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1382   EXPECT_TOKEN(Tokens[11], tok::arrow, TT_LambdaArrow);
1383   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_LambdaLBrace);
1384 
1385   Tokens = annotate("[] <typename T> requires Foo<T> (T t) requires Bar<T> {}");
1386   ASSERT_EQ(Tokens.size(), 23u) << Tokens;
1387   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
1388   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
1389   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
1390   EXPECT_TRUE(Tokens[10]->ClosesRequiresClause);
1391   EXPECT_TOKEN(Tokens[15], tok::kw_requires, TT_RequiresClause);
1392   EXPECT_TRUE(Tokens[19]->ClosesRequiresClause);
1393   EXPECT_TOKEN(Tokens[20], tok::l_brace, TT_LambdaLBrace);
1394 }
1395 
1396 TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {
1397   auto Tokens = annotate("template <typename T>\n"
1398                          "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
1399                          "string OldFunction(const string &parameter) {}");
1400   ASSERT_EQ(Tokens.size(), 20u) << Tokens;
1401   EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_FunctionAnnotationRParen);
1402 
1403   Tokens = annotate("template <typename T>\n"
1404                     "A(T) noexcept;");
1405   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1406   EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);
1407 }
1408 
1409 TEST_F(TokenAnnotatorTest, UnderstandsFunctionDeclarationNames) {
1410   auto Tokens = annotate("void f [[noreturn]] ();");
1411   ASSERT_EQ(Tokens.size(), 11u) << Tokens;
1412   EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);
1413 
1414   Tokens = annotate("void f [[noreturn]] () {}");
1415   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1416   EXPECT_TOKEN(Tokens[1], tok::identifier, TT_FunctionDeclarationName);
1417 }
1418 
1419 TEST_F(TokenAnnotatorTest, UnderstandsC11GenericSelection) {
1420   auto Tokens = annotate("_Generic(x, int: 1, default: 0)");
1421   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
1422   EXPECT_TOKEN(Tokens[0], tok::kw__Generic, TT_Unknown);
1423   EXPECT_TOKEN(Tokens[5], tok::colon, TT_GenericSelectionColon);
1424   EXPECT_TOKEN(Tokens[9], tok::colon, TT_GenericSelectionColon);
1425 }
1426 
1427 TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
1428   auto Annotate = [this](llvm::StringRef Code) {
1429     return annotate(Code, getLLVMStyle(FormatStyle::LK_Verilog));
1430   };
1431   // Test that unary operators get labeled as such and that operators like '++'
1432   // don't get split.
1433   tok::TokenKind Unary[] = {tok::plus,  tok::minus,    tok::exclaim,
1434                             tok::tilde, tok::amp,      tok::pipe,
1435                             tok::caret, tok::plusplus, tok::minusminus};
1436   for (auto Kind : Unary) {
1437     auto Tokens =
1438         Annotate(std::string("x = ") + tok::getPunctuatorSpelling(Kind) + "x;");
1439     ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1440     EXPECT_TOKEN(Tokens[2], Kind, TT_UnaryOperator);
1441   }
1442   // Operators formed by joining two operators like '^~'. For some of these
1443   // joined operators, we don't have a separate type, so we only test for their
1444   // precedence.
1445   std::pair<prec::Level, std::string> JoinedBinary[] = {
1446       {prec::Comma, "<->"},       {prec::Assignment, "+="},
1447       {prec::Assignment, "-="},   {prec::Assignment, "*="},
1448       {prec::Assignment, "/="},   {prec::Assignment, "%="},
1449       {prec::Assignment, "&="},   {prec::Assignment, "^="},
1450       {prec::Assignment, "<<="},  {prec::Assignment, ">>="},
1451       {prec::Assignment, "<<<="}, {prec::Assignment, ">>>="},
1452       {prec::LogicalOr, "||"},    {prec::LogicalAnd, "&&"},
1453       {prec::Equality, "=="},     {prec::Equality, "!="},
1454       {prec::Equality, "==="},    {prec::Equality, "!=="},
1455       {prec::Equality, "==?"},    {prec::Equality, "!=?"},
1456       {prec::ExclusiveOr, "~^"},  {prec::ExclusiveOr, "^~"},
1457   };
1458   for (auto Operator : JoinedBinary) {
1459     auto Tokens = Annotate(std::string("x = x ") + Operator.second + " x;");
1460     ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1461     EXPECT_TOKEN_TYPE(Tokens[3], TT_BinaryOperator);
1462     EXPECT_TOKEN_PRECEDENCE(Tokens[3], Operator.first);
1463   }
1464   // '~^' and '^~' can be unary as well as binary operators.
1465   auto Tokens = Annotate("x = ~^x;");
1466   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1467   EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);
1468   Tokens = Annotate("x = ^~x;");
1469   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1470   EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);
1471   // The unary operators '~&' and '~|' can only be unary operators. The current
1472   // implementation treats each of them as separate unary '~' and '&' or '|'
1473   // operators, which is enough for formatting purposes. In FormatTestVerilog,
1474   // there is a test that there is no space in between. And even if a new line
1475   // is inserted between the '~' and '|', the semantic meaning is the same as
1476   // the joined operator, so the CanBreakBefore property doesn't need to be
1477   // false for the second operator.
1478   Tokens = Annotate("x = ~&x;");
1479   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1480   EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);
1481   EXPECT_TOKEN(Tokens[3], tok::amp, TT_UnaryOperator);
1482   Tokens = Annotate("x = ~|x;");
1483   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1484   EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);
1485   EXPECT_TOKEN(Tokens[3], tok::pipe, TT_UnaryOperator);
1486   // Test for block label colons.
1487   Tokens = Annotate("begin : x\n"
1488                     "end : x");
1489   ASSERT_EQ(Tokens.size(), 7u);
1490   EXPECT_TOKEN(Tokens[1], tok::colon, TT_VerilogBlockLabelColon);
1491   EXPECT_TOKEN(Tokens[4], tok::colon, TT_VerilogBlockLabelColon);
1492   // Test that the dimension colon is annotated correctly.
1493   Tokens = Annotate("var [1 : 0] x;");
1494   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
1495   EXPECT_TOKEN(Tokens[3], tok::colon, TT_BitFieldColon);
1496   Tokens = Annotate("extern function [1 : 0] x;");
1497   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1498   EXPECT_TOKEN(Tokens[4], tok::colon, TT_BitFieldColon);
1499   // Test case labels and ternary operators.
1500   Tokens = Annotate("case (x)\n"
1501                     "  x:\n"
1502                     "    x;\n"
1503                     "endcase\n");
1504   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1505   EXPECT_TOKEN(Tokens[5], tok::colon, TT_GotoLabelColon);
1506   Tokens = Annotate("case (x)\n"
1507                     "  x ? x : x:\n"
1508                     "    x;\n"
1509                     "endcase\n");
1510   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
1511   EXPECT_TOKEN(Tokens[5], tok::question, TT_ConditionalExpr);
1512   EXPECT_TOKEN(Tokens[7], tok::colon, TT_ConditionalExpr);
1513   EXPECT_TOKEN(Tokens[9], tok::colon, TT_GotoLabelColon);
1514   // Non-blocking assignments.
1515   Tokens = Annotate("a <= b;");
1516   ASSERT_EQ(Tokens.size(), 5u);
1517   EXPECT_TOKEN(Tokens[1], tok::lessequal, TT_BinaryOperator);
1518   EXPECT_TOKEN_PRECEDENCE(Tokens[1], prec::Assignment);
1519   Tokens = Annotate("if (a <= b) break;");
1520   ASSERT_EQ(Tokens.size(), 9u);
1521   EXPECT_TOKEN(Tokens[3], tok::lessequal, TT_BinaryOperator);
1522   EXPECT_TOKEN_PRECEDENCE(Tokens[3], prec::Relational);
1523   Tokens = Annotate("a <= b <= a;");
1524   ASSERT_EQ(Tokens.size(), 7u);
1525   EXPECT_TOKEN(Tokens[1], tok::lessequal, TT_BinaryOperator);
1526   EXPECT_TOKEN_PRECEDENCE(Tokens[1], prec::Assignment);
1527   EXPECT_TOKEN(Tokens[3], tok::lessequal, TT_BinaryOperator);
1528   EXPECT_TOKEN_PRECEDENCE(Tokens[3], prec::Relational);
1529 }
1530 
1531 TEST_F(TokenAnnotatorTest, UnderstandConstructors) {
1532   auto Tokens = annotate("Class::Class() : BaseClass(), Member() {}");
1533 
1534   // The TT_Unknown is clearly not binding for the future, please adapt if those
1535   // tokens get annotated.
1536   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
1537   EXPECT_TOKEN(Tokens[5], tok::colon, TT_CtorInitializerColon);
1538   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
1539   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_Unknown);
1540   EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);
1541   EXPECT_TOKEN(Tokens[9], tok::comma, TT_CtorInitializerComma);
1542   EXPECT_TOKEN(Tokens[10], tok::identifier, TT_Unknown);
1543   EXPECT_TOKEN(Tokens[11], tok::l_paren, TT_Unknown);
1544   EXPECT_TOKEN(Tokens[12], tok::r_paren, TT_Unknown);
1545   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);
1546 
1547   Tokens = annotate("Class::Class() : BaseClass{}, Member{} {}");
1548   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
1549   EXPECT_TOKEN(Tokens[5], tok::colon, TT_CtorInitializerColon);
1550   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
1551   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_Unknown);
1552   EXPECT_TOKEN(Tokens[8], tok::r_brace, TT_Unknown);
1553   EXPECT_TOKEN(Tokens[9], tok::comma, TT_CtorInitializerComma);
1554   EXPECT_TOKEN(Tokens[10], tok::identifier, TT_Unknown);
1555   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_Unknown);
1556   EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_Unknown);
1557   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_FunctionLBrace);
1558 }
1559 
1560 } // namespace
1561 } // namespace format
1562 } // namespace clang
1563