Skip to content

Commit

Permalink
[clang-format] Correctly parse C++11 attributes in enum specifiers (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
owenca committed Mar 16, 2024
1 parent 2867095 commit 84b5178
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
15 changes: 9 additions & 6 deletions clang/lib/Format/UnwrappedLineParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1224,7 +1224,6 @@ void UnwrappedLineParser::parsePPUnknown() {
static bool tokenCanStartNewLine(const FormatToken &Tok) {
// Semicolon can be a null-statement, l_square can be a start of a macro or
// a C++11 attribute, but this doesn't seem to be common.
assert(Tok.isNot(TT_AttributeSquare));
return !Tok.isOneOf(tok::semi, tok::l_brace,
// Tokens that can only be used as binary operators and a
// part of overloaded operator names.
Expand Down Expand Up @@ -3712,14 +3711,19 @@ bool UnwrappedLineParser::parseEnum() {
if (Style.Language == FormatStyle::LK_Proto && FormatTok->is(tok::equal))
return false;

// Eat up enum class ...
if (FormatTok->isOneOf(tok::kw_class, tok::kw_struct))
nextToken();
if (IsCpp) {
// Eat up enum class ...
if (FormatTok->isOneOf(tok::kw_class, tok::kw_struct))
nextToken();
while (FormatTok->is(tok::l_square))
if (!handleCppAttributes())
return false;
}

while (FormatTok->Tok.getIdentifierInfo() ||
FormatTok->isOneOf(tok::colon, tok::coloncolon, tok::less,
tok::greater, tok::comma, tok::question,
tok::l_square, tok::r_square)) {
tok::l_square)) {
if (Style.isVerilog()) {
FormatTok->setFinalizedType(TT_VerilogDimensionedTypeName);
nextToken();
Expand All @@ -3732,7 +3736,6 @@ bool UnwrappedLineParser::parseEnum() {
// We can have macros or attributes in between 'enum' and the enum name.
if (FormatTok->is(tok::l_paren))
parseParens();
assert(FormatTok->isNot(TT_AttributeSquare));
if (FormatTok->is(tok::identifier)) {
nextToken();
// If there are two identifiers in a row, this is likely an elaborate
Expand Down
21 changes: 21 additions & 0 deletions clang/unittests/Format/FormatTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3802,6 +3802,27 @@ TEST_F(FormatTest, FormatsEnum) {
" // Comment 2\n"
" TWO,\n"
"};");
verifyFormat("enum [[clang::enum_extensibility(open)]] E {\n"
" // Comment 1\n"
" ONE,\n"
" // Comment 2\n"
" TWO\n"
"};");
verifyFormat("enum [[nodiscard]] [[clang::enum_extensibility(open)]] E {\n"
" // Comment 1\n"
" ONE,\n"
" // Comment 2\n"
" TWO\n"
"};");
verifyFormat("enum [[clang::enum_extensibility(open)]] E { // foo\n"
" A,\n"
" // bar\n"
" B\n"
"};",
"enum [[clang::enum_extensibility(open)]] E{// foo\n"
" A,\n"
" // bar\n"
" B};");

// Not enums.
verifyFormat("enum X f() {\n"
Expand Down

0 comments on commit 84b5178

Please sign in to comment.