diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 40d974a9a..336329b79 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2788,6 +2788,20 @@ void Tokenizer::setVarId() if (decl) { variableId[prev2->str()] = ++_varId; + + // set varid for template parameters.. + tok = tok->next(); + while (Token::Match(tok, "%name%|::")) + tok = tok->next(); + if (tok && tok->str() == "<") { + const Token *end = tok->findClosingBracket(); + while (tok != end) { + if (tok->isName() && variableId.find(tok->str()) != variableId.end()) + tok->varId(variableId[tok->str()]); + tok = tok->next(); + } + } + tok = tok2->previous(); } } diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 1e0995e8d..9d3ca4f4e 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -135,6 +135,7 @@ private: TEST_CASE(varid_templatePtr); // #4319 TEST_CASE(varid_templateNamespaceFuncPtr); // #4172 TEST_CASE(varid_templateArray); + TEST_CASE(varid_templateParameter); // #7046 set varid for "X": std::array Y; TEST_CASE(varid_cppcast); // #6190 TEST_CASE(varid_variadicFunc); TEST_CASE(varid_typename); // #4644 @@ -2135,6 +2136,16 @@ private: tokenize("VertexArrayIterator attrPos = m_AttributePos.GetIterator();")); } + void varid_templateParameter() { // #7046 set varid for "X": std::array Y; + const char code[] = "const int X = 0;\n" + "std::array Y;\n"; + + ASSERT_EQUALS("\n\n##file 0\n" + "1: const int X@1 = 0 ;\n" + "2: std :: array < int , X@1 > Y@2 ;\n", + tokenize(code)); + } + void varid_cppcast() { ASSERT_EQUALS("\n\n##file 0\n1: const_cast < int * > ( code ) [ 0 ] = 0 ;\n", tokenize("const_cast(code)[0] = 0;"));