From 45fc6a0eebd4611b7d8732387285773f8593c540 Mon Sep 17 00:00:00 2001 From: shaneasd Date: Tue, 25 Aug 2020 13:14:44 +0800 Subject: [PATCH] Test for syntax error in nested templates (#2746) --- lib/templatesimplifier.cpp | 14 +++++++++----- lib/token.cpp | 2 +- test/testsimplifytemplate.cpp | 13 +++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index a045cd69d..953f2dede 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -243,6 +243,10 @@ void TemplateSimplifier::fixAngleBrackets() if (endTok && endTok->str() == ">>") { endTok->str(">"); endTok->insertToken(">"); + } else if (endTok && endTok->str() == ">>=") { + endTok->str(">"); + endTok->insertToken("="); + endTok->insertToken(">"); } } else if (Token::Match(tok, "class|struct|union|=|:|public|protected|private %name% <")) { Token *endTok = tok->tokAt(2)->findClosingBracket(); @@ -432,7 +436,7 @@ unsigned int TemplateSimplifier::templateParameters(const Token *tok) if (closing->str() == ">>") return numberOfParameters; tok = closing->next(); - if (tok->str() == ">" || tok->str() == ">>") + if (Token::Match(tok, ">|>>|>>=")) return numberOfParameters; else if (tok->str() == ",") { ++numberOfParameters; @@ -467,7 +471,7 @@ unsigned int TemplateSimplifier::templateParameters(const Token *tok) if (level == 0) return numberOfParameters; --level; - } else if (tok->str() == ">>") { + } else if (tok->str() == ">>" || tok->str() == ">>=") { if (level == 1) return numberOfParameters; level -= 2; @@ -493,7 +497,7 @@ unsigned int TemplateSimplifier::templateParameters(const Token *tok) return 0; if (tok->str() == ">" && level == 0) return numberOfParameters; - else if (tok->str() == ">>" && level == 1) + else if ((tok->str() == ">>" || tok->str() == ">>=") && level == 1) return numberOfParameters; else if (tok->str() == ",") { if (level == 0) @@ -550,11 +554,11 @@ unsigned int TemplateSimplifier::templateParameters(const Token *tok) return 0; // ,/> - while (Token::Match(tok, ">|>>")) { + while (Token::Match(tok, ">|>>|>>=")) { if (level == 0) return tok->str() == ">" && !Token::Match(tok->next(), "%num%") ? numberOfParameters : 0; --level; - if (tok->str() == ">>") { + if (tok->str() == ">>" || tok->str() == ">>=") { if (level == 0) return !Token::Match(tok->next(), "%num%") ? numberOfParameters : 0; --level; diff --git a/lib/token.cpp b/lib/token.cpp index 3f9e72f92..79c43fb12 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -885,7 +885,7 @@ const Token * Token::findClosingBracket() const else if (closing->str() == ">") { if (--depth == 0) return closing; - } else if (closing->str() == ">>") { + } else if (closing->str() == ">>" || closing->str() == ">>=") { if (depth <= 2) return closing; depth -= 2; diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index eb520527c..631bf7982 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -4119,6 +4119,19 @@ private: " A a;\n" "};\n"); ASSERT_EQUALS("", errout.str()); + + //both of these should work but in cppcheck 2.1 only the first option will work (ticket #9843) + { + const std::string expected = "template < long Num > const bool foo < bar < Num > > = true ;"; + ASSERT_EQUALS(expected, + tok("template \n" + "constexpr bool foo > = true;\n")); + ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS(expected, + tok("template \n" + "constexpr bool foo> = true;\n")); + ASSERT_EQUALS("", errout.str()); + } } void template_member_ptr() { // Ticket #5786