xref: /llvm-project/clang/unittests/Format/TokenAnnotatorTest.cpp (revision be5c3ca7fbaec90fff004af54d3cd5f6c30a9664)
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 
83 TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
84   auto Tokens = annotate("class C {};");
85   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
86   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
87 
88   Tokens = annotate("const class C {} c;");
89   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
90   EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);
91 
92   Tokens = annotate("const class {} c;");
93   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
94   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
95 }
96 
97 TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
98   auto Tokens = annotate("struct S {};");
99   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
100   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
101 }
102 
103 TEST_F(TokenAnnotatorTest, UnderstandsUnions) {
104   auto Tokens = annotate("union U {};");
105   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
106   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
107 
108   Tokens = annotate("union U { void f() { return; } };");
109   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
110   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
111   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);
112 }
113 
114 TEST_F(TokenAnnotatorTest, UnderstandsEnums) {
115   auto Tokens = annotate("enum E {};");
116   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
117   EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_EnumLBrace);
118 }
119 
120 TEST_F(TokenAnnotatorTest, UnderstandsDefaultedAndDeletedFunctions) {
121   auto Tokens = annotate("auto operator<=>(const T &) const & = default;");
122   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
123   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
124 
125   Tokens = annotate("template <typename T> void F(T) && = delete;");
126   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
127   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_PointerOrReference);
128 }
129 
130 TEST_F(TokenAnnotatorTest, UnderstandsVariables) {
131   auto Tokens =
132       annotate("inline bool var = is_integral_v<int> && is_signed_v<int>;");
133   EXPECT_EQ(Tokens.size(), 15u) << Tokens;
134   EXPECT_TOKEN(Tokens[8], tok::ampamp, TT_BinaryOperator);
135 }
136 
137 TEST_F(TokenAnnotatorTest, UnderstandsVariableTemplates) {
138   auto Tokens =
139       annotate("template <typename T> "
140                "inline bool var = is_integral_v<int> && is_signed_v<int>;");
141   EXPECT_EQ(Tokens.size(), 20u) << Tokens;
142   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
143 }
144 
145 TEST_F(TokenAnnotatorTest, UnderstandsLBracesInMacroDefinition) {
146   auto Tokens = annotate("#define BEGIN NS {");
147   EXPECT_EQ(Tokens.size(), 6u) << Tokens;
148   EXPECT_TOKEN(Tokens[4], tok::l_brace, TT_Unknown);
149 }
150 
151 TEST_F(TokenAnnotatorTest, UnderstandsDelete) {
152   auto Tokens = annotate("delete (void *)p;");
153   EXPECT_EQ(Tokens.size(), 8u) << Tokens;
154   EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen);
155 
156   Tokens = annotate("delete[] (void *)p;");
157   EXPECT_EQ(Tokens.size(), 10u) << Tokens;
158   EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen);
159 
160   Tokens = annotate("delete[] /*comment*/ (void *)p;");
161   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
162   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
163 
164   Tokens = annotate("delete[/*comment*/] (void *)p;");
165   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
166   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
167 
168   Tokens = annotate("delete/*comment*/[] (void *)p;");
169   EXPECT_EQ(Tokens.size(), 11u) << Tokens;
170   EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen);
171 }
172 
173 TEST_F(TokenAnnotatorTest, UnderstandsFunctionRefQualifiers) {
174   auto Tokens = annotate("void f() &;");
175   EXPECT_EQ(Tokens.size(), 7u) << Tokens;
176   EXPECT_TOKEN(Tokens[4], tok::amp, TT_PointerOrReference);
177 
178   Tokens = annotate("void operator=(T) &&;");
179   EXPECT_EQ(Tokens.size(), 9u) << Tokens;
180   EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference);
181 
182   Tokens = annotate("template <typename T> void f() &;");
183   EXPECT_EQ(Tokens.size(), 12u) << Tokens;
184   EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference);
185 
186   Tokens = annotate("template <typename T> void operator=(T) &;");
187   EXPECT_EQ(Tokens.size(), 14u) << Tokens;
188   EXPECT_TOKEN(Tokens[11], tok::amp, TT_PointerOrReference);
189 }
190 
191 TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
192   auto Tokens = annotate("template <typename T>\n"
193                          "concept C = (Foo && Bar) && (Bar && Baz);");
194 
195   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
196   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
197   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
198   EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);
199 
200   Tokens = annotate("template <typename T>\n"
201                     "concept C = requires(T t) {\n"
202                     "  { t.foo() };\n"
203                     "} && Bar<T> && Baz<T>;");
204   ASSERT_EQ(Tokens.size(), 35u) << Tokens;
205   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
206   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
207   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
208   EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);
209   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
210 
211   Tokens = annotate("template<typename T>\n"
212                     "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"
213                     "struct Foo;");
214   ASSERT_EQ(Tokens.size(), 36u) << Tokens;
215   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
216   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
217   EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);
218   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
219   EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);
220   EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);
221   EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);
222   EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);
223   EXPECT_EQ(Tokens[31]->FakeRParens, 1u);
224   EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);
225 
226   Tokens =
227       annotate("template<typename T>\n"
228                "requires (C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"
229                "struct Foo;");
230   ASSERT_EQ(Tokens.size(), 38u) << Tokens;
231   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
232   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
233   EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);
234   EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);
235   EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);
236   EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);
237   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
238   EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);
239   EXPECT_EQ(Tokens[32]->FakeRParens, 1u);
240   EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);
241   EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);
242 
243   Tokens = annotate("template <typename T>\n"
244                     "void foo(T) noexcept requires Bar<T>;");
245   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
246   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
247 
248   Tokens = annotate("template <typename T>\n"
249                     "struct S {\n"
250                     "  void foo() const requires Bar<T>;\n"
251                     "  void bar() const & requires Baz<T>;\n"
252                     "  void bar() && requires Baz2<T>;\n"
253                     "  void baz() const & noexcept requires Baz<T>;\n"
254                     "  void baz() && noexcept requires Baz2<T>;\n"
255                     "};\n"
256                     "\n"
257                     "void S::bar() const & requires Baz<T> { }");
258   ASSERT_EQ(Tokens.size(), 85u) << Tokens;
259   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
260   EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);
261   EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);
262   EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);
263   EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);
264   EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);
265 
266   Tokens = annotate("void Class::member() && requires(Constant) {}");
267   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
268   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
269 
270   Tokens = annotate("void Class::member() && requires(Constant<T>) {}");
271   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
272   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
273 
274   Tokens =
275       annotate("void Class::member() && requires(Namespace::Constant<T>) {}");
276   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
277   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
278 
279   Tokens = annotate("void Class::member() && requires(typename "
280                     "Namespace::Outer<T>::Inner::Constant) {}");
281   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
282   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
283 
284   Tokens = annotate("struct [[nodiscard]] zero_t {\n"
285                     "  template<class T>\n"
286                     "    requires requires { number_zero_v<T>; }\n"
287                     "  [[nodiscard]] constexpr operator T() const { "
288                     "return number_zero_v<T>; }\n"
289                     "};");
290   ASSERT_EQ(Tokens.size(), 44u);
291   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
292   EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);
293   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);
294   EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);
295   EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);
296   EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);
297 }
298 
299 TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
300   auto Tokens = annotate("bool b = requires(int i) { i + 5; };");
301   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
302   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
303   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
304   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
305 
306   Tokens = annotate("if (requires(int i) { i + 5; }) return;");
307   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
308   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
309   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
310   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);
311 
312   Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");
313   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
314   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);
315   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);
316   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);
317 
318   Tokens = annotate("foo(requires(const T t) {});");
319   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
320   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
321   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
322   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
323 
324   Tokens = annotate("foo(requires(const int t) {});");
325   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
326   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
327   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
328   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
329 
330   Tokens = annotate("foo(requires(const T t) {});");
331   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
332   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
333   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
334   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
335 
336   Tokens = annotate("foo(requires(int const* volatile t) {});");
337   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
338   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
339   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
340   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
341 
342   Tokens = annotate("foo(requires(T const* volatile t) {});");
343   ASSERT_EQ(Tokens.size(), 15u) << Tokens;
344   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
345   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
346   EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace);
347 
348   Tokens =
349       annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");
350   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
351   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
352   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
353   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);
354 
355   Tokens = annotate("template <typename T>\n"
356                     "concept C = requires(T T) {\n"
357                     "  requires Bar<T> && Foo<T>;\n"
358                     "};");
359   ASSERT_EQ(Tokens.size(), 28u) << Tokens;
360   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
361   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
362   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
363   EXPECT_TOKEN(Tokens[14], tok::kw_requires,
364                TT_RequiresClauseInARequiresExpression);
365 
366   Tokens = annotate("template <typename T>\n"
367                     "concept C = requires(T T) {\n"
368                     "  { t.func() } -> std::same_as<int>;"
369                     "  requires Bar<T> && Foo<T>;\n"
370                     "};");
371   ASSERT_EQ(Tokens.size(), 43u) << Tokens;
372   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
373   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
374   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
375   EXPECT_TOKEN(Tokens[29], tok::kw_requires,
376                TT_RequiresClauseInARequiresExpression);
377 
378   // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.
379   Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "
380                     "requires true; };");
381   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
382   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
383   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
384   EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);
385 }
386 
387 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
388   auto NumberOfAdditionalRequiresClauseTokens = 5u;
389   auto NumberOfTokensBeforeRequires = 5u;
390 
391   auto BaseTokens = annotate("template<typename T>\n"
392                              "T Pi = 3.14;");
393   auto ConstrainedTokens = annotate("template<typename T>\n"
394                                     "  requires Foo<T>\n"
395                                     "T Pi = 3.14;");
396 
397   auto NumberOfBaseTokens = 11u;
398 
399   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
400   ASSERT_EQ(ConstrainedTokens.size(),
401             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
402       << ConstrainedTokens;
403 
404   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
405     if (I < NumberOfTokensBeforeRequires)
406       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
407     else
408       EXPECT_EQ(*BaseTokens[I],
409                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
410           << I;
411 
412   BaseTokens = annotate("template<typename T>\n"
413                         "struct Bar;");
414   ConstrainedTokens = annotate("template<typename T>\n"
415                                "  requires Foo<T>\n"
416                                "struct Bar;");
417   NumberOfBaseTokens = 9u;
418 
419   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
420   ASSERT_EQ(ConstrainedTokens.size(),
421             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
422       << ConstrainedTokens;
423 
424   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
425     if (I < NumberOfTokensBeforeRequires)
426       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
427     else
428       EXPECT_EQ(*BaseTokens[I],
429                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
430           << I;
431 
432   BaseTokens = annotate("template<typename T>\n"
433                         "struct Bar {"
434                         "  T foo();\n"
435                         "  T bar();\n"
436                         "};");
437   ConstrainedTokens = annotate("template<typename T>\n"
438                                "  requires Foo<T>\n"
439                                "struct Bar {"
440                                "  T foo();\n"
441                                "  T bar();\n"
442                                "};");
443   NumberOfBaseTokens = 21u;
444 
445   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
446   ASSERT_EQ(ConstrainedTokens.size(),
447             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
448       << ConstrainedTokens;
449 
450   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
451     if (I < NumberOfTokensBeforeRequires)
452       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
453     else
454       EXPECT_EQ(*BaseTokens[I],
455                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
456           << I;
457 
458   BaseTokens = annotate("template<typename T>\n"
459                         "Bar(T) -> Bar<T>;");
460   ConstrainedTokens = annotate("template<typename T>\n"
461                                "  requires Foo<T>\n"
462                                "Bar(T) -> Bar<T>;");
463   NumberOfBaseTokens = 16u;
464 
465   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
466   ASSERT_EQ(ConstrainedTokens.size(),
467             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
468       << ConstrainedTokens;
469 
470   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
471     if (I < NumberOfTokensBeforeRequires)
472       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
473     else
474       EXPECT_EQ(*BaseTokens[I],
475                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
476           << I;
477 
478   BaseTokens = annotate("template<typename T>\n"
479                         "T foo();");
480   ConstrainedTokens = annotate("template<typename T>\n"
481                                "  requires Foo<T>\n"
482                                "T foo();");
483   NumberOfBaseTokens = 11u;
484 
485   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
486   ASSERT_EQ(ConstrainedTokens.size(),
487             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
488       << ConstrainedTokens;
489 
490   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
491     if (I < NumberOfTokensBeforeRequires)
492       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
493     else
494       EXPECT_EQ(*BaseTokens[I],
495                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
496           << I;
497 
498   BaseTokens = annotate("template<typename T>\n"
499                         "T foo() {\n"
500                         "  auto bar = baz();\n"
501                         "  return bar + T{};\n"
502                         "}");
503   ConstrainedTokens = annotate("template<typename T>\n"
504                                "  requires Foo<T>\n"
505                                "T foo() {\n"
506                                "  auto bar = baz();\n"
507                                "  return bar + T{};\n"
508                                "}");
509   NumberOfBaseTokens = 26u;
510 
511   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
512   ASSERT_EQ(ConstrainedTokens.size(),
513             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
514       << ConstrainedTokens;
515 
516   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
517     if (I < NumberOfTokensBeforeRequires)
518       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
519     else
520       EXPECT_EQ(*BaseTokens[I],
521                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
522           << I;
523 
524   BaseTokens = annotate("template<typename T>\n"
525                         "T foo();");
526   ConstrainedTokens = annotate("template<typename T>\n"
527                                "T foo() requires Foo<T>;");
528   NumberOfBaseTokens = 11u;
529   NumberOfTokensBeforeRequires = 9u;
530 
531   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
532   ASSERT_EQ(ConstrainedTokens.size(),
533             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
534       << ConstrainedTokens;
535 
536   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
537     if (I < NumberOfTokensBeforeRequires)
538       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
539     else
540       EXPECT_EQ(*BaseTokens[I],
541                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
542           << I;
543 
544   BaseTokens = annotate("template<typename T>\n"
545                         "T foo() {\n"
546                         "  auto bar = baz();\n"
547                         "  return bar + T{};\n"
548                         "}");
549   ConstrainedTokens = annotate("template<typename T>\n"
550                                "T foo() requires Foo<T> {\n"
551                                "  auto bar = baz();\n"
552                                "  return bar + T{};\n"
553                                "}");
554   NumberOfBaseTokens = 26u;
555 
556   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
557   ASSERT_EQ(ConstrainedTokens.size(),
558             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
559       << ConstrainedTokens;
560 
561   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
562     if (I < NumberOfTokensBeforeRequires)
563       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
564     else
565       EXPECT_EQ(*BaseTokens[I],
566                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
567           << I;
568 
569   BaseTokens = annotate("template<typename T>\n"
570                         "Bar(T) -> Bar<typename T::I>;");
571   ConstrainedTokens = annotate("template<typename T>\n"
572                                "  requires requires(T &&t) {\n"
573                                "             typename T::I;\n"
574                                "           }\n"
575                                "Bar(T) -> Bar<typename T::I>;");
576   NumberOfBaseTokens = 19u;
577   NumberOfAdditionalRequiresClauseTokens = 14u;
578   NumberOfTokensBeforeRequires = 5u;
579 
580   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
581   ASSERT_EQ(ConstrainedTokens.size(),
582             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
583       << ConstrainedTokens;
584 
585   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
586     if (I < NumberOfTokensBeforeRequires)
587       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
588     else
589       EXPECT_EQ(*BaseTokens[I],
590                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
591           << I;
592 
593   BaseTokens = annotate("struct [[nodiscard]] zero_t {\n"
594                         "  template<class T>\n"
595                         "  [[nodiscard]] constexpr operator T() const { "
596                         "return number_zero_v<T>; }\n"
597                         "};");
598 
599   ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n"
600                                "  template<class T>\n"
601                                "    requires requires { number_zero_v<T>; }\n"
602                                "  [[nodiscard]] constexpr operator T() const { "
603                                "return number_zero_v<T>; }\n"
604                                "};");
605   NumberOfBaseTokens = 35u;
606   NumberOfAdditionalRequiresClauseTokens = 9u;
607   NumberOfTokensBeforeRequires = 13u;
608 
609   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
610   ASSERT_EQ(ConstrainedTokens.size(),
611             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
612       << ConstrainedTokens;
613 
614   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
615     if (I < NumberOfTokensBeforeRequires)
616       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
617     else
618       EXPECT_EQ(*BaseTokens[I],
619                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
620           << I;
621 }
622 
623 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
624   auto Tokens = annotate("__asm{\n"
625                          "a:\n"
626                          "};");
627   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
628   EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
629   EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
630   EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
631 }
632 
633 TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {
634   auto Tokens = annotate("int (^)() = ^ ()\n"
635                          "  external_source_symbol() { //\n"
636                          "  return 1;\n"
637                          "};");
638   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
639   EXPECT_TOKEN(Tokens[1], tok::l_paren, TT_ObjCBlockLParen);
640   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_ObjCBlockLBrace);
641 
642   Tokens = annotate("int *p = ^int*(){ //\n"
643                     "  return nullptr;\n"
644                     "}();");
645   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
646   EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_ObjCBlockLBrace);
647 }
648 
649 } // namespace
650 } // namespace format
651 } // namespace clang
652