From bd95efc987465d2c3a98c6e795e5842108b5ab87 Mon Sep 17 00:00:00 2001 From: gerboengels Date: Sat, 5 Nov 2022 22:41:13 +0100 Subject: [PATCH] Fix internal error "Unexpected tokens in initializer" with anonymous namespace (#4577) Co-authored-by: Gerbo Engels --- lib/tokenlist.cpp | 2 +- test/testtokenize.cpp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index d4217b232..f0d69caff 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -675,7 +675,7 @@ static bool iscpp11init_impl(const Token * const tok) return false; if (Token::simpleMatch(nameToken->previous(), ". void {") && nameToken->previous()->originalName() == "->") return false; // trailing return type. The only function body that can contain no semicolon is a void function. - if (Token::simpleMatch(nameToken->previous(), "namespace")) + if (Token::simpleMatch(nameToken->previous(), "namespace") || Token::simpleMatch(nameToken, "namespace") /*anonymous namespace*/) return false; if (endtok != nullptr && !Token::Match(nameToken, "return|:")) { // If there is semicolon between {..} this is not a initlist diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 165fbb288..dc0477197 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7483,6 +7483,13 @@ private: testIsCpp11init("class X{}", // forgotten ; so not properly recognized as a class "{ }", TokenImpl::Cpp11init::CPP11INIT); + + testIsCpp11init("namespace abc::def { TEST(a, b) {} }", + "{ TEST", + TokenImpl::Cpp11init::NOINIT); + testIsCpp11init("namespace { TEST(a, b) {} }", // anonymous namespace + "{ TEST", + TokenImpl::Cpp11init::NOINIT); #undef testIsCpp11init } };