xref: /llvm-project/clang/unittests/Format/TokenAnnotatorTest.cpp (revision a140b7104fdae0d9eff5b18efbc784754e0ca274)
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 
361 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
362   auto NumberOfAdditionalRequiresClauseTokens = 5u;
363   auto NumberOfTokensBeforeRequires = 5u;
364 
365   auto BaseTokens = annotate("template<typename T>\n"
366                              "T Pi = 3.14;");
367   auto ConstrainedTokens = annotate("template<typename T>\n"
368                                     "  requires Foo<T>\n"
369                                     "T Pi = 3.14;");
370 
371   auto NumberOfBaseTokens = 11u;
372 
373   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
374   ASSERT_EQ(ConstrainedTokens.size(),
375             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
376       << ConstrainedTokens;
377 
378   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
379     if (I < NumberOfTokensBeforeRequires)
380       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
381     else
382       EXPECT_EQ(*BaseTokens[I],
383                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
384           << I;
385 
386   BaseTokens = annotate("template<typename T>\n"
387                         "struct Bar;");
388   ConstrainedTokens = annotate("template<typename T>\n"
389                                "  requires Foo<T>\n"
390                                "struct Bar;");
391   NumberOfBaseTokens = 9u;
392 
393   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
394   ASSERT_EQ(ConstrainedTokens.size(),
395             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
396       << ConstrainedTokens;
397 
398   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
399     if (I < NumberOfTokensBeforeRequires)
400       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
401     else
402       EXPECT_EQ(*BaseTokens[I],
403                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
404           << I;
405 
406   BaseTokens = annotate("template<typename T>\n"
407                         "struct Bar {"
408                         "  T foo();\n"
409                         "  T bar();\n"
410                         "};");
411   ConstrainedTokens = annotate("template<typename T>\n"
412                                "  requires Foo<T>\n"
413                                "struct Bar {"
414                                "  T foo();\n"
415                                "  T bar();\n"
416                                "};");
417   NumberOfBaseTokens = 21u;
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                         "Bar(T) -> Bar<T>;");
434   ConstrainedTokens = annotate("template<typename T>\n"
435                                "  requires Foo<T>\n"
436                                "Bar(T) -> Bar<T>;");
437   NumberOfBaseTokens = 16u;
438 
439   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
440   ASSERT_EQ(ConstrainedTokens.size(),
441             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
442       << ConstrainedTokens;
443 
444   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
445     if (I < NumberOfTokensBeforeRequires)
446       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
447     else
448       EXPECT_EQ(*BaseTokens[I],
449                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
450           << I;
451 
452   BaseTokens = annotate("template<typename T>\n"
453                         "T foo();");
454   ConstrainedTokens = annotate("template<typename T>\n"
455                                "  requires Foo<T>\n"
456                                "T foo();");
457   NumberOfBaseTokens = 11u;
458 
459   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
460   ASSERT_EQ(ConstrainedTokens.size(),
461             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
462       << ConstrainedTokens;
463 
464   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
465     if (I < NumberOfTokensBeforeRequires)
466       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
467     else
468       EXPECT_EQ(*BaseTokens[I],
469                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
470           << I;
471 
472   BaseTokens = annotate("template<typename T>\n"
473                         "T foo() {\n"
474                         "  auto bar = baz();\n"
475                         "  return bar + T{};\n"
476                         "}");
477   ConstrainedTokens = annotate("template<typename T>\n"
478                                "  requires Foo<T>\n"
479                                "T foo() {\n"
480                                "  auto bar = baz();\n"
481                                "  return bar + T{};\n"
482                                "}");
483   NumberOfBaseTokens = 26u;
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();");
500   ConstrainedTokens = annotate("template<typename T>\n"
501                                "T foo() requires Foo<T>;");
502   NumberOfBaseTokens = 11u;
503   NumberOfTokensBeforeRequires = 9u;
504 
505   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
506   ASSERT_EQ(ConstrainedTokens.size(),
507             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
508       << ConstrainedTokens;
509 
510   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
511     if (I < NumberOfTokensBeforeRequires)
512       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
513     else
514       EXPECT_EQ(*BaseTokens[I],
515                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
516           << I;
517 
518   BaseTokens = annotate("template<typename T>\n"
519                         "T foo() {\n"
520                         "  auto bar = baz();\n"
521                         "  return bar + T{};\n"
522                         "}");
523   ConstrainedTokens = annotate("template<typename T>\n"
524                                "T foo() requires Foo<T> {\n"
525                                "  auto bar = baz();\n"
526                                "  return bar + T{};\n"
527                                "}");
528   NumberOfBaseTokens = 26u;
529 
530   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
531   ASSERT_EQ(ConstrainedTokens.size(),
532             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
533       << ConstrainedTokens;
534 
535   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
536     if (I < NumberOfTokensBeforeRequires)
537       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
538     else
539       EXPECT_EQ(*BaseTokens[I],
540                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
541           << I;
542 
543   BaseTokens = annotate("template<typename T>\n"
544                         "Bar(T) -> Bar<typename T::I>;");
545   ConstrainedTokens = annotate("template<typename T>\n"
546                                "  requires requires(T &&t) {\n"
547                                "             typename T::I;\n"
548                                "           }\n"
549                                "Bar(T) -> Bar<typename T::I>;");
550   NumberOfBaseTokens = 19u;
551   NumberOfAdditionalRequiresClauseTokens = 14u;
552   NumberOfTokensBeforeRequires = 5u;
553 
554   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
555   ASSERT_EQ(ConstrainedTokens.size(),
556             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
557       << ConstrainedTokens;
558 
559   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
560     if (I < NumberOfTokensBeforeRequires)
561       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
562     else
563       EXPECT_EQ(*BaseTokens[I],
564                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
565           << I;
566 
567   BaseTokens = annotate("struct [[nodiscard]] zero_t {\n"
568                         "  template<class T>\n"
569                         "  [[nodiscard]] constexpr operator T() const { "
570                         "return number_zero_v<T>; }\n"
571                         "};");
572 
573   ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n"
574                                "  template<class T>\n"
575                                "    requires requires { number_zero_v<T>; }\n"
576                                "  [[nodiscard]] constexpr operator T() const { "
577                                "return number_zero_v<T>; }\n"
578                                "};");
579   NumberOfBaseTokens = 35u;
580   NumberOfAdditionalRequiresClauseTokens = 9u;
581   NumberOfTokensBeforeRequires = 13u;
582 
583   ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
584   ASSERT_EQ(ConstrainedTokens.size(),
585             NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
586       << ConstrainedTokens;
587 
588   for (auto I = 0u; I < NumberOfBaseTokens; ++I)
589     if (I < NumberOfTokensBeforeRequires)
590       EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
591     else
592       EXPECT_EQ(*BaseTokens[I],
593                 *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
594           << I;
595 }
596 
597 } // namespace
598 } // namespace format
599 } // namespace clang
600