diff --git a/lib/token.cpp b/lib/token.cpp index 44b09553605..d7b339b6944 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -965,7 +965,7 @@ const Token * Token::findClosingBracket() const depth -= 2; } // save named template parameter - else if (templateParameter && depth == 1 && closing->str() == "," && + else if (templateParameter && depth == 1 && Token::Match(closing, "[,=]") && closing->previous()->isName() && !Match(closing->previous(), "class|typename|.")) templateParameters.insert(closing->strAt(-1)); } diff --git a/test/testtoken.cpp b/test/testtoken.cpp index 937b5bf57cd..6256abf671b 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -108,6 +108,7 @@ class TestToken : public TestFixture { TEST_CASE(canFindMatchingBracketsWithTooManyOpening); TEST_CASE(findClosingBracket); TEST_CASE(findClosingBracket2); + TEST_CASE(findClosingBracket3); TEST_CASE(expressionString); @@ -1157,6 +1158,14 @@ class TestToken : public TestFixture { ASSERT(t && Token::simpleMatch(t->findClosingBracket(), ">")); } + void findClosingBracket3() { + const SimpleTokenizer var(*this, // #12789 + "template * = nullptr>\n" + "void f();\n"); + const Token* const t = Token::findsimplematch(var.tokens(), "<"); + ASSERT(t && Token::simpleMatch(t->findClosingBracket(), ">")); + } + void expressionString() { const SimpleTokenizer var1(*this, "void f() { *((unsigned long long *)x) = 0; }"); const Token *const tok1 = Token::findsimplematch(var1.tokens(), "*");