From 69d294c6c497d06a1a25f05d127d3408d2d4aa41 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Fri, 16 May 2014 22:17:39 +0200 Subject: [PATCH] Ticket #5816: Skip typename in template arguments for enum initializers. --- lib/tokenize.cpp | 24 +++++++++--------------- test/testsimplifytokens.cpp | 13 +++++++++++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 5fa0b4137..74dd83a52 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7558,23 +7558,17 @@ void Tokenizer::simplifyEnum() enumValueStart = tok1; enumValueEnd = tok1; - int level = 0; - while (enumValueEnd->next() && (!Token::Match(enumValueEnd->next(), "[},]") || level)) { - if (Token::Match(enumValueEnd, "(|[")) - ++level; - else if (Token::Match(enumValueEnd->next(), "]|)")) - --level; - else if (Token::Match(enumValueEnd, "%type% <") && isCPP() && TemplateSimplifier::templateParameters(enumValueEnd->next()) > 1U) { - Token *endtoken = enumValueEnd->tokAt(2); - while ((Token::Match(endtoken,"%any% *| [,>]") || Token::Match(endtoken,"%any% :: %any%")) && (endtoken->isName() || endtoken->isNumber())) { + while (enumValueEnd->next() && (!Token::Match(enumValueEnd->next(), "[},]"))) { + if (Token::Match(enumValueEnd, "(|[")) { + enumValueEnd = enumValueEnd->link(); + continue; + } else if (Token::Match(enumValueEnd, "%type% <") && isCPP() && TemplateSimplifier::templateParameters(enumValueEnd->next()) > 1U) { + Token *endtoken = enumValueEnd->next(); + do { endtoken = endtoken->next(); - if (endtoken->str() == "*") + if (Token::Match(endtoken, "*|,|::|typename")) endtoken = endtoken->next(); - if (endtoken->str() == ",") - endtoken = endtoken->next(); - if (endtoken->str() == "::") - endtoken = endtoken->next(); - } + } while (Token::Match(endtoken, "%var%|%num% *| [,>]") || Token::Match(endtoken, "%var%|%num% :: %any%")); if (endtoken->str() == ">") { enumValueEnd = endtoken; if (Token::simpleMatch(endtoken, "> ( )")) diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 010c94e77..a39f4fe06 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -138,6 +138,7 @@ private: TEST_CASE(template43); // #5097 - assert due to '>>' not treated as end of template instantiation TEST_CASE(template44); // #5297 - TemplateSimplifier::simplifyCalculations not eager enough TEST_CASE(template45); // #5814 - syntax error reported for valid code + TEST_CASE(template46); // #5816 - syntax error reported for valid code TEST_CASE(template_unhandled); TEST_CASE(template_default_parameter); TEST_CASE(template_default_type); @@ -2403,6 +2404,18 @@ private: ASSERT_EQUALS("", errout.str()); } + void template46() { // #5816 + tok("template struct A { static const int value = 0; }; " + "template struct B { " + " enum { value = A::value }; " + "};"); + ASSERT_EQUALS("", errout.str()); + tok("template struct A {}; " + "enum { e = sizeof(A) }; " + "template struct B {};"); + ASSERT_EQUALS("", errout.str()); + } + void template_default_parameter() { { const char code[] = "template \n"