diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 193fa5bbb4d..8ad49dedd37 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9761,10 +9761,19 @@ void Tokenizer::simplifyCPPAttribute() Token* atok = nullptr; if (Token::Match(tok->previous(), "%name%")) atok = tok->previous(); - else { + else if (Token::simpleMatch(tok->previous(), "]")) { + atok = tok; + while (atok && Token::simpleMatch(atok->previous(), "]")) { + atok = atok->linkAt(-1); + atok = atok ? atok->previous() : nullptr; + } + if (!Token::Match(atok, "%name%")) + atok = nullptr; + } else { atok = tok; while (isCPPAttribute(atok) || isAlignAttribute(atok)) atok = skipCPPOrAlignAttribute(atok)->next(); + atok = atok ? getVariableTokenAfterAttributes(atok) : atok; } if (atok) { std::string a; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index e59f7b3be62..2b76ce1bed3 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -284,6 +284,9 @@ class TestTokenizer : public TestFixture { TEST_CASE(cppMaybeUnusedAfter2); TEST_CASE(cppMaybeUnusedStructuredBinding); + TEST_CASE(attributeAlignasBefore); + TEST_CASE(attributeAlignasAfter); + TEST_CASE(splitTemplateRightAngleBrackets); TEST_CASE(cpp03template1); @@ -4332,6 +4335,35 @@ class TestTokenizer : public TestFixture { ASSERT(var2 && var2->isAttributeMaybeUnused()); } + void attributeAlignasBefore() { + const char code[] = "alignas(long) unsigned char buffer[sizeof(long)];"; + const char expected[] = "char buffer [ sizeof ( long ) ] ;"; + SimpleTokenizer tokenizer(settings0, *this); + ASSERT(tokenizer.tokenize(code)); + + ASSERT_EQUALS(expected, tokenizer.tokens()->stringifyList(nullptr, false)); + + const Token *var = Token::findsimplematch(tokenizer.tokens(), "buffer"); + ASSERT(var); + ASSERT(var->hasAttributeAlignas()); + ASSERT(var->getAttributeAlignas().size() == 1); + ASSERT_EQUALS(var->getAttributeAlignas()[0], "long"); + } + + void attributeAlignasAfter() { + const char code[] = "unsigned char buffer[sizeof(long)] alignas(long);"; + const char expected[] = "char buffer [ sizeof ( long ) ] ;"; + SimpleTokenizer tokenizer(settings0, *this); + ASSERT(tokenizer.tokenize(code)); + + ASSERT_EQUALS(expected, tokenizer.tokens()->stringifyList(nullptr, false)); + + const Token *var = Token::findsimplematch(tokenizer.tokens(), "buffer"); + ASSERT(var); + ASSERT(var->hasAttributeAlignas()); + ASSERT(var->getAttributeAlignas().size() == 1); + ASSERT_EQUALS(var->getAttributeAlignas()[0], "long"); + } void splitTemplateRightAngleBrackets() { {