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(FormatTok, Kind, Type)                                    \
42   do {                                                                         \
43     EXPECT_TOKEN_KIND(FormatTok, Kind);                                        \
44     EXPECT_TOKEN_TYPE(FormatTok, Type);                                        \
45   } while (false)
46 
47 TEST_F(TokenAnnotatorTest, UnderstandsUsesOfStarAndAmp) {
48   auto Tokens = annotate("auto x = [](const decltype(x) &ptr) {};");
49   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
50   EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);
51   EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);
52   EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);
53   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
54   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
55 
56   Tokens = annotate("auto x = [](const decltype(x) *ptr) {};");
57   EXPECT_EQ(Tokens.size(), 18u) << Tokens;
58   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
59   EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);
60 
61   Tokens = annotate("#define lambda [](const decltype(x) &ptr) {}");
62   EXPECT_EQ(Tokens.size(), 17u) << Tokens;
63   EXPECT_TOKEN(Tokens[7], tok::kw_decltype, TT_Unknown);
64   EXPECT_TOKEN(Tokens[8], tok::l_paren, TT_TypeDeclarationParen);
65   EXPECT_TOKEN(Tokens[9], tok::identifier, TT_Unknown);
66   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
67   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
68 
69   Tokens = annotate("#define lambda [](const decltype(x) *ptr) {}");
70   EXPECT_EQ(Tokens.size(), 17u) << Tokens;
71   EXPECT_TOKEN(Tokens[10], tok::r_paren, TT_TypeDeclarationParen);
72   EXPECT_TOKEN(Tokens[11], tok::star, TT_PointerOrReference);
73 
74   Tokens = annotate("void f() {\n"
75                     "  while (p < a && *p == 'a')\n"
76                     "    p++;\n"
77                     "}");
78   EXPECT_EQ(Tokens.size(), 21u) << Tokens;
79   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
80   EXPECT_TOKEN(Tokens[11], tok::star, TT_UnaryOperator);
81 
82   Tokens = annotate("case *x:");
83   EXPECT_EQ(Tokens.size(), 5u) << Tokens;
84   EXPECT_TOKEN(Tokens[1], tok::star, TT_UnaryOperator);
85   Tokens = annotate("case &x:");
86   EXPECT_EQ(Tokens.size(), 5u) << Tokens;
87   EXPECT_TOKEN(Tokens[1], tok::amp, TT_UnaryOperator);
88 
89   Tokens = annotate("struct {\n"
90                     "} *ptr;");
91   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
92   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
93   Tokens = annotate("union {\n"
94                     "} *ptr;");
95   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
96   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
97   Tokens = annotate("class {\n"
98                     "} *ptr;");
99   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
100   EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference);
101 
102   Tokens = annotate("struct {\n"
103                     "} &&ptr = {};");
104   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
105   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
106   Tokens = annotate("union {\n"
107                     "} &&ptr = {};");
108   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
109   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
110   Tokens = annotate("class {\n"
111                     "} &&ptr = {};");
112   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
113   EXPECT_TOKEN(Tokens[3], tok::ampamp, TT_PointerOrReference);
114 }
115 
116 TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {
117   auto Tokens = annotate("x - 0");
118   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
119   EXPECT_TOKEN(Tokens[1], tok::minus, TT_BinaryOperator);
120   Tokens = annotate("0 + 0");
121   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
122   EXPECT_TOKEN(Tokens[1], tok::plus, TT_BinaryOperator);
123   Tokens = annotate("x + +0");
124   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
125   EXPECT_TOKEN(Tokens[2], tok::plus, TT_UnaryOperator);
126   Tokens = annotate("x ? -0 : +0");
127   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
128   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
129   EXPECT_TOKEN(Tokens[5], tok::plus, TT_UnaryOperator);
130   Tokens = annotate("(-0)");
131   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
132   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
133   Tokens = annotate("0, -0");
134   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
135   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
136   Tokens = annotate("for (; -1;) {\n}");
137   ASSERT_EQ(Tokens.size(), 10u) << Tokens;
138   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
139   Tokens = annotate("x = -1;");
140   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
141   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
142   Tokens = annotate("x[-1]");
143   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
144   EXPECT_TOKEN(Tokens[2], tok::minus, TT_UnaryOperator);
145   Tokens = annotate("x = {-1};");
146   ASSERT_EQ(Tokens.size(), 8u) << Tokens;
147   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
148   Tokens = annotate("case -x:");
149   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
150   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
151   Tokens = annotate("co_await -x;");
152   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
153   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
154   Tokens = annotate("co_return -x;");
155   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
156   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
157   Tokens = annotate("co_yield -x;");
158   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
159   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
160   Tokens = annotate("delete -x;");
161   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
162   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
163   Tokens = annotate("return -x;");
164   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
165   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
166   Tokens = annotate("throw -x;");
167   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
168   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
169   Tokens = annotate("sizeof -x");
170   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
171   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
172   Tokens = annotate("co_await +x;");
173   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
174   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
175   Tokens = annotate("co_return +x;");
176   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
177   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
178   Tokens = annotate("co_yield +x;");
179   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
180   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
181   Tokens = annotate("delete +x;");
182   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
183   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
184   Tokens = annotate("return +x;");
185   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
186   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
187   Tokens = annotate("throw +x;");
188   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
189   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
190   Tokens = annotate("sizeof +x");
191   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
192   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
193   Tokens = annotate("(int)-x");
194   ASSERT_EQ(Tokens.size(), 6u) << Tokens;
195   EXPECT_TOKEN(Tokens[3], tok::minus, TT_UnaryOperator);
196   Tokens = annotate("(-x)");
197   ASSERT_EQ(Tokens.size(), 5u) << Tokens;
198   EXPECT_TOKEN(Tokens[1], tok::minus, TT_UnaryOperator);
199   Tokens = annotate("!+x");
200   ASSERT_EQ(Tokens.size(), 4u) << Tokens;
201   EXPECT_TOKEN(Tokens[0], tok::exclaim, TT_UnaryOperator);
202   EXPECT_TOKEN(Tokens[1], tok::plus, TT_UnaryOperator);
203 }
204 
205 TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
206   auto Tokens = annotate("class C {};");
207   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
208   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
209 
210   Tokens = annotate("const class C {} c;");
211   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
212   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);
213 
214   Tokens = annotate("const class {} c;");
215   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
216   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
217 }
218 
219 TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
220   auto Tokens = annotate("struct S {};");
221   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
222   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
223 }
224 
225 TEST_F(TokenAnnotatorTest, UnderstandsUnions) {
226   auto Tokens = annotate("union U {};");
227   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
228   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
229 
230   Tokens = annotate("union U { void f() { return; } };");
231   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
232   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
233   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);
234 }
235 
236 TEST_F(TokenAnnotatorTest, UnderstandsEnums) {
237   auto Tokens = annotate("enum E {};");
238   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
239   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_EnumLBrace);
240 }
241 
242 TEST_F(TokenAnnotatorTest, UnderstandsDefaultedAndDeletedFunctions) {
243   auto Tokens = annotate("auto operator<=>(const T &) const & = default;");
244   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
245   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
246 
247   Tokens = annotate("template <typename T> void F(T) && = delete;");
248   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
249   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
250 }
251 
252 TEST_F(TokenAnnotatorTest, UnderstandsVariables) {
253   auto Tokens =
254       annotate("inline bool var = is_integral_v<int> && is_signed_v<int>;");
255   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
256   EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_BinaryOperator);
257 }
258 
259 TEST_F(TokenAnnotatorTest, UnderstandsVariableTemplates) {
260   auto Tokens =
261       annotate("template <typename T> "
262                "inline bool var = is_integral_v<int> && is_signed_v<int>;");
263   EXPECT_EQ(Tokens.size(), 20u) << Tokens;
264   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
265 }
266 
267 TEST_F(TokenAnnotatorTest, UnderstandsLBracesInMacroDefinition) {
268   auto Tokens = annotate("#define BEGIN NS {");
269   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
270   EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown);
271 }
272 
273 TEST_F(TokenAnnotatorTest, UnderstandsDelete) {
274   auto Tokens = annotate("delete (void *)p;");
275   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
276   EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);
277 
278   Tokens = annotate("delete[] (void *)p;");
279   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
280   EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);
281 
282   Tokens = annotate("delete[] /*comment*/ (void *)p;");
283   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
284   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
285 
286   Tokens = annotate("delete[/*comment*/] (void *)p;");
287   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
288   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
289 
290   Tokens = annotate("delete/*comment*/[] (void *)p;");
291   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
292   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
293 }
294 
295 TEST_F(TokenAnnotatorTest, UnderstandsFunctionRefQualifiers) {
296   auto Tokens = annotate("void f() &;");
297   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
298   EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);
299 
300   Tokens = annotate("void operator=(T) &&;");
301   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
302   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);
303 
304   Tokens = annotate("template <typename T> void f() &;");
305   EXPECT_EQ(Tokens.size(), 12u) << Tokens;
306   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
307 
308   Tokens = annotate("template <typename T> void operator=(T) &;");
309   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
310   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
311 }
312 
313 TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
314   auto Tokens = annotate("template <typename T>\n"
315                          "concept C = (Foo && Bar) && (Bar && Baz);");
316 
317   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
318   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
319   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
320   EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);
321 
322   Tokens = annotate("template <typename T>\n"
323                     "concept C = requires(T t) {\n"
324                     "  { t.foo() };\n"
325                     "} && Bar<T> && Baz<T>;");
326   ASSERT_EQ(Tokens.size(), 35u) << Tokens;
327   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
328   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
329   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
330   EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);
331   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
332 
333   Tokens = annotate("template<typename T>\n"
334                     "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"
335                     "struct Foo;");
336   ASSERT_EQ(Tokens.size(), 36u) << Tokens;
337   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
338   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
339   EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);
340   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
341   EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);
342   EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);
343   EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);
344   EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);
345   EXPECT_EQ(Tokens[31]->FakeRParens, 1u);
346   EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);
347 
348   Tokens =
349       annotate("template<typename T>\n"
350                "requires (C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"
351                "struct Foo;");
352   ASSERT_EQ(Tokens.size(), 38u) << Tokens;
353   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
354   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
355   EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);
356   EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);
357   EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);
358   EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);
359   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
360   EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);
361   EXPECT_EQ(Tokens[32]->FakeRParens, 1u);
362   EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);
363   EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);
364 
365   Tokens = annotate("template <typename T>\n"
366                     "void foo(T) noexcept requires Bar<T>;");
367   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
368   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
369 
370   Tokens = annotate("template <typename T>\n"
371                     "struct S {\n"
372                     "  void foo() const requires Bar<T>;\n"
373                     "  void bar() const & requires Baz<T>;\n"
374                     "  void bar() && requires Baz2<T>;\n"
375                     "  void baz() const & noexcept requires Baz<T>;\n"
376                     "  void baz() && noexcept requires Baz2<T>;\n"
377                     "};\n"
378                     "\n"
379                     "void S::bar() const & requires Baz<T> { }");
380   ASSERT_EQ(Tokens.size(), 85u) << Tokens;
381   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
382   EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);
383   EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);
384   EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);
385   EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);
386   EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);
387 
388   Tokens = annotate("void Class::member() && requires(Constant) {}");
389   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
390   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
391 
392   Tokens = annotate("void Class::member() && requires(Constant<T>) {}");
393   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
394   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
395 
396   Tokens =
397       annotate("void Class::member() && requires(Namespace::Constant<T>) {}");
398   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
399   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
400 
401   Tokens = annotate("void Class::member() && requires(typename "
402                     "Namespace::Outer<T>::Inner::Constant) {}");
403   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
404   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
405 
406   Tokens = annotate("struct [[nodiscard]] zero_t {\n"
407                     "  template<class T>\n"
408                     "    requires requires { number_zero_v<T>; }\n"
409                     "  [[nodiscard]] constexpr operator T() const { "
410                     "return number_zero_v<T>; }\n"
411                     "};");
412   ASSERT_EQ(Tokens.size(), 44u);
413   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
414   EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);
415   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);
416   EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);
417   EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);
418   EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);
419 
420   Tokens =
421       annotate("template <class A, class B> concept C ="
422                "std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;");
423   ASSERT_EQ(Tokens.size(), 31u) << Tokens;
424   EXPECT_TOKEN(Tokens[8], tok::kw_concept, TT_Unknown);
425   EXPECT_TOKEN(Tokens[14], tok::less, TT_TemplateOpener);
426   EXPECT_TOKEN(Tokens[18], tok::less, TT_TemplateOpener);
427   EXPECT_TOKEN(Tokens[20], tok::greater, TT_TemplateCloser);
428   EXPECT_TOKEN(Tokens[25], tok::less, TT_TemplateOpener);
429   EXPECT_TOKEN(Tokens[27], tok::greater, TT_TemplateCloser);
430   EXPECT_TOKEN(Tokens[28], tok::greater, TT_TemplateCloser);
431 
432   Tokens = annotate("auto bar() -> int requires(is_integral_v<T>) {}");
433   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
434   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
435 
436   Tokens = annotate("auto bar() -> void requires(is_integral_v<T>) {}");
437   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
438   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
439 
440   Tokens = annotate("auto bar() -> MyType requires(is_integral_v<T>) {}");
441   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
442   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
443 
444   Tokens =
445       annotate("auto bar() -> SOME_MACRO_TYPE requires(is_integral_v<T>) {}");
446   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
447   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresClause);
448 
449   Tokens =
450       annotate("auto bar() -> qualified::type requires(is_integral_v<T>) {}");
451   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
452   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresClause);
453 
454   Tokens =
455       annotate("auto bar() -> Template<type> requires(is_integral_v<T>) {}");
456   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
457   EXPECT_TOKEN(Tokens[9], tok::kw_requires, TT_RequiresClause);
458 }
459 
460 TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
461   auto Tokens = annotate("bool b = requires(int i) { i + 5; };");
462   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
463   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
464   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
465   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
466 
467   Tokens = annotate("if (requires(int i) { i + 5; }) return;");
468   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
469   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
470   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
471   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);
472 
473   Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");
474   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
475   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);
476   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);
477   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);
478 
479   Tokens = annotate("foo(requires(const T t) {});");
480   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
481   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
482   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
483   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
484 
485   Tokens = annotate("foo(requires(const int t) {});");
486   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
487   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
488   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
489   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
490 
491   Tokens = annotate("foo(requires(const T t) {});");
492   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
493   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
494   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
495   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
496 
497   Tokens = annotate("foo(requires(int const* volatile t) {});");
498   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
499   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
500   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
501   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
502 
503   Tokens = annotate("foo(requires(T const* volatile t) {});");
504   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
505   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
506   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
507   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
508 
509   Tokens =
510       annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");
511   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
512   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
513   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
514   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);
515 
516   Tokens = annotate("template <typename T>\n"
517                     "concept C = requires(T T) {\n"
518                     "  requires Bar<T> && Foo<T>;\n"
519                     "};");
520   ASSERT_EQ(Tokens.size(), 28u) << Tokens;
521   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
522   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
523   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
524   EXPECT_TOKEN(Tokens[14], tok::kw_requires,
525                TT_RequiresClauseInARequiresExpression);
526 
527   Tokens = annotate("template <typename T>\n"
528                     "concept C = requires(T T) {\n"
529                     "  { t.func() } -> std::same_as<int>;"
530                     "  requires Bar<T> && Foo<T>;\n"
531                     "};");
532   ASSERT_EQ(Tokens.size(), 43u) << Tokens;
533   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
534   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
535   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
536   EXPECT_TOKEN(Tokens[29], tok::kw_requires,
537                TT_RequiresClauseInARequiresExpression);
538 
539   // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.
540   Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "
541                     "requires true; };");
542   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
543   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
544   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
545   EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);
546 }
547 
548 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
549   auto NumberOfAdditionalRequiresClauseTokens = 5u;
550   auto NumberOfTokensBeforeRequires = 5u;
551 
552   auto BaseTokens = annotate("template<typename T>\n"
553                              "T Pi = 3.14;");
554   auto ConstrainedTokens = annotate("template<typename T>\n"
555                                     "  requires Foo<T>\n"
556                                     "T Pi = 3.14;");
557 
558   auto NumberOfBaseTokens = 11u;
559 
560   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
561   ASSERT_EQ(ConstrainedTokens.size(),
562             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
563       << ConstrainedTokens;
564 
565   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
566     if (I < NumberOfTokensBeforeRequires) {
567       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
568     } else {
569       EXPECT_EQ(*BaseTokens[I],
570                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
571           << I;
572     }
573   }
574 
575   BaseTokens = annotate("template<typename T>\n"
576                         "struct Bar;");
577   ConstrainedTokens = annotate("template<typename T>\n"
578                                "  requires Foo<T>\n"
579                                "struct Bar;");
580   NumberOfBaseTokens = 9u;
581 
582   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
583   ASSERT_EQ(ConstrainedTokens.size(),
584             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
585       << ConstrainedTokens;
586 
587   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
588     if (I < NumberOfTokensBeforeRequires) {
589       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
590     } else {
591       EXPECT_EQ(*BaseTokens[I],
592                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
593           << I;
594     }
595   }
596 
597   BaseTokens = annotate("template<typename T>\n"
598                         "struct Bar {"
599                         "  T foo();\n"
600                         "  T bar();\n"
601                         "};");
602   ConstrainedTokens = annotate("template<typename T>\n"
603                                "  requires Foo<T>\n"
604                                "struct Bar {"
605                                "  T foo();\n"
606                                "  T bar();\n"
607                                "};");
608   NumberOfBaseTokens = 21u;
609 
610   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
611   ASSERT_EQ(ConstrainedTokens.size(),
612             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
613       << ConstrainedTokens;
614 
615   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
616     if (I < NumberOfTokensBeforeRequires) {
617       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
618     } else {
619       EXPECT_EQ(*BaseTokens[I],
620                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
621           << I;
622     }
623   }
624 
625   BaseTokens = annotate("template<typename T>\n"
626                         "Bar(T) -> Bar<T>;");
627   ConstrainedTokens = annotate("template<typename T>\n"
628                                "  requires Foo<T>\n"
629                                "Bar(T) -> Bar<T>;");
630   NumberOfBaseTokens = 16u;
631 
632   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
633   ASSERT_EQ(ConstrainedTokens.size(),
634             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
635       << ConstrainedTokens;
636 
637   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
638     if (I < NumberOfTokensBeforeRequires) {
639       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
640     } else {
641       EXPECT_EQ(*BaseTokens[I],
642                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
643           << I;
644     }
645   }
646 
647   BaseTokens = annotate("template<typename T>\n"
648                         "T foo();");
649   ConstrainedTokens = annotate("template<typename T>\n"
650                                "  requires Foo<T>\n"
651                                "T foo();");
652   NumberOfBaseTokens = 11u;
653 
654   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
655   ASSERT_EQ(ConstrainedTokens.size(),
656             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
657       << ConstrainedTokens;
658 
659   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
660     if (I < NumberOfTokensBeforeRequires) {
661       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
662     } else {
663       EXPECT_EQ(*BaseTokens[I],
664                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
665           << I;
666     }
667   }
668 
669   BaseTokens = annotate("template<typename T>\n"
670                         "T foo() {\n"
671                         "  auto bar = baz();\n"
672                         "  return bar + T{};\n"
673                         "}");
674   ConstrainedTokens = annotate("template<typename T>\n"
675                                "  requires Foo<T>\n"
676                                "T foo() {\n"
677                                "  auto bar = baz();\n"
678                                "  return bar + T{};\n"
679                                "}");
680   NumberOfBaseTokens = 26u;
681 
682   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
683   ASSERT_EQ(ConstrainedTokens.size(),
684             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
685       << ConstrainedTokens;
686 
687   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
688     if (I < NumberOfTokensBeforeRequires) {
689       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
690     } else {
691       EXPECT_EQ(*BaseTokens[I],
692                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
693           << I;
694     }
695   }
696 
697   BaseTokens = annotate("template<typename T>\n"
698                         "T foo();");
699   ConstrainedTokens = annotate("template<typename T>\n"
700                                "T foo() requires Foo<T>;");
701   NumberOfBaseTokens = 11u;
702   NumberOfTokensBeforeRequires = 9u;
703 
704   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
705   ASSERT_EQ(ConstrainedTokens.size(),
706             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
707       << ConstrainedTokens;
708 
709   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
710     if (I < NumberOfTokensBeforeRequires) {
711       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
712     } else {
713       EXPECT_EQ(*BaseTokens[I],
714                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
715           << I;
716     }
717   }
718 
719   BaseTokens = annotate("template<typename T>\n"
720                         "T foo() {\n"
721                         "  auto bar = baz();\n"
722                         "  return bar + T{};\n"
723                         "}");
724   ConstrainedTokens = annotate("template<typename T>\n"
725                                "T foo() requires Foo<T> {\n"
726                                "  auto bar = baz();\n"
727                                "  return bar + T{};\n"
728                                "}");
729   NumberOfBaseTokens = 26u;
730 
731   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
732   ASSERT_EQ(ConstrainedTokens.size(),
733             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
734       << ConstrainedTokens;
735 
736   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
737     if (I < NumberOfTokensBeforeRequires) {
738       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
739     } else {
740       EXPECT_EQ(*BaseTokens[I],
741                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
742           << I;
743     }
744   }
745 
746   BaseTokens = annotate("template<typename T>\n"
747                         "Bar(T) -> Bar<typename T::I>;");
748   ConstrainedTokens = annotate("template<typename T>\n"
749                                "  requires requires(T &&t) {\n"
750                                "             typename T::I;\n"
751                                "           }\n"
752                                "Bar(T) -> Bar<typename T::I>;");
753   NumberOfBaseTokens = 19u;
754   NumberOfAdditionalRequiresClauseTokens = 14u;
755   NumberOfTokensBeforeRequires = 5u;
756 
757   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
758   ASSERT_EQ(ConstrainedTokens.size(),
759             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
760       << ConstrainedTokens;
761 
762   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
763     if (I < NumberOfTokensBeforeRequires) {
764       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
765     } else {
766       EXPECT_EQ(*BaseTokens[I],
767                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
768           << I;
769     }
770   }
771 
772   BaseTokens = annotate("struct [[nodiscard]] zero_t {\n"
773                         "  template<class T>\n"
774                         "  [[nodiscard]] constexpr operator T() const { "
775                         "return number_zero_v<T>; }\n"
776                         "};");
777 
778   ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n"
779                                "  template<class T>\n"
780                                "    requires requires { number_zero_v<T>; }\n"
781                                "  [[nodiscard]] constexpr operator T() const { "
782                                "return number_zero_v<T>; }\n"
783                                "};");
784   NumberOfBaseTokens = 35u;
785   NumberOfAdditionalRequiresClauseTokens = 9u;
786   NumberOfTokensBeforeRequires = 13u;
787 
788   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
789   ASSERT_EQ(ConstrainedTokens.size(),
790             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
791       << ConstrainedTokens;
792 
793   for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
794     if (I < NumberOfTokensBeforeRequires) {
795       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
796     } else {
797       EXPECT_EQ(*BaseTokens[I],
798                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
799           << I;
800     }
801   }
802 }
803 
804 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
805   auto Tokens = annotate("__asm{\n"
806                          "a:\n"
807                          "};");
808   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
809   EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
810   EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
811   EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
812 }
813 
814 TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
815   auto Tokens = annotate("int (^)() = ^ ()\n"
816                          "  external_source_symbol() { //\n"
817                          "  return 1;\n"
818                          "};");
819   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
820   EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);
821   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);
822 
823   Tokens = annotate("int *p = ^int*(){ //\n"
824                     "  return nullptr;\n"
825                     "}();");
826   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
827   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);
828 }
829 
830 } // namespace
831 } // namespace format
832 } // namespace clang
833