xref: /llvm-project/clang/unittests/Format/TokenAnnotatorTest.cpp (revision fd1d93db71066bedc11944bd32f3540b8084b060)
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 
150 TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {
151   auto Tokens = annotate("x - 0");
152   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
153   EXPECT_TOKEN(Tokens[1], tok::minus, TT_BinaryOperator);
154   Tokens = annotate("0 + 0");
155   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
156   EXPECT_TOKEN(Tokens[1], tok::plus, TT_BinaryOperator);
157   Tokens = annotate("x + +0");
158   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
159   EXPECT_TOKEN(Tokens[2], tok::plus, TT_UnaryOperator);
160   Tokens = annotate("x ? -0 : +0");
161   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
162   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
163   EXPECT_TOKEN(Tokens[5], tok::plus, TT_UnaryOperator);
164   Tokens = annotate("(-0)");
165   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
166   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
167   Tokens = annotate("0, -0");
168   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
169   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
170   Tokens = annotate("for (; -1;) {\n}");
171   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
172   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
173   Tokens = annotate("x = -1;");
174   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
175   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
176   Tokens = annotate("x[-1]");
177   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
178   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
179   Tokens = annotate("x = {-1};");
180   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
181   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
182   Tokens = annotate("case -x:");
183   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
184   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
185   Tokens = annotate("co_await -x;");
186   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
187   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
188   Tokens = annotate("co_return -x;");
189   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
190   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
191   Tokens = annotate("co_yield -x;");
192   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
193   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
194   Tokens = annotate("delete -x;");
195   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
196   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
197   Tokens = annotate("return -x;");
198   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
199   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
200   Tokens = annotate("throw -x;");
201   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
202   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
203   Tokens = annotate("sizeof -x");
204   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
205   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
206   Tokens = annotate("co_await +x;");
207   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
208   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
209   Tokens = annotate("co_return +x;");
210   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
211   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
212   Tokens = annotate("co_yield +x;");
213   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
214   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
215   Tokens = annotate("delete +x;");
216   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
217   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
218   Tokens = annotate("return +x;");
219   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
220   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
221   Tokens = annotate("throw +x;");
222   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
223   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
224   Tokens = annotate("sizeof +x");
225   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
226   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
227   Tokens = annotate("(int)-x");
228   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
229   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
230   Tokens = annotate("(-x)");
231   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
232   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
233   Tokens = annotate("!+x");
234   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
235   EXPECT_TOKEN(Tokens[0], tok::exclaim, TT_UnaryOperator);
236   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
237 }
238 
239 TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
240   auto Tokens = annotate("class C {};");
241   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
242   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
243 
244   Tokens = annotate("const class C {} c;");
245   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
246   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);
247 
248   Tokens = annotate("const class {} c;");
249   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
250   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
251 }
252 
253 TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
254   auto Tokens = annotate("struct S {};");
255   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
256   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
257 }
258 
259 TEST_F(TokenAnnotatorTest, UnderstandsUnions) {
260   auto Tokens = annotate("union U {};");
261   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
262   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
263 
264   Tokens = annotate("union U { void f() { return; } };");
265   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
266   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
267   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);
268 }
269 
270 TEST_F(TokenAnnotatorTest, UnderstandsEnums) {
271   auto Tokens = annotate("enum E {};");
272   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
273   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_EnumLBrace);
274 }
275 
276 TEST_F(TokenAnnotatorTest, UnderstandsDefaultedAndDeletedFunctions) {
277   auto Tokens = annotate("auto operator<=>(const T &) const & = default;");
278   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
279   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
280 
281   Tokens = annotate("template <typename T> void F(T) && = delete;");
282   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
283   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
284 }
285 
286 TEST_F(TokenAnnotatorTest, UnderstandsVariables) {
287   auto Tokens =
288       annotate("inline bool var = is_integral_v<int> && is_signed_v<int>;");
289   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
290   EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_BinaryOperator);
291 }
292 
293 TEST_F(TokenAnnotatorTest, UnderstandsVariableTemplates) {
294   auto Tokens =
295       annotate("template <typename T> "
296                "inline bool var = is_integral_v<int> && is_signed_v<int>;");
297   EXPECT_EQ(Tokens.size(), 20u) << Tokens;
298   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
299 }
300 
301 TEST_F(TokenAnnotatorTest, UnderstandsTemplatesInMacros) {
302   auto Tokens =
303       annotate("#define FOO(typeName) \\\n"
304                "  { #typeName, foo<FooType>(new foo<realClass>(#typeName)) }");
305   ASSERT_EQ(Tokens.size(), 27u) << Tokens;
306   EXPECT_TOKEN(Tokens[11], tok::less, TT_TemplateOpener);
307   EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
308   EXPECT_TOKEN(Tokens[17], tok::less, TT_TemplateOpener);
309   EXPECT_TOKEN(Tokens[19], tok::greater, TT_TemplateCloser);
310 }
311 
312 TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
313   FormatStyle Style = getLLVMStyle();
314   Style.WhitespaceSensitiveMacros.push_back("FOO");
315 
316   auto Tokens = annotate("FOO(1+2 )\n", Style);
317   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
318   EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);
319 
320   Tokens = annotate("FOO(a:b:c)\n", Style);
321   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
322   EXPECT_TOKEN(Tokens[0], tok::identifier, TT_UntouchableMacroFunc);
323 }
324 
325 TEST_F(TokenAnnotatorTest, UnderstandsDelete) {
326   auto Tokens = annotate("delete (void *)p;");
327   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
328   EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);
329 
330   Tokens = annotate("delete[] (void *)p;");
331   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
332   EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);
333 
334   Tokens = annotate("delete[] /*comment*/ (void *)p;");
335   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
336   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
337 
338   Tokens = annotate("delete[/*comment*/] (void *)p;");
339   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
340   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
341 
342   Tokens = annotate("delete/*comment*/[] (void *)p;");
343   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
344   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
345 }
346 
347 TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
348   auto Tokens = annotate("(void)p;");
349   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
350   EXPECT_TOKEN(Tokens[2], tok::r_paren, TT_CastRParen);
351 
352   Tokens = annotate("auto x = (Foo)p;");
353   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
354   EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_CastRParen);
355 
356   Tokens = annotate("(std::vector<int>)p;");
357   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
358   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
359 
360   Tokens = annotate("return (Foo)p;");
361   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
362   EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);
363 
364   Tokens = annotate("throw (Foo)p;");
365   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
366   EXPECT_TOKEN(Tokens[3], tok::r_paren, TT_CastRParen);
367 }
368 
369 TEST_F(TokenAnnotatorTest, UnderstandsDynamicExceptionSpecifier) {
370   auto Tokens = annotate("void f() throw(int);");
371   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
372   EXPECT_TOKEN(Tokens[4], tok::kw_throw, TT_Unknown);
373 }
374 
375 TEST_F(TokenAnnotatorTest, UnderstandsFunctionRefQualifiers) {
376   auto Tokens = annotate("void f() &;");
377   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
378   EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);
379 
380   Tokens = annotate("void operator=(T) &&;");
381   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
382   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);
383 
384   Tokens = annotate("template <typename T> void f() &;");
385   EXPECT_EQ(Tokens.size(), 12u) << Tokens;
386   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
387 
388   Tokens = annotate("template <typename T> void operator=(T) &;");
389   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
390   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
391 }
392 
393 TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
394   auto Tokens = annotate("template <typename T>\n"
395                          "concept C = (Foo && Bar) && (Bar && Baz);");
396 
397   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
398   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
399   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
400   EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);
401 
402   Tokens = annotate("template <typename T>\n"
403                     "concept C = Foo && !Bar;");
404 
405   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
406   EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_BinaryOperator);
407   EXPECT_TOKEN(Tokens[10], tok::exclaim, TT_UnaryOperator);
408 
409   Tokens = annotate("template <typename T>\n"
410                     "concept C = requires(T t) {\n"
411                     "  { t.foo() };\n"
412                     "} && Bar<T> && Baz<T>;");
413   ASSERT_EQ(Tokens.size(), 35u) << Tokens;
414   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
415   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
416   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
417   EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);
418   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
419 
420   Tokens = annotate("template<typename T>\n"
421                     "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"
422                     "struct Foo;");
423   ASSERT_EQ(Tokens.size(), 36u) << Tokens;
424   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
425   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
426   EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);
427   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
428   EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);
429   EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);
430   EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);
431   EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);
432   EXPECT_EQ(Tokens[31]->FakeRParens, 1u);
433   EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);
434 
435   Tokens =
436       annotate("template<typename T>\n"
437                "requires (C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"
438                "struct Foo;");
439   ASSERT_EQ(Tokens.size(), 38u) << Tokens;
440   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
441   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
442   EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);
443   EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);
444   EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);
445   EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);
446   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
447   EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);
448   EXPECT_EQ(Tokens[32]->FakeRParens, 1u);
449   EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);
450   EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);
451 
452   Tokens = annotate("template <typename T>\n"
453                     "void foo(T) noexcept requires Bar<T>;");
454   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
455   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
456 
457   Tokens = annotate("template <typename T>\n"
458                     "requires Bar<T> || Baz<T>\n"
459                     "auto foo(T) -> int;");
460   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
461   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
462   EXPECT_EQ(Tokens[11]->FakeLParens.size(), 0u);
463   EXPECT_TRUE(Tokens[14]->ClosesRequiresClause);
464   EXPECT_TOKEN(Tokens[20], tok::arrow, TT_TrailingReturnArrow);
465 
466   Tokens = annotate("template <typename T>\n"
467                     "requires Bar<T>\n"
468                     "bool foo(T) { return false; }");
469   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
470   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
471   EXPECT_TRUE(Tokens[9]->ClosesRequiresClause);
472   EXPECT_TOKEN(Tokens[11], tok::identifier, TT_FunctionDeclarationName);
473 
474   Tokens = annotate("template <typename T>\n"
475                     "struct S {\n"
476                     "  void foo() const requires Bar<T>;\n"
477                     "  void bar() const & requires Baz<T>;\n"
478                     "  void bar() && requires Baz2<T>;\n"
479                     "  void baz() const & noexcept requires Baz<T>;\n"
480                     "  void baz() && noexcept requires Baz2<T>;\n"
481                     "};\n"
482                     "\n"
483                     "void S::bar() const & requires Baz<T> { }");
484   ASSERT_EQ(Tokens.size(), 85u) << Tokens;
485   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
486   EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);
487   EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);
488   EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);
489   EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);
490   EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);
491 
492   Tokens = annotate("void Class::member() && requires(Constant) {}");
493   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
494   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
495 
496   Tokens = annotate("void Class::member() && requires(Constant<T>) {}");
497   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
498   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
499 
500   Tokens =
501       annotate("void Class::member() && requires(Namespace::Constant<T>) {}");
502   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
503   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
504 
505   Tokens = annotate("void Class::member() && requires(typename "
506                     "Namespace::Outer<T>::Inner::Constant) {}");
507   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
508   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
509 
510   Tokens = annotate("struct [[nodiscard]] zero_t {\n"
511                     "  template<class T>\n"
512                     "    requires requires { number_zero_v<T>; }\n"
513                     "  [[nodiscard]] constexpr operator T() const { "
514                     "return number_zero_v<T>; }\n"
515                     "};");
516   ASSERT_EQ(Tokens.size(), 44u);
517   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
518   EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);
519   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);
520   EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);
521   EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);
522   EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);
523 
524   Tokens =
525       annotate("template <class A, class B> concept C ="
526                "std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;");
527   ASSERT_EQ(Tokens.size(), 31u) << Tokens;
528   EXPECT_TOKEN(Tokens[8], tok::kw_concept, TT_Unknown);
529   EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener);
530   EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener);
531   EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser);
532   EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener);
533   EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser);
534   EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser);
535 
536   Tokens = annotate("auto bar() -> int requires(is_integral_v<T>) {}");
537   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
538   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
539 
540   Tokens = annotate("auto bar() -> void requires(is_integral_v<T>) {}");
541   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
542   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
543 
544   Tokens = annotate("auto bar() -> MyType requires(is_integral_v<T>) {}");
545   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
546   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
547 
548   Tokens =
549       annotate("auto bar() -> SOME_MACRO_TYPE requires(is_integral_v<T>) {}");
550   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
551   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
552 
553   Tokens =
554       annotate("auto bar() -> qualified::type requires(is_integral_v<T>) {}");
555   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
556   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);
557 
558   Tokens =
559       annotate("auto bar() -> Template<type> requires(is_integral_v<T>) {}");
560   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
561   EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause);
562 }
563 
564 TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
565   auto Tokens = annotate("bool b = requires(int i) { i + 5; };");
566   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
567   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
568   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
569   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
570 
571   Tokens = annotate("if (requires(int i) { i + 5; }) return;");
572   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
573   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
574   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
575   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);
576 
577   Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");
578   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
579   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);
580   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);
581   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);
582 
583   Tokens = annotate("foo(requires(const T t) {});");
584   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
585   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
586   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
587   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
588 
589   Tokens = annotate("foo(requires(const int t) {});");
590   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
591   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
592   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
593   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
594 
595   Tokens = annotate("foo(requires(const T t) {});");
596   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
597   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
598   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
599   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
600 
601   Tokens = annotate("foo(requires(int const* volatile t) {});");
602   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
603   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
604   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
605   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
606 
607   Tokens = annotate("foo(requires(T const* volatile t) {});");
608   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
609   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
610   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
611   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
612 
613   Tokens =
614       annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");
615   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
616   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
617   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
618   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);
619 
620   Tokens = annotate("template <typename T>\n"
621                     "concept C = requires(T T) {\n"
622                     "  requires Bar<T> && Foo<T>;\n"
623                     "};");
624   ASSERT_EQ(Tokens.size(), 28u) << Tokens;
625   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
626   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
627   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
628   EXPECT_TOKEN(Tokens[14], tok::kw_requires,
629                TT_RequiresClauseInARequiresExpression);
630 
631   Tokens = annotate("template <typename T>\n"
632                     "concept C = requires(T T) {\n"
633                     "  { t.func() } -> std::same_as<int>;"
634                     "  requires Bar<T> && Foo<T>;\n"
635                     "};");
636   ASSERT_EQ(Tokens.size(), 43u) << Tokens;
637   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
638   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
639   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
640   EXPECT_TOKEN(Tokens[29], tok::kw_requires,
641                TT_RequiresClauseInARequiresExpression);
642 
643   // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.
644   Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "
645                     "requires true; };");
646   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
647   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
648   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
649   EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);
650 }
651 
652 TEST_F(TokenAnnotatorTest, UnderstandsPragmaRegion) {
653   // Everything after #pragma region should be ImplicitStringLiteral
654   auto Tokens = annotate("#pragma region Foo(Bar: Hello)");
655   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
656   EXPECT_TOKEN(Tokens[5], tok::identifier, TT_ImplicitStringLiteral);
657   EXPECT_TOKEN(Tokens[6], tok::colon, TT_ImplicitStringLiteral);
658   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_ImplicitStringLiteral);
659 
660   // Make sure it's annotated correctly inside a function as well
661   Tokens = annotate("void test(){\n#pragma region Foo(Bar: Hello)\n}");
662   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
663   EXPECT_TOKEN(Tokens[10], tok::identifier, TT_ImplicitStringLiteral);
664   EXPECT_TOKEN(Tokens[11], tok::colon, TT_ImplicitStringLiteral);
665   EXPECT_TOKEN(Tokens[12], tok::identifier, TT_ImplicitStringLiteral);
666 }
667 
668 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
669   const char *BaseCode = nullptr;
670   const char *ConstrainedCode = nullptr;
671   auto BaseTokenCount = 0u;
672   auto RequiresTokenCount = 0u;
673   auto PrefixTokenCount = 0u;
674 
675   auto TestRequires = [&](int Line) {
676     const auto BaseTokens = annotate(BaseCode);
677     const auto ConstrainedTokens = annotate(ConstrainedCode);
678 
679 #define LINE " (Line " << Line << ')'
680 
681     ASSERT_EQ(BaseTokens.size(), BaseTokenCount) << BaseTokens << LINE;
682     ASSERT_EQ(ConstrainedTokens.size(), BaseTokenCount + RequiresTokenCount)
683         << LINE;
684 
685     for (auto I = 0u; I < BaseTokenCount; ++I) {
686       EXPECT_EQ(
687           *BaseTokens[I],
688           *ConstrainedTokens[I < PrefixTokenCount ? I : I + RequiresTokenCount])
689           << I << LINE;
690     }
691 
692 #undef LINE
693   };
694 
695   BaseCode = "template<typename T>\n"
696              "T Pi = 3.14;";
697   ConstrainedCode = "template<typename T>\n"
698                     "  requires Foo<T>\n"
699                     "T Pi = 3.14;";
700   BaseTokenCount = 11;
701   RequiresTokenCount = 5;
702   PrefixTokenCount = 5;
703   TestRequires(__LINE__);
704 
705   BaseCode = "template<typename T>\n"
706              "struct Bar;";
707   ConstrainedCode = "template<typename T>\n"
708                     "  requires Foo<T>\n"
709                     "struct Bar;";
710   BaseTokenCount = 9;
711   TestRequires(__LINE__);
712 
713   BaseCode = "template<typename T>\n"
714              "struct Bar {\n"
715              "  T foo();\n"
716              "  T bar();\n"
717              "};";
718   ConstrainedCode = "template<typename T>\n"
719                     "  requires Foo<T>\n"
720                     "struct Bar {\n"
721                     "  T foo();\n"
722                     "  T bar();\n"
723                     "};";
724   BaseTokenCount = 21;
725   TestRequires(__LINE__);
726 
727   BaseCode = "template<typename T>\n"
728              "Bar(T) -> Bar<T>;";
729   ConstrainedCode = "template<typename T>\n"
730                     "  requires Foo<T>\n"
731                     "Bar(T) -> Bar<T>;";
732   BaseTokenCount = 16;
733   TestRequires(__LINE__);
734 
735   BaseCode = "template<typename T>\n"
736              "T foo();";
737   ConstrainedCode = "template<typename T>\n"
738                     "  requires Foo<T>\n"
739                     "T foo();";
740   BaseTokenCount = 11;
741   TestRequires(__LINE__);
742 
743   BaseCode = "template<typename T>\n"
744              "T foo() {\n"
745              "  auto bar = baz();\n"
746              "  return bar + T{};\n"
747              "}";
748   ConstrainedCode = "template<typename T>\n"
749                     "  requires Foo<T>\n"
750                     "T foo() {\n"
751                     "  auto bar = baz();\n"
752                     "  return bar + T{};\n"
753                     "}";
754   BaseTokenCount = 26;
755   TestRequires(__LINE__);
756 
757   BaseCode = "template<typename T>\n"
758              "T foo();";
759   ConstrainedCode = "template<typename T>\n"
760                     "T foo() requires Foo<T>;";
761   BaseTokenCount = 11;
762   PrefixTokenCount = 9;
763   TestRequires(__LINE__);
764 
765   BaseCode = "template<typename T>\n"
766              "T foo() {\n"
767              "  auto bar = baz();\n"
768              "  return bar + T{};\n"
769              "}";
770   ConstrainedCode = "template<typename T>\n"
771                     "T foo() requires Foo<T> {\n"
772                     "  auto bar = baz();\n"
773                     "  return bar + T{};\n"
774                     "}";
775   BaseTokenCount = 26;
776   TestRequires(__LINE__);
777 
778   BaseCode = "template<typename T>\n"
779              "T foo();";
780   ConstrainedCode = "template<typename T>\n"
781                     "  requires(Foo<T>)\n"
782                     "T foo();";
783   BaseTokenCount = 11;
784   RequiresTokenCount = 7;
785   PrefixTokenCount = 5;
786   TestRequires(__LINE__);
787 
788   BaseCode = "template<typename T>\n"
789              "Bar(T) -> Bar<typename T::I>;";
790   ConstrainedCode = "template<typename T>\n"
791                     "  requires requires(T &&t) {\n"
792                     "             typename T::I;\n"
793                     "           }\n"
794                     "Bar(T) -> Bar<typename T::I>;";
795   BaseTokenCount = 19;
796   RequiresTokenCount = 14;
797   PrefixTokenCount = 5;
798   TestRequires(__LINE__);
799 
800   BaseCode = "struct [[nodiscard]] zero_t {\n"
801              "  template<class T>\n"
802              "  [[nodiscard]] constexpr operator T() const { return v<T>; }\n"
803              "};";
804   ConstrainedCode =
805       "struct [[nodiscard]] zero_t {\n"
806       "  template<class T>\n"
807       "    requires requires { v<T>; }\n"
808       "  [[nodiscard]] constexpr operator T() const { return v<T>; }\n"
809       "};";
810   BaseTokenCount = 35;
811   RequiresTokenCount = 9;
812   PrefixTokenCount = 13;
813   TestRequires(__LINE__);
814 
815   BaseCode = "constexpr Foo(Foo const &other)\n"
816              "    : value{other.value} {\n"
817              "  do_magic();\n"
818              "  do_more_magic();\n"
819              "}";
820   ConstrainedCode = "constexpr Foo(Foo const &other)\n"
821                     "  requires std::is_copy_constructible<T>\n"
822                     "    : value{other.value} {\n"
823                     "  do_magic();\n"
824                     "  do_more_magic();\n"
825                     "}";
826   BaseTokenCount = 26;
827   RequiresTokenCount = 7;
828   PrefixTokenCount = 8;
829   TestRequires(__LINE__);
830 
831   BaseCode = "constexpr Foo(Foo const &other)\n"
832              "    : value{other.value} {\n"
833              "  do_magic();\n"
834              "  do_more_magic();\n"
835              "}";
836   ConstrainedCode = "constexpr Foo(Foo const &other)\n"
837                     "  requires (std::is_copy_constructible<T>)\n"
838                     "    : value{other.value} {\n"
839                     "  do_magic();\n"
840                     "  do_more_magic();\n"
841                     "}";
842   RequiresTokenCount = 9;
843   TestRequires(__LINE__);
844 }
845 
846 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
847   auto Tokens = annotate("__asm{\n"
848                          "a:\n"
849                          "};");
850   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
851   EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
852   EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
853   EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
854 }
855 
856 TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
857   auto Tokens = annotate("int (^)() = ^ ()\n"
858                          "  external_source_symbol() { //\n"
859                          "  return 1;\n"
860                          "};");
861   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
862   EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);
863   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);
864 
865   Tokens = annotate("int *p = ^int*(){ //\n"
866                     "  return nullptr;\n"
867                     "}();");
868   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
869   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);
870 }
871 
872 TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
873   auto Tokens = annotate("[]() constexpr {}");
874   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
875   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
876   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
877 
878   Tokens = annotate("[]() consteval {}");
879   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
880   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
881   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
882 
883   Tokens = annotate("[]() mutable {}");
884   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
885   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
886   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
887 
888   Tokens = annotate("[]() static {}");
889   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
890   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
891   EXPECT_TOKEN(Tokens[5], tok::l_brace, TT_LambdaLBrace);
892 
893   Tokens = annotate("[]() -> auto {}");
894   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
895   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
896   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
897   EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
898 
899   Tokens = annotate("[]() -> auto & {}");
900   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
901   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
902   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
903   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
904 
905   Tokens = annotate("[]() -> auto * {}");
906   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
907   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
908   EXPECT_TOKEN(Tokens[4], tok::arrow, TT_LambdaArrow);
909   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
910 
911   Tokens = annotate("[] {}");
912   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
913   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
914   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_LambdaLBrace);
915 
916   Tokens = annotate("[] noexcept {}");
917   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
918   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
919   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_LambdaLBrace);
920 
921   Tokens = annotate("[] -> auto {}");
922   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
923   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
924   EXPECT_TOKEN(Tokens[2], tok::arrow, TT_LambdaArrow);
925   EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_LambdaLBrace);
926 
927   Tokens = annotate("[] <typename T> () {}");
928   ASSERT_EQ(Tokens.size(), 11u) << Tokens;
929   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
930   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
931   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_LambdaLBrace);
932 
933   Tokens = annotate("[] <typename T> {}");
934   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
935   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
936   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
937   EXPECT_TOKEN(Tokens[6], tok::l_brace, TT_LambdaLBrace);
938 
939   Tokens = annotate("[] <typename... T> () {}");
940   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
941   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
942   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
943   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
944 
945   Tokens = annotate("[] <typename... T> {}");
946   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
947   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
948   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
949   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
950 
951   Tokens = annotate("[] <int... T> () {}");
952   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
953   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
954   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
955   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
956 
957   Tokens = annotate("[] <int... T> {}");
958   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
959   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
960   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
961   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
962 
963   Tokens = annotate("[] <Foo... T> () {}");
964   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
965   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
966   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
967   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_LambdaLBrace);
968 
969   Tokens = annotate("[] <Foo... T> {}");
970   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
971   EXPECT_TOKEN(Tokens[0], tok::l_square, TT_LambdaLSquare);
972   EXPECT_TOKEN(Tokens[2], tok::less, TT_TemplateOpener);
973   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_LambdaLBrace);
974 }
975 
976 TEST_F(TokenAnnotatorTest, UnderstandsFunctionAnnotations) {
977   auto Tokens = annotate("template <typename T>\n"
978                          "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
979                          "string OldFunction(const string &parameter) {}");
980   ASSERT_EQ(Tokens.size(), 20u) << Tokens;
981   EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_FunctionAnnotationRParen);
982 
983   Tokens = annotate("template <typename T>\n"
984                     "A(T) noexcept;");
985   ASSERT_EQ(Tokens.size(), 12u) << Tokens;
986   EXPECT_TOKEN(Tokens[8], tok::r_paren, TT_Unknown);
987 }
988 
989 TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {
990   auto Annotate = [this](llvm::StringRef Code) {
991     return annotate(Code, getLLVMStyle(FormatStyle::LK_Verilog));
992   };
993   // Test that unary operators get labeled as such and that operators like '++'
994   // don't get split.
995   tok::TokenKind Unary[] = {tok::plus,  tok::minus,    tok::exclaim,
996                             tok::tilde, tok::amp,      tok::pipe,
997                             tok::caret, tok::plusplus, tok::minusminus};
998   for (auto Kind : Unary) {
999     auto Tokens =
1000         Annotate(std::string("x = ") + tok::getPunctuatorSpelling(Kind) + "x;");
1001     ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1002     EXPECT_TOKEN(Tokens[2], Kind, TT_UnaryOperator);
1003   }
1004   // Operators formed by joining two operators like '^~'. For some of these
1005   // joined operators, we don't have a separate type, so we only test for their
1006   // precedence.
1007   std::pair<prec::Level, std::string> JoinedBinary[] = {
1008       {prec::Comma, "<->"},       {prec::Assignment, "+="},
1009       {prec::Assignment, "-="},   {prec::Assignment, "*="},
1010       {prec::Assignment, "/="},   {prec::Assignment, "%="},
1011       {prec::Assignment, "&="},   {prec::Assignment, "^="},
1012       {prec::Assignment, "<<="},  {prec::Assignment, ">>="},
1013       {prec::Assignment, "<<<="}, {prec::Assignment, ">>>="},
1014       {prec::LogicalOr, "||"},    {prec::LogicalAnd, "&&"},
1015       {prec::Equality, "=="},     {prec::Equality, "!="},
1016       {prec::Equality, "==="},    {prec::Equality, "!=="},
1017       {prec::Equality, "==?"},    {prec::Equality, "!=?"},
1018       {prec::ExclusiveOr, "~^"},  {prec::ExclusiveOr, "^~"},
1019   };
1020   for (auto Operator : JoinedBinary) {
1021     auto Tokens = Annotate(std::string("x = x ") + Operator.second + " x;");
1022     ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1023     EXPECT_TOKEN_TYPE(Tokens[3], TT_BinaryOperator);
1024     EXPECT_TOKEN_PRECEDENCE(Tokens[3], Operator.first);
1025   }
1026   // '~^' and '^~' can be unary as well as binary operators.
1027   auto Tokens = Annotate("x = ~^x;");
1028   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1029   EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);
1030   Tokens = Annotate("x = ^~x;");
1031   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
1032   EXPECT_TOKEN_TYPE(Tokens[2], TT_UnaryOperator);
1033   // The unary operators '~&' and '~|' can only be unary operators. The current
1034   // implementation treats each of them as separate unary '~' and '&' or '|'
1035   // operators, which is enough for formatting purposes. In FormatTestVerilog,
1036   // there is a test that there is no space in between. And even if a new line
1037   // is inserted between the '~' and '|', the semantic meaning is the same as
1038   // the joined operator, so the CanBreakBefore property doesn't need to be
1039   // false for the second operator.
1040   Tokens = Annotate("x = ~&x;");
1041   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1042   EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);
1043   EXPECT_TOKEN(Tokens[3], tok::amp, TT_UnaryOperator);
1044   Tokens = Annotate("x = ~|x;");
1045   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1046   EXPECT_TOKEN(Tokens[2], tok::tilde, TT_UnaryOperator);
1047   EXPECT_TOKEN(Tokens[3], tok::pipe, TT_UnaryOperator);
1048   // Test for block label colons.
1049   Tokens = Annotate("begin : x\n"
1050                     "end : x");
1051   ASSERT_EQ(Tokens.size(), 7u);
1052   EXPECT_TOKEN(Tokens[1], tok::colon, TT_VerilogBlockLabelColon);
1053   EXPECT_TOKEN(Tokens[4], tok::colon, TT_VerilogBlockLabelColon);
1054   // Test that the dimension colon is annotated correctly.
1055   Tokens = Annotate("var [1 : 0] x;");
1056   ASSERT_EQ(Tokens.size(), 9u) << Tokens;
1057   EXPECT_TOKEN(Tokens[3], tok::colon, TT_BitFieldColon);
1058   Tokens = Annotate("extern function [1 : 0] x;");
1059   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1060   EXPECT_TOKEN(Tokens[4], tok::colon, TT_BitFieldColon);
1061   // Test case labels and ternary operators.
1062   Tokens = Annotate("case (x)\n"
1063                     "  x:\n"
1064                     "    x;\n"
1065                     "endcase\n");
1066   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1067   EXPECT_TOKEN(Tokens[5], tok::colon, TT_GotoLabelColon);
1068   Tokens = Annotate("case (x)\n"
1069                     "  x ? x : x:\n"
1070                     "    x;\n"
1071                     "endcase\n");
1072   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
1073   EXPECT_TOKEN(Tokens[5], tok::question, TT_ConditionalExpr);
1074   EXPECT_TOKEN(Tokens[7], tok::colon, TT_ConditionalExpr);
1075   EXPECT_TOKEN(Tokens[9], tok::colon, TT_GotoLabelColon);
1076 }
1077 
1078 } // namespace
1079 } // namespace format
1080 } // namespace clang
1081