diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index d2ad6f581e7..4475bfcb44f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9780,7 +9780,7 @@ void Tokenizer::simplifyCPPAttribute() if (!head) syntaxError(tok); - if (Token::simpleMatch(head, ";")) { + if (Token::Match(head, ";|,|)")) { Token *backTok = tok; while (Token::Match(backTok, "]|[|)")) { if (Token::Match(backTok, "]|)")) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 0617007744a..e33c98861c7 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -290,6 +290,7 @@ class TestTokenizer : public TestFixture { TEST_CASE(cppMaybeUnusedBefore); TEST_CASE(cppMaybeUnusedAfter1); TEST_CASE(cppMaybeUnusedAfter2); + TEST_CASE(cppMaybeUnusedAfter3); TEST_CASE(cppMaybeUnusedStructuredBinding); TEST_CASE(attributeAlignasBefore); @@ -4381,6 +4382,19 @@ class TestTokenizer : public TestFixture { ASSERT(var && var->isAttributeMaybeUnused()); } + void cppMaybeUnusedAfter3() { + const char code[] = "void foo(int x [[maybe_unused]]) {}"; + const char expected[] = "void foo ( int x ) { }"; + + SimpleTokenizer tokenizer(settingsDefault, *this); + ASSERT(tokenizer.tokenize(code)); + + ASSERT_EQUALS(expected, tokenizer.tokens()->stringifyList(nullptr, false)); + + const Token *x = Token::findsimplematch(tokenizer.tokens(), "x"); + ASSERT(x && x->isAttributeMaybeUnused()); + } + void cppMaybeUnusedStructuredBinding() { const char code[] = "[[maybe_unused]] auto [var1, var2] = f();"; const char expected[] = "auto [ var1 , var2 ] = f ( ) ;";