Skip to content

Commit a852869

Browse files
gedareowenca
authored andcommitted
[clang-format] Fix a bug in parsing function/variable names
Function and variable names are not detected when there is a __attribute__((x)) preceding the name. Fixes #64137. Differential Revision: https://reviews.llvm.org/D156370
1 parent 3161102 commit a852869

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,8 +2246,9 @@ class AnnotatingParser {
22462246
PreviousNotConst->MatchingParen->Previous->isNot(tok::kw_template);
22472247
}
22482248

2249-
if (PreviousNotConst->is(tok::r_paren) &&
2250-
PreviousNotConst->is(TT_TypeDeclarationParen)) {
2249+
if ((PreviousNotConst->is(tok::r_paren) &&
2250+
PreviousNotConst->is(TT_TypeDeclarationParen)) ||
2251+
PreviousNotConst->is(TT_AttributeRParen)) {
22512252
return true;
22522253
}
22532254

clang/unittests/Format/FormatTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16394,8 +16394,10 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
1639416394

1639516395
verifyFormat("int f ();", SpaceFuncDecl);
1639616396
verifyFormat("void f(int a, T b) {}", SpaceFuncDecl);
16397+
verifyFormat("void __attribute__((asdf)) f(int a, T b) {}", SpaceFuncDecl);
1639716398
verifyFormat("A::A() : a(1) {}", SpaceFuncDecl);
1639816399
verifyFormat("void f () __attribute__((asdf));", SpaceFuncDecl);
16400+
verifyFormat("void __attribute__((asdf)) f ();", SpaceFuncDecl);
1639916401
verifyFormat("#define A(x) x", SpaceFuncDecl);
1640016402
verifyFormat("#define A (x) x", SpaceFuncDecl);
1640116403
verifyFormat("#if defined(x)\n"
@@ -16429,8 +16431,10 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
1642916431

1643016432
verifyFormat("int f();", SpaceFuncDef);
1643116433
verifyFormat("void f (int a, T b) {}", SpaceFuncDef);
16434+
verifyFormat("void __attribute__((asdf)) f (int a, T b) {}", SpaceFuncDef);
1643216435
verifyFormat("A::A() : a(1) {}", SpaceFuncDef);
1643316436
verifyFormat("void f() __attribute__((asdf));", SpaceFuncDef);
16437+
verifyFormat("void __attribute__((asdf)) f();", SpaceFuncDef);
1643416438
verifyFormat("#define A(x) x", SpaceFuncDef);
1643516439
verifyFormat("#define A (x) x", SpaceFuncDef);
1643616440
verifyFormat("#if defined(x)\n"

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2313,6 +2313,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsJavaScript) {
23132313
TEST_F(TokenAnnotatorTest, UnderstandsAttributes) {
23142314
auto Tokens = annotate("bool foo __attribute__((unused));");
23152315
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
2316+
EXPECT_TOKEN(Tokens[1], tok::identifier, TT_StartOfName);
23162317
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);
23172318
EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_Unknown);
23182319
EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_Unknown);
@@ -2323,6 +2324,22 @@ TEST_F(TokenAnnotatorTest, UnderstandsAttributes) {
23232324
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_AttributeLParen);
23242325
EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_AttributeRParen);
23252326

2327+
Tokens = annotate("bool __attribute__((unused)) foo;");
2328+
ASSERT_EQ(Tokens.size(), 10u) << Tokens;
2329+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_AttributeLParen);
2330+
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_Unknown);
2331+
EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_Unknown);
2332+
EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_AttributeRParen);
2333+
EXPECT_TOKEN(Tokens[7], tok::identifier, TT_StartOfName);
2334+
2335+
Tokens = annotate("void __attribute__((x)) Foo();");
2336+
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
2337+
EXPECT_TOKEN(Tokens[2], tok::l_paren, TT_AttributeLParen);
2338+
EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_Unknown);
2339+
EXPECT_TOKEN(Tokens[5], tok::r_paren, TT_Unknown);
2340+
EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_AttributeRParen);
2341+
EXPECT_TOKEN(Tokens[7], tok::identifier, TT_FunctionDeclarationName);
2342+
23262343
FormatStyle Style = getLLVMStyle();
23272344
Style.AttributeMacros.push_back("FOO");
23282345
Tokens = annotate("bool foo FOO(unused);", Style);

0 commit comments

Comments
 (0)