@@ -1279,6 +1279,110 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
1279
1279
EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1280
1280
EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1281
1281
EXPECT_TOKEN (Tokens[7 ], tok::l_brace, TT_LambdaLBrace);
1282
+
1283
+ // Lambdas with a requires-clause
1284
+ Tokens = annotate (" [] <typename T> (T t) requires Bar<T> {}" );
1285
+ ASSERT_EQ (Tokens.size (), 18u ) << Tokens;
1286
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1287
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1288
+ EXPECT_TOKEN (Tokens[10 ], tok::kw_requires, TT_RequiresClause);
1289
+ EXPECT_TRUE (Tokens[14 ]->ClosesRequiresClause );
1290
+ EXPECT_TOKEN (Tokens[15 ], tok::l_brace, TT_LambdaLBrace);
1291
+
1292
+ Tokens = annotate (" [] <typename T> (T &&t) requires Bar<T> {}" );
1293
+ ASSERT_EQ (Tokens.size (), 19u ) << Tokens;
1294
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1295
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1296
+ EXPECT_TOKEN (Tokens[8 ], tok::ampamp, TT_PointerOrReference);
1297
+ EXPECT_TOKEN (Tokens[11 ], tok::kw_requires, TT_RequiresClause);
1298
+ EXPECT_TRUE (Tokens[15 ]->ClosesRequiresClause );
1299
+ EXPECT_TOKEN (Tokens[16 ], tok::l_brace, TT_LambdaLBrace);
1300
+
1301
+ Tokens = annotate (" [] <typename T> (T t) requires Foo<T> || Bar<T> {}" );
1302
+ ASSERT_EQ (Tokens.size (), 23u ) << Tokens;
1303
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1304
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1305
+ EXPECT_TOKEN (Tokens[10 ], tok::kw_requires, TT_RequiresClause);
1306
+ EXPECT_TRUE (Tokens[19 ]->ClosesRequiresClause );
1307
+ EXPECT_TOKEN (Tokens[20 ], tok::l_brace, TT_LambdaLBrace);
1308
+
1309
+ Tokens = annotate (" [] <typename T> (T t) -> T requires Bar<T> {}" );
1310
+ ASSERT_EQ (Tokens.size (), 20u ) << Tokens;
1311
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1312
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1313
+ EXPECT_TOKEN (Tokens[10 ], tok::arrow, TT_LambdaArrow);
1314
+ EXPECT_TOKEN (Tokens[12 ], tok::kw_requires, TT_RequiresClause);
1315
+ EXPECT_TRUE (Tokens[16 ]->ClosesRequiresClause );
1316
+ EXPECT_TOKEN (Tokens[17 ], tok::l_brace, TT_LambdaLBrace);
1317
+
1318
+ Tokens = annotate (" [] <typename T> requires Bar<T> (T t) {}" );
1319
+ ASSERT_EQ (Tokens.size (), 18u ) << Tokens;
1320
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1321
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1322
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1323
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1324
+ EXPECT_TOKEN (Tokens[15 ], tok::l_brace, TT_LambdaLBrace);
1325
+
1326
+ Tokens = annotate (" [] <typename T> requires Bar<T> (T &&t) {}" );
1327
+ ASSERT_EQ (Tokens.size (), 19u ) << Tokens;
1328
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1329
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1330
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1331
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1332
+ EXPECT_TOKEN (Tokens[13 ], tok::ampamp, TT_PointerOrReference);
1333
+ EXPECT_TOKEN (Tokens[16 ], tok::l_brace, TT_LambdaLBrace);
1334
+
1335
+ Tokens = annotate (" [] <typename T> requires Foo<T> || Bar<T> (T t) {}" );
1336
+ ASSERT_EQ (Tokens.size (), 23u ) << Tokens;
1337
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1338
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1339
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1340
+ EXPECT_TRUE (Tokens[15 ]->ClosesRequiresClause );
1341
+ EXPECT_TOKEN (Tokens[20 ], tok::l_brace, TT_LambdaLBrace);
1342
+
1343
+ Tokens = annotate (" [] <typename T> requires true (T&& t) {}" );
1344
+ ASSERT_EQ (Tokens.size (), 16u ) << Tokens;
1345
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1346
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1347
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1348
+ EXPECT_TRUE (Tokens[7 ]->ClosesRequiresClause );
1349
+ EXPECT_TOKEN (Tokens[10 ], tok::ampamp, TT_PointerOrReference);
1350
+ EXPECT_TOKEN (Tokens[13 ], tok::l_brace, TT_LambdaLBrace);
1351
+
1352
+ Tokens = annotate (" [] <typename T> requires Bar<T> {}" );
1353
+ ASSERT_EQ (Tokens.size (), 14u ) << Tokens;
1354
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1355
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1356
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1357
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1358
+ EXPECT_TOKEN (Tokens[11 ], tok::l_brace, TT_LambdaLBrace);
1359
+
1360
+ Tokens = annotate (" [] <typename T> requires Bar<T> noexcept {}" );
1361
+ ASSERT_EQ (Tokens.size (), 15u ) << Tokens;
1362
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1363
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1364
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1365
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1366
+ EXPECT_TOKEN (Tokens[12 ], tok::l_brace, TT_LambdaLBrace);
1367
+
1368
+ Tokens = annotate (" [] <typename T> requires Bar<T> -> T {}" );
1369
+ ASSERT_EQ (Tokens.size (), 16u ) << Tokens;
1370
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1371
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1372
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1373
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1374
+ EXPECT_TOKEN (Tokens[11 ], tok::arrow, TT_LambdaArrow);
1375
+ EXPECT_TOKEN (Tokens[13 ], tok::l_brace, TT_LambdaLBrace);
1376
+
1377
+ Tokens = annotate (" [] <typename T> requires Foo<T> (T t) requires Bar<T> {}" );
1378
+ ASSERT_EQ (Tokens.size (), 23u ) << Tokens;
1379
+ EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
1380
+ EXPECT_TOKEN (Tokens[2 ], tok::less, TT_TemplateOpener);
1381
+ EXPECT_TOKEN (Tokens[6 ], tok::kw_requires, TT_RequiresClause);
1382
+ EXPECT_TRUE (Tokens[10 ]->ClosesRequiresClause );
1383
+ EXPECT_TOKEN (Tokens[15 ], tok::kw_requires, TT_RequiresClause);
1384
+ EXPECT_TRUE (Tokens[19 ]->ClosesRequiresClause );
1385
+ EXPECT_TOKEN (Tokens[20 ], tok::l_brace, TT_LambdaLBrace);
1282
1386
}
1283
1387
1284
1388
TEST_F (TokenAnnotatorTest, UnderstandsFunctionAnnotations) {
0 commit comments