diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index c148b250396..1541375c174 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9542,6 +9542,8 @@ void Tokenizer::simplifyCPPAttribute() Token* head = skipCPPOrAlignAttribute(tok)->next(); while (isCPPAttribute(head) || isAlignAttribute(head)) head = skipCPPOrAlignAttribute(head)->next(); + if (!head) + syntaxError(tok); head->isAttributeMaybeUnused(true); } else if (Token::findsimplematch(tok->tokAt(2), "unused", tok->link())) { Token* head = skipCPPOrAlignAttribute(tok)->next(); diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index b2632e13500..aac83163223 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -257,6 +257,7 @@ class TestGarbage : public TestFixture { TEST_CASE(garbageCode226); TEST_CASE(garbageCode227); TEST_CASE(garbageCode228); + TEST_CASE(garbageCode229); TEST_CASE(garbageCodeFuzzerClientMode1); // test cases created with the fuzzer client, mode 1 @@ -1768,6 +1769,10 @@ class TestGarbage : public TestFixture { ASSERT_NO_THROW(checkCode("void f() { enum { A = [=]() mutable { return 0; }() }; }")); ASSERT_NO_THROW(checkCode("enum { A = [=](void) mutable -> int { return 0; }() };")); } + void garbageCode229() { // #14126 + ASSERT_THROW_INTERNAL(checkCode("void f() {} [[maybe_unused]]"), SYNTAX); + } + void syntaxErrorFirstToken() { ASSERT_THROW_INTERNAL(checkCode("&operator(){[]};"), SYNTAX); // #7818