[clang] a02c3af - [clang-format] Don't annotate left brace of class as FunctionLBrace
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 6 13:07:32 PST 2023
Author: Owen Pan
Date: 2023-03-06T13:07:23-08:00
New Revision: a02c3af9f19d805411364e7a0de785c1d1c4e348
URL: https://github.com/llvm/llvm-project/commit/a02c3af9f19d805411364e7a0de785c1d1c4e348
DIFF: https://github.com/llvm/llvm-project/commit/a02c3af9f19d805411364e7a0de785c1d1c4e348.diff
LOG: [clang-format] Don't annotate left brace of class as FunctionLBrace
The l_brace of class/struct/union was incorrectly annotated as
TT_FunctionLBrace in the presence of attributes. This in turn
would cause the RemoveSemicolon option to remove the semicolon
at the end of the declaration, resulting in invalid code being
generated.
Fixes #61188.
Differential Revision: https://reviews.llvm.org/D145344
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index fb7b7be453c1f..bf613db2b2aef 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -3701,13 +3701,13 @@ void UnwrappedLineParser::parseJavaEnumBody() {
void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
const FormatToken &InitialToken = *FormatTok;
nextToken();
+ handleAttributes();
// The actual identifier can be a nested name specifier, and in macros
// it is often token-pasted.
- // An [[attribute]] can be before the identifier.
while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash,
tok::kw___attribute, tok::kw___declspec,
- tok::kw_alignas, tok::l_square, tok::r_square) ||
+ tok::kw_alignas) ||
((Style.Language == FormatStyle::LK_Java || Style.isJavaScript()) &&
FormatTok->isOneOf(tok::period, tok::comma))) {
if (Style.isJavaScript() &&
@@ -3725,15 +3725,10 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
FormatTok->is(tok::identifier) &&
FormatTok->TokenText != FormatTok->TokenText.upper();
nextToken();
- // We can have macros or attributes in between 'class' and the class name.
+ // We can have macros in between 'class' and the class name.
if (!IsNonMacroIdentifier) {
if (FormatTok->is(tok::l_paren)) {
parseParens();
- } else if (FormatTok->is(TT_AttributeSquare)) {
- parseSquare();
- // Consume the closing TT_AttributeSquare.
- if (FormatTok->Next && FormatTok->is(TT_AttributeSquare))
- nextToken();
}
}
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index f200c498956e4..bd0d328719bae 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -25233,6 +25233,11 @@ TEST_F(FormatTest, RemoveSemicolon) {
"}",
Style);
+ verifyFormat("class [[deprecated(\"\")]] C {\n"
+ " int i;\n"
+ "};",
+ Style);
+
verifyIncompleteFormat("class C final [[deprecated(l]] {});", Style);
// These tests are here to show a problem that may not be easily
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index b138abc3a9476..848dab13c8831 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -345,6 +345,10 @@ TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
Tokens = annotate("const class {} c;");
EXPECT_EQ(Tokens.size(), 7u) << Tokens;
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
+
+ Tokens = annotate("class [[deprecated(\"\")]] C { int i; };");
+ EXPECT_EQ(Tokens.size(), 17u) << Tokens;
+ EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_ClassLBrace);
}
TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
More information about the cfe-commits
mailing list