xref: /llvm-project/clang/unittests/Format/TokenAnnotatorTest.cpp (revision 35abbf166d4ad13e4a89095307bb6e4b2e96e0b3)
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, UnderstandsRequiresClausesAndConcepts) {
174   auto Tokens = annotate("template <typename T>\n"
175                          "concept C = (Foo && Bar) && (Bar && Baz);");
176 
177   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
178   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
179   EXPECT_TOKEN(Tokens[13], tok::ampamp, TT_BinaryOperator);
180   EXPECT_TOKEN(Tokens[16], tok::ampamp, TT_BinaryOperator);
181 
182   Tokens = annotate("template <typename T>\n"
183                     "concept C = requires(T t) {\n"
184                     "  { t.foo() };\n"
185                     "} && Bar<T> && Baz<T>;");
186   ASSERT_EQ(Tokens.size(), 35u) << Tokens;
187   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
188   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
189   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
190   EXPECT_TOKEN(Tokens[23], tok::ampamp, TT_BinaryOperator);
191   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
192 
193   Tokens = annotate("template<typename T>\n"
194                     "requires C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>\n"
195                     "struct Foo;");
196   ASSERT_EQ(Tokens.size(), 36u) << Tokens;
197   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
198   EXPECT_TOKEN(Tokens[6], tok::identifier, TT_Unknown);
199   EXPECT_EQ(Tokens[6]->FakeLParens.size(), 1u);
200   EXPECT_TOKEN(Tokens[10], tok::ampamp, TT_BinaryOperator);
201   EXPECT_TOKEN(Tokens[16], tok::pipepipe, TT_BinaryOperator);
202   EXPECT_TOKEN(Tokens[21], tok::ampamp, TT_BinaryOperator);
203   EXPECT_TOKEN(Tokens[27], tok::ampamp, TT_BinaryOperator);
204   EXPECT_TOKEN(Tokens[31], tok::greater, TT_TemplateCloser);
205   EXPECT_EQ(Tokens[31]->FakeRParens, 1u);
206   EXPECT_TRUE(Tokens[31]->ClosesRequiresClause);
207 
208   Tokens =
209       annotate("template<typename T>\n"
210                "requires (C1<T> && (C21<T> || C22<T> && C2e<T>) && C3<T>)\n"
211                "struct Foo;");
212   ASSERT_EQ(Tokens.size(), 38u) << Tokens;
213   EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause);
214   EXPECT_TOKEN(Tokens[7], tok::identifier, TT_Unknown);
215   EXPECT_EQ(Tokens[7]->FakeLParens.size(), 1u);
216   EXPECT_TOKEN(Tokens[11], tok::ampamp, TT_BinaryOperator);
217   EXPECT_TOKEN(Tokens[17], tok::pipepipe, TT_BinaryOperator);
218   EXPECT_TOKEN(Tokens[22], tok::ampamp, TT_BinaryOperator);
219   EXPECT_TOKEN(Tokens[28], tok::ampamp, TT_BinaryOperator);
220   EXPECT_TOKEN(Tokens[32], tok::greater, TT_TemplateCloser);
221   EXPECT_EQ(Tokens[32]->FakeRParens, 1u);
222   EXPECT_TOKEN(Tokens[33], tok::r_paren, TT_Unknown);
223   EXPECT_TRUE(Tokens[33]->ClosesRequiresClause);
224 
225   Tokens = annotate("template <typename T>\n"
226                     "void foo(T) noexcept requires Bar<T>;");
227   ASSERT_EQ(Tokens.size(), 18u) << Tokens;
228   EXPECT_TOKEN(Tokens[11], tok::kw_requires, TT_RequiresClause);
229 
230   Tokens = annotate("template <typename T>\n"
231                     "struct S {\n"
232                     "  void foo() const requires Bar<T>;\n"
233                     "  void bar() const & requires Baz<T>;\n"
234                     "  void bar() && requires Baz2<T>;\n"
235                     "  void baz() const & noexcept requires Baz<T>;\n"
236                     "  void baz() && noexcept requires Baz2<T>;\n"
237                     "};\n"
238                     "\n"
239                     "void S::bar() const & requires Baz<T> { }");
240   ASSERT_EQ(Tokens.size(), 85u) << Tokens;
241   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
242   EXPECT_TOKEN(Tokens[25], tok::kw_requires, TT_RequiresClause);
243   EXPECT_TOKEN(Tokens[36], tok::kw_requires, TT_RequiresClause);
244   EXPECT_TOKEN(Tokens[49], tok::kw_requires, TT_RequiresClause);
245   EXPECT_TOKEN(Tokens[61], tok::kw_requires, TT_RequiresClause);
246   EXPECT_TOKEN(Tokens[77], tok::kw_requires, TT_RequiresClause);
247 
248   Tokens = annotate("void Class::member() && requires(Constant) {}");
249   ASSERT_EQ(Tokens.size(), 14u) << Tokens;
250   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
251 
252   Tokens = annotate("void Class::member() && requires(Constant<T>) {}");
253   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
254   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
255 
256   Tokens =
257       annotate("void Class::member() && requires(Namespace::Constant<T>) {}");
258   ASSERT_EQ(Tokens.size(), 19u) << Tokens;
259   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
260 
261   Tokens = annotate("void Class::member() && requires(typename "
262                     "Namespace::Outer<T>::Inner::Constant) {}");
263   ASSERT_EQ(Tokens.size(), 24u) << Tokens;
264   EXPECT_TOKEN(Tokens[7], tok::kw_requires, TT_RequiresClause);
265 
266   Tokens = annotate("struct [[nodiscard]] zero_t {\n"
267                     "  template<class T>\n"
268                     "    requires requires { number_zero_v<T>; }\n"
269                     "  [[nodiscard]] constexpr operator T() const { "
270                     "return number_zero_v<T>; }\n"
271                     "};");
272   ASSERT_EQ(Tokens.size(), 44u);
273   EXPECT_TOKEN(Tokens[13], tok::kw_requires, TT_RequiresClause);
274   EXPECT_TOKEN(Tokens[14], tok::kw_requires, TT_RequiresExpression);
275   EXPECT_TOKEN(Tokens[15], tok::l_brace, TT_RequiresExpressionLBrace);
276   EXPECT_TOKEN(Tokens[21], tok::r_brace, TT_Unknown);
277   EXPECT_EQ(Tokens[21]->MatchingParen, Tokens[15]);
278   EXPECT_TRUE(Tokens[21]->ClosesRequiresClause);
279 }
280 
281 TEST_F(TokenAnnotatorTest, UnderstandsRequiresExpressions) {
282   auto Tokens = annotate("bool b = requires(int i) { i + 5; };");
283   ASSERT_EQ(Tokens.size(), 16u) << Tokens;
284   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
285   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
286   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
287 
288   Tokens = annotate("if (requires(int i) { i + 5; }) return;");
289   ASSERT_EQ(Tokens.size(), 17u) << Tokens;
290   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
291   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
292   EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_RequiresExpressionLBrace);
293 
294   Tokens = annotate("if (func() && requires(int i) { i + 5; }) return;");
295   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
296   EXPECT_TOKEN(Tokens[6], tok::kw_requires, TT_RequiresExpression);
297   EXPECT_TOKEN(Tokens[7], tok::l_paren, TT_RequiresExpressionLParen);
298   EXPECT_TOKEN(Tokens[11], tok::l_brace, TT_RequiresExpressionLBrace);
299 
300   Tokens = annotate("foo(requires(const T t) {});");
301   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
302   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
303   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
304   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
305 
306   Tokens = annotate("foo(requires(const int t) {});");
307   ASSERT_EQ(Tokens.size(), 13u) << 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[8], tok::l_brace, TT_RequiresExpressionLBrace);
311 
312   Tokens = annotate("foo(requires(const T t) {});");
313   ASSERT_EQ(Tokens.size(), 13u) << Tokens;
314   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
315   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
316   EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace);
317 
318   Tokens = annotate("foo(requires(int const* volatile t) {});");
319   ASSERT_EQ(Tokens.size(), 15u) << 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[10], tok::l_brace, TT_RequiresExpressionLBrace);
323 
324   Tokens = annotate("foo(requires(T const* volatile t) {});");
325   ASSERT_EQ(Tokens.size(), 15u) << 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[10], tok::l_brace, TT_RequiresExpressionLBrace);
329 
330   Tokens =
331       annotate("foo(requires(const typename Outer<T>::Inner * const t) {});");
332   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
333   EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression);
334   EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen);
335   EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace);
336 
337   Tokens = annotate("template <typename T>\n"
338                     "concept C = requires(T T) {\n"
339                     "  requires Bar<T> && Foo<T>;\n"
340                     "};");
341   ASSERT_EQ(Tokens.size(), 28u) << Tokens;
342   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
343   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
344   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
345   EXPECT_TOKEN(Tokens[14], tok::kw_requires,
346                TT_RequiresClauseInARequiresExpression);
347 
348   Tokens = annotate("template <typename T>\n"
349                     "concept C = requires(T T) {\n"
350                     "  { t.func() } -> std::same_as<int>;"
351                     "  requires Bar<T> && Foo<T>;\n"
352                     "};");
353   ASSERT_EQ(Tokens.size(), 43u) << Tokens;
354   EXPECT_TOKEN(Tokens[8], tok::kw_requires, TT_RequiresExpression);
355   EXPECT_TOKEN(Tokens[9], tok::l_paren, TT_RequiresExpressionLParen);
356   EXPECT_TOKEN(Tokens[13], tok::l_brace, TT_RequiresExpressionLBrace);
357   EXPECT_TOKEN(Tokens[29], tok::kw_requires,
358                TT_RequiresClauseInARequiresExpression);
359 
360   // Invalid Code, but we don't want to crash. See http://llvm.org/PR54350.
361   Tokens = annotate("bool r10 = requires (struct new_struct { int x; } s) { "
362                     "requires true; };");
363   ASSERT_EQ(Tokens.size(), 21u) << Tokens;
364   EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression);
365   EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen);
366   EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_RequiresExpressionLBrace);
367 }
368 
369 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
370   auto NumberOfAdditionalRequiresClauseTokens = 5u;
371   auto NumberOfTokensBeforeRequires = 5u;
372 
373   auto BaseTokens = annotate("template<typename T>\n"
374                              "T Pi = 3.14;");
375   auto ConstrainedTokens = annotate("template<typename T>\n"
376                                     "  requires Foo<T>\n"
377                                     "T Pi = 3.14;");
378 
379   auto NumberOfBaseTokens = 11u;
380 
381   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
382   ASSERT_EQ(ConstrainedTokens.size(),
383             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
384       << ConstrainedTokens;
385 
386   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
387     if (I < NumberOfTokensBeforeRequires)
388       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
389     else
390       EXPECT_EQ(*BaseTokens[I],
391                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
392           << I;
393 
394   BaseTokens = annotate("template<typename T>\n"
395                         "struct Bar;");
396   ConstrainedTokens = annotate("template<typename T>\n"
397                                "  requires Foo<T>\n"
398                                "struct Bar;");
399   NumberOfBaseTokens = 9u;
400 
401   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
402   ASSERT_EQ(ConstrainedTokens.size(),
403             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
404       << ConstrainedTokens;
405 
406   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
407     if (I < NumberOfTokensBeforeRequires)
408       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
409     else
410       EXPECT_EQ(*BaseTokens[I],
411                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
412           << I;
413 
414   BaseTokens = annotate("template<typename T>\n"
415                         "struct Bar {"
416                         "  T foo();\n"
417                         "  T bar();\n"
418                         "};");
419   ConstrainedTokens = annotate("template<typename T>\n"
420                                "  requires Foo<T>\n"
421                                "struct Bar {"
422                                "  T foo();\n"
423                                "  T bar();\n"
424                                "};");
425   NumberOfBaseTokens = 21u;
426 
427   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
428   ASSERT_EQ(ConstrainedTokens.size(),
429             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
430       << ConstrainedTokens;
431 
432   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
433     if (I < NumberOfTokensBeforeRequires)
434       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
435     else
436       EXPECT_EQ(*BaseTokens[I],
437                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
438           << I;
439 
440   BaseTokens = annotate("template<typename T>\n"
441                         "Bar(T) -> Bar<T>;");
442   ConstrainedTokens = annotate("template<typename T>\n"
443                                "  requires Foo<T>\n"
444                                "Bar(T) -> Bar<T>;");
445   NumberOfBaseTokens = 16u;
446 
447   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
448   ASSERT_EQ(ConstrainedTokens.size(),
449             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
450       << ConstrainedTokens;
451 
452   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
453     if (I < NumberOfTokensBeforeRequires)
454       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
455     else
456       EXPECT_EQ(*BaseTokens[I],
457                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
458           << I;
459 
460   BaseTokens = annotate("template<typename T>\n"
461                         "T foo();");
462   ConstrainedTokens = annotate("template<typename T>\n"
463                                "  requires Foo<T>\n"
464                                "T foo();");
465   NumberOfBaseTokens = 11u;
466 
467   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
468   ASSERT_EQ(ConstrainedTokens.size(),
469             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
470       << ConstrainedTokens;
471 
472   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
473     if (I < NumberOfTokensBeforeRequires)
474       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
475     else
476       EXPECT_EQ(*BaseTokens[I],
477                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
478           << I;
479 
480   BaseTokens = annotate("template<typename T>\n"
481                         "T foo() {\n"
482                         "  auto bar = baz();\n"
483                         "  return bar + T{};\n"
484                         "}");
485   ConstrainedTokens = annotate("template<typename T>\n"
486                                "  requires Foo<T>\n"
487                                "T foo() {\n"
488                                "  auto bar = baz();\n"
489                                "  return bar + T{};\n"
490                                "}");
491   NumberOfBaseTokens = 26u;
492 
493   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
494   ASSERT_EQ(ConstrainedTokens.size(),
495             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
496       << ConstrainedTokens;
497 
498   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
499     if (I < NumberOfTokensBeforeRequires)
500       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
501     else
502       EXPECT_EQ(*BaseTokens[I],
503                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
504           << I;
505 
506   BaseTokens = annotate("template<typename T>\n"
507                         "T foo();");
508   ConstrainedTokens = annotate("template<typename T>\n"
509                                "T foo() requires Foo<T>;");
510   NumberOfBaseTokens = 11u;
511   NumberOfTokensBeforeRequires = 9u;
512 
513   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
514   ASSERT_EQ(ConstrainedTokens.size(),
515             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
516       << ConstrainedTokens;
517 
518   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
519     if (I < NumberOfTokensBeforeRequires)
520       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
521     else
522       EXPECT_EQ(*BaseTokens[I],
523                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
524           << I;
525 
526   BaseTokens = annotate("template<typename T>\n"
527                         "T foo() {\n"
528                         "  auto bar = baz();\n"
529                         "  return bar + T{};\n"
530                         "}");
531   ConstrainedTokens = annotate("template<typename T>\n"
532                                "T foo() requires Foo<T> {\n"
533                                "  auto bar = baz();\n"
534                                "  return bar + T{};\n"
535                                "}");
536   NumberOfBaseTokens = 26u;
537 
538   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
539   ASSERT_EQ(ConstrainedTokens.size(),
540             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
541       << ConstrainedTokens;
542 
543   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
544     if (I < NumberOfTokensBeforeRequires)
545       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
546     else
547       EXPECT_EQ(*BaseTokens[I],
548                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
549           << I;
550 
551   BaseTokens = annotate("template<typename T>\n"
552                         "Bar(T) -> Bar<typename T::I>;");
553   ConstrainedTokens = annotate("template<typename T>\n"
554                                "  requires requires(T &&t) {\n"
555                                "             typename T::I;\n"
556                                "           }\n"
557                                "Bar(T) -> Bar<typename T::I>;");
558   NumberOfBaseTokens = 19u;
559   NumberOfAdditionalRequiresClauseTokens = 14u;
560   NumberOfTokensBeforeRequires = 5u;
561 
562   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
563   ASSERT_EQ(ConstrainedTokens.size(),
564             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
565       << ConstrainedTokens;
566 
567   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
568     if (I < NumberOfTokensBeforeRequires)
569       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
570     else
571       EXPECT_EQ(*BaseTokens[I],
572                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
573           << I;
574 
575   BaseTokens = annotate("struct [[nodiscard]] zero_t {\n"
576                         "  template<class T>\n"
577                         "  [[nodiscard]] constexpr operator T() const { "
578                         "return number_zero_v<T>; }\n"
579                         "};");
580 
581   ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n"
582                                "  template<class T>\n"
583                                "    requires requires { number_zero_v<T>; }\n"
584                                "  [[nodiscard]] constexpr operator T() const { "
585                                "return number_zero_v<T>; }\n"
586                                "};");
587   NumberOfBaseTokens = 35u;
588   NumberOfAdditionalRequiresClauseTokens = 9u;
589   NumberOfTokensBeforeRequires = 13u;
590 
591   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
592   ASSERT_EQ(ConstrainedTokens.size(),
593             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
594       << ConstrainedTokens;
595 
596   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
597     if (I < NumberOfTokensBeforeRequires)
598       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
599     else
600       EXPECT_EQ(*BaseTokens[I],
601                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
602           << I;
603 }
604 
605 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
606   auto Tokens = annotate("__asm{\n"
607                          "a:\n"
608                          "};");
609   ASSERT_EQ(Tokens.size(), 7u) << Tokens;
610   EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
611   EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
612   EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
613 }
614 
615 } // namespace
616 } // namespace format
617 } // namespace clang
618