From e8b37235d623ad7b711a0651749ccf714d8f62d8 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:25:05 +0100 Subject: [PATCH] Fix #11378 internalAstError regressions (iscpp11init) (#4580) --- lib/tokenlist.cpp | 10 +++++++--- test/testtokenize.cpp | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index a1d0ba0a6..a0fbb7395 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -692,7 +692,7 @@ static bool iscpp11init_impl(const Token * const tok) return true; const Token *prev = nameToken; while (Token::Match(prev, "%name%|::|:|<|>|,")) { - if (Token::Match(prev, "class|struct")) + if (Token::Match(prev, "class|struct|union|enum")) return false; prev = prev->previous(); @@ -996,8 +996,12 @@ static void compilePrecedence2(Token *&tok, AST_state& state) Token* curlyBracket = roundBracket->link()->next(); while (Token::Match(curlyBracket, "mutable|const|constexpr|consteval")) curlyBracket = curlyBracket->next(); - if (Token::simpleMatch(curlyBracket, "noexcept (")) - curlyBracket = curlyBracket->linkAt(1)->next(); + if (Token::simpleMatch(curlyBracket, "noexcept")) { + if (Token::simpleMatch(curlyBracket->next(), "(")) + curlyBracket = curlyBracket->linkAt(1)->next(); + else + curlyBracket = curlyBracket->next(); + } if (curlyBracket && curlyBracket->originalName() == "->") curlyBracket = findTypeEnd(curlyBracket->next()); if (curlyBracket && curlyBracket->str() == "{") { diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 4410197e8..270f5870b 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6533,6 +6533,9 @@ private: " return a < b;\n" " });\n" "}\n")); + + // #11378 + ASSERT_EQUALS("gT{(&[{= 0return", testAst("auto g = T{ [&]() noexcept -> int { return 0; } };")); } void astcase() { @@ -7493,6 +7496,10 @@ private: testIsCpp11init("namespace { TEST(a, b) {} }", // anonymous namespace "{ TEST", TokenImpl::Cpp11init::NOINIT); + + testIsCpp11init("enum { e = decltype(s)::i };", + "{ e", + TokenImpl::Cpp11init::NOINIT); #undef testIsCpp11init } };