diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index a4104eb79..9af091fc1 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9405,8 +9405,12 @@ void Tokenizer::findGarbageCode() const for (const Token *tok = tokens(); tok; tok = tok->next()) { if (!Token::simpleMatch(tok, "template <")) continue; - if (tok->previous() && !Token::Match(tok->previous(), "[:;{})>]")) - syntaxError(tok); + if (tok->previous() && !Token::Match(tok->previous(), "[:;{})>]")) { + if (tok->previous()->isUpperCaseName()) + unknownMacroError(tok->previous()); + else + syntaxError(tok); + } const Token * const tok1 = tok; tok = tok->next()->findClosingBracket(); if (!tok) diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index 38d95f357..3a1d5dfb4 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -186,6 +186,7 @@ private: TEST_CASE(template146); // syntax error TEST_CASE(template147); // syntax error TEST_CASE(template148); // syntax error + TEST_CASE(template149); // unknown macro TEST_CASE(template_specialization_1); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_specialization_2); // #7868 - template specialization template struct S> {..}; TEST_CASE(template_enum); // #6299 Syntax error in complex enum declaration (including template) @@ -3543,6 +3544,13 @@ private: ASSERT_EQUALS(exp, tok(code)); } + void template149() { // unknown macro + const char code[] = "BEGIN_VERSIONED_NAMESPACE_DECL\n" + "template class Fred { };\n" + "END_VERSIONED_NAMESPACE_DECL"; + ASSERT_THROW_EQUALS(tok(code), InternalError, "There is an unknown macro here somewhere. Configuration is required. If BEGIN_VERSIONED_NAMESPACE_DECL is a macro then please configure it."); + } + void template_specialization_1() { // #7868 - template specialization template struct S> {..}; const char code[] = "template struct C {};\n" "template struct S {a};\n" diff --git a/test/testsuite.h b/test/testsuite.h index f00e18922..b6aafd4ab 100644 --- a/test/testsuite.h +++ b/test/testsuite.h @@ -104,6 +104,7 @@ extern std::ostringstream output; #define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE) #define ASSERT_EQUALS_MSG( EXPECTED , ACTUAL, MSG ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL, MSG) #define ASSERT_THROW( CMD, EXCEPTION ) try { CMD ; assertThrowFail(__FILE__, __LINE__); } catch (const EXCEPTION&) { } catch (...) { assertThrowFail(__FILE__, __LINE__); } +#define ASSERT_THROW_EQUALS( CMD, EXCEPTION, EXPECTED ) try { CMD ; assertThrowFail(__FILE__, __LINE__); } catch (const EXCEPTION&e) { assertEquals(__FILE__, __LINE__, EXPECTED, e.errorMessage); } catch (...) { assertThrowFail(__FILE__, __LINE__); } #define ASSERT_NO_THROW( CMD ) try { CMD ; } catch (...) { assertNoThrowFail(__FILE__, __LINE__); } #define TODO_ASSERT_THROW( CMD, EXCEPTION ) try { CMD ; } catch (const EXCEPTION&) { } catch (...) { assertThrow(__FILE__, __LINE__); } #define TODO_ASSERT( CONDITION ) { const bool condition=(CONDITION); todoAssertEquals(__FILE__, __LINE__, true, false, condition); }