diff --git a/lib/token.cpp b/lib/token.cpp index 1188a75c6f6c..d52b1f0e38e2 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -897,7 +897,7 @@ const Token * Token::findClosingBracket() const } // save named template parameter else if (templateParameter && depth == 1 && Token::Match(closing, "[,=]") && - closing->previous()->isName() && !Token::Match(closing->previous(), "class|typename|.")) + closing->previous()->isName() && !Token::Match(closing->previous(), "class|typename|.") && !Token::Match(closing->previous()->previous(), "=|::")) templateParameters.insert(closing->strAt(-1)); } diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 0f4e8bd0563d..4d6bbf83d7e5 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -109,6 +109,7 @@ class TestToken : public TestFixture { TEST_CASE(findClosingBracket); TEST_CASE(findClosingBracket2); TEST_CASE(findClosingBracket3); + TEST_CASE(findClosingBracket4); TEST_CASE(expressionString); @@ -1190,6 +1191,16 @@ class TestToken : public TestFixture { ASSERT(t && Token::simpleMatch(t->findClosingBracket(), ">")); } + void findClosingBracket4() { + const SimpleTokenizer var(*this, // #12923 + "template class T = std::vector, class U = std::vector, class V = void>\n" + "class C;\n"); + const Token *const t = Token::findsimplematch(var.tokens(), "<"); + ASSERT(t); + const Token *const closing = t->findClosingBracket(); + ASSERT(closing && closing == var.tokens()->tokAt(28)); + } + void expressionString() { const SimpleTokenizer var1(*this, "void f() { *((unsigned long long *)x) = 0; }"); const Token *const tok1 = Token::findsimplematch(var1.tokens(), "*");