[clang] 70d7ea0 - [clang-format] Handle goto labels preceded by C++11 attributes
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 2 22:49:06 PDT 2023
Author: Owen Pan
Date: 2023-08-02T22:48:48-07:00
New Revision: 70d7ea0cebcf363cd0ddcfb76375fb5fada87dd5
URL: https://github.com/llvm/llvm-project/commit/70d7ea0cebcf363cd0ddcfb76375fb5fada87dd5
DIFF: https://github.com/llvm/llvm-project/commit/70d7ea0cebcf363cd0ddcfb76375fb5fada87dd5.diff
LOG: [clang-format] Handle goto labels preceded by C++11 attributes
Fixes #64229.
Differential Revision: https://reviews.llvm.org/D156655
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 22fa651ae96bca..2d34837a4fac04 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1402,7 +1402,10 @@ void UnwrappedLineParser::parseStructuralElement(
return;
}
- if (Style.isVerilog()) {
+ if (Style.isCpp()) {
+ while (FormatTok->is(tok::l_square) && handleCppAttributes()) {
+ }
+ } else if (Style.isVerilog()) {
if (Keywords.isVerilogStructuredProcedure(*FormatTok)) {
parseForOrWhileLoop(/*HasParens=*/false);
return;
@@ -1638,6 +1641,17 @@ void UnwrappedLineParser::parseStructuralElement(
parseNamespace();
return;
}
+ // In Verilog labels can be any expression, so we don't do them here.
+ if (!Style.isVerilog() && Tokens->peekNextToken()->is(tok::colon) &&
+ !Line->MustBeDeclaration) {
+ nextToken();
+ Line->Tokens.begin()->Tok->MustBreakBefore = true;
+ FormatTok->setFinalizedType(TT_GotoLabelColon);
+ parseLabel(!Style.IndentGotoLabels);
+ if (HasLabel)
+ *HasLabel = true;
+ return;
+ }
// In all other cases, parse the declaration.
break;
default:
@@ -1942,16 +1956,6 @@ void UnwrappedLineParser::parseStructuralElement(
return I != E && (++I == E);
};
if (OneTokenSoFar()) {
- // In Verilog labels can be any expression, so we don't do them here.
- if (!Style.isVerilog() && FormatTok->is(tok::colon) &&
- !Line->MustBeDeclaration) {
- Line->Tokens.begin()->Tok->MustBreakBefore = true;
- FormatTok->setFinalizedType(TT_GotoLabelColon);
- parseLabel(!Style.IndentGotoLabels);
- if (HasLabel)
- *HasLabel = true;
- return;
- }
// Recognize function-like macro usages without trailing semicolon as
// well as free-standing macros like Q_OBJECT.
bool FunctionLike = FormatTok->is(tok::l_paren);
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 3ed97c00c77b18..1a1109f281b442 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -3023,6 +3023,26 @@ TEST_F(FormatTest, FormatsLabels) {
" some_other_code();\n"
"}\n"
"}");
+ verifyFormat("{\n"
+ "L0:\n"
+ "[[foo]] L1:\n"
+ "[[bar]] [[baz]] L2:\n"
+ " g();\n"
+ "}");
+ verifyFormat("{\n"
+ "[[foo]] L1: {\n"
+ "[[bar]] [[baz]] L2:\n"
+ " g();\n"
+ "}\n"
+ "}");
+ verifyFormat("{\n"
+ "[[foo]] L1:\n"
+ " f();\n"
+ " {\n"
+ " [[bar]] [[baz]] L2:\n"
+ " g();\n"
+ " }\n"
+ "}");
FormatStyle Style = getLLVMStyle();
Style.IndentGotoLabels = false;
verifyFormat("void f() {\n"
@@ -3046,12 +3066,22 @@ TEST_F(FormatTest, FormatsLabels) {
" some_code();\n"
"test_label:;\n"
" int i = 0;\n"
- "}");
+ "}",
+ Style);
verifyFormat("{\n"
" some_code();\n"
"test_label: { some_other_code(); }\n"
"}",
Style);
+ verifyFormat("{\n"
+ "[[foo]] L1:\n"
+ " f();\n"
+ " {\n"
+ "[[bar]] [[baz]] L2:\n"
+ " g();\n"
+ " }\n"
+ "}",
+ Style);
// The opening brace may either be on the same unwrapped line as the colon or
// on a separate one. The formatter should recognize both.
Style = getLLVMStyle();
@@ -3064,6 +3094,14 @@ TEST_F(FormatTest, FormatsLabels) {
"}\n"
"}",
Style);
+ verifyFormat("{\n"
+ "[[foo]] L1:\n"
+ "{\n"
+ "[[bar]] [[baz]] L2:\n"
+ " g();\n"
+ "}\n"
+ "}",
+ Style);
}
TEST_F(FormatTest, MultiLineControlStatements) {
More information about the cfe-commits
mailing list