Skip to content

Commit a10135f

Browse files
gedareowenca
andauthored
[clang-format]: Annotate colons found in inline assembly (#92617)
Short-circuit the parsing of tok::colon to label colons found within lines starting with asm as InlineASMColon. Fixes #92616. --------- Co-authored-by: Owen Pan <[email protected]>
1 parent c967c7e commit a10135f

File tree

2 files changed

+76
-11
lines changed

2 files changed

+76
-11
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,8 @@ class AnnotatingParser {
13581358
Line.First->startsSequence(tok::kw_export, Keywords.kw_module) ||
13591359
Line.First->startsSequence(tok::kw_export, Keywords.kw_import)) {
13601360
Tok->setType(TT_ModulePartitionColon);
1361+
} else if (Line.First->is(tok::kw_asm)) {
1362+
Tok->setType(TT_InlineASMColon);
13611363
} else if (Contexts.back().ColonIsDictLiteral || Style.isProto()) {
13621364
Tok->setType(TT_DictLiteral);
13631365
if (Style.Language == FormatStyle::LK_TextProto) {
@@ -1425,13 +1427,6 @@ class AnnotatingParser {
14251427
// This handles a special macro in ObjC code where selectors including
14261428
// the colon are passed as macro arguments.
14271429
Tok->setType(TT_ObjCMethodExpr);
1428-
} else if (Contexts.back().ContextKind == tok::l_paren &&
1429-
!Line.InPragmaDirective) {
1430-
if (Style.isTableGen() && Contexts.back().IsTableGenDAGArg) {
1431-
Tok->setType(TT_TableGenDAGArgListColon);
1432-
break;
1433-
}
1434-
Tok->setType(TT_InlineASMColon);
14351430
}
14361431
break;
14371432
case tok::pipe:

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,12 +1496,82 @@ TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
14961496

14971497
TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
14981498
auto Tokens = annotate("__asm{\n"
1499-
"a:\n"
1500-
"};");
1501-
ASSERT_EQ(Tokens.size(), 7u) << Tokens;
1499+
"\"a\":\n"
1500+
": x\n"
1501+
":};");
1502+
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
15021503
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
15031504
EXPECT_TOKEN(Tokens[1], tok::l_brace, TT_InlineASMBrace);
1504-
EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_InlineASMBrace);
1505+
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
1506+
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
1507+
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
1508+
EXPECT_TOKEN(Tokens[7], tok::r_brace, TT_InlineASMBrace);
1509+
1510+
Tokens = annotate("__asm(\n"
1511+
"\"a\":\n"
1512+
": x\n"
1513+
":);");
1514+
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
1515+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1516+
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
1517+
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
1518+
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
1519+
1520+
Tokens = annotate("asm volatile (\n"
1521+
"\"a_label:\"\n"
1522+
":\n"
1523+
": x\n"
1524+
":);");
1525+
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
1526+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1527+
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
1528+
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
1529+
EXPECT_TOKEN(Tokens[7], tok::colon, TT_InlineASMColon);
1530+
1531+
Tokens = annotate("__asm__(\n"
1532+
"\"a_label:\"\n"
1533+
": x\n"
1534+
":\n"
1535+
": y);");
1536+
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
1537+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1538+
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
1539+
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
1540+
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
1541+
1542+
Tokens = annotate("__asm volatile (\n"
1543+
"\"a_label:\"\n"
1544+
"\"a b c(%%x)\"\n"
1545+
":\n"
1546+
": x\n"
1547+
":);");
1548+
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
1549+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1550+
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
1551+
EXPECT_TOKEN(Tokens[6], tok::colon, TT_InlineASMColon);
1552+
EXPECT_TOKEN(Tokens[8], tok::colon, TT_InlineASMColon);
1553+
1554+
Tokens = annotate("asm(\n"
1555+
"\"insn\"\n"
1556+
": \"=r\" (var1), \"=&r\" (value)\n"
1557+
":\n"
1558+
": \"memory\");");
1559+
ASSERT_EQ(Tokens.size(), 19u) << Tokens;
1560+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1561+
EXPECT_TOKEN(Tokens[3], tok::colon, TT_InlineASMColon);
1562+
EXPECT_TOKEN(Tokens[13], tok::colon, TT_InlineASMColon);
1563+
EXPECT_TOKEN(Tokens[14], tok::colon, TT_InlineASMColon);
1564+
1565+
Tokens = annotate("__asm__ volatile (\n"
1566+
"\"ldr r1, [r0, %%[sym]]\"\n"
1567+
":\n"
1568+
": [sym] \"J\" (aaaaa(aaaa, aaaa))\n"
1569+
");");
1570+
ASSERT_EQ(Tokens.size(), 21u) << Tokens;
1571+
EXPECT_TOKEN(Tokens[0], tok::kw_asm, TT_Unknown);
1572+
EXPECT_TOKEN(Tokens[4], tok::colon, TT_InlineASMColon);
1573+
EXPECT_TOKEN(Tokens[5], tok::colon, TT_InlineASMColon);
1574+
EXPECT_TOKEN(Tokens[6], tok::l_square, TT_InlineASMSymbolicNameLSquare);
15051575
}
15061576

15071577
TEST_F(TokenAnnotatorTest, UnderstandsObjCBlock) {

0 commit comments

Comments
 (0)