@@ -721,7 +721,19 @@ void TemplateSimplifier::expandTemplate(
721721 std::vector<const Token *> &typesUsedInTemplateInstantiation,
722722 std::list<Token *> &templateInstantiations)
723723{
724+ bool inTemplateDefinition=false ;
725+ std::vector<const Token *> localTypeParametersInDeclaration;
724726 for (const Token *tok3 = tokenlist.front (); tok3; tok3 = tok3 ? tok3->next () : nullptr ) {
727+ if (tok3->str ()==" template" ) {
728+ if (tok3->next () && tok3->next ()->str ()==" <" ) {
729+ TemplateParametersInDeclaration (tok3->tokAt (2 ), localTypeParametersInDeclaration);
730+ if (localTypeParametersInDeclaration.size () != typeParametersInDeclaration.size ())
731+ inTemplateDefinition = false ; // Partial specialization
732+ else
733+ inTemplateDefinition = true ;
734+ } else
735+ inTemplateDefinition = false ; // Only template instantiation
736+ }
725737 if (Token::Match (tok3, " {|(|[" ))
726738 tok3 = tok3->link ();
727739
@@ -731,7 +743,8 @@ void TemplateSimplifier::expandTemplate(
731743 }
732744
733745 // member function implemented outside class definition
734- else if (TemplateSimplifier::instantiateMatch (tok3, name, typeParametersInDeclaration.size (), " :: ~| %var% (" )) {
746+ else if (inTemplateDefinition &&
747+ TemplateSimplifier::instantiateMatch (tok3, name, typeParametersInDeclaration.size (), " :: ~| %var% (" )) {
735748 tokenlist.addtoken (newName, tok3->linenr (), tok3->fileIndex ());
736749 while (tok3 && tok3->str () != " ::" )
737750 tok3 = tok3->next ();
@@ -1150,6 +1163,17 @@ bool TemplateSimplifier::simplifyCalculations(Token *_tokens)
11501163 return ret;
11511164}
11521165
1166+ const Token * TemplateSimplifier::TemplateParametersInDeclaration (
1167+ const Token * tok,
1168+ std::vector<const Token *> & typeParametersInDeclaration)
1169+ {
1170+ typeParametersInDeclaration.clear ();
1171+ for (; tok && tok->str () != " >" ; tok = tok->next ()) {
1172+ if (Token::Match (tok, " %var% ,|>" ))
1173+ typeParametersInDeclaration.push_back (tok);
1174+ }
1175+ return tok;
1176+ }
11531177
11541178bool TemplateSimplifier::simplifyTemplateInstantiations (
11551179 TokenList& tokenlist,
@@ -1165,10 +1189,7 @@ bool TemplateSimplifier::simplifyTemplateInstantiations(
11651189
11661190 // Contains tokens such as "T"
11671191 std::vector<const Token *> typeParametersInDeclaration;
1168- for (tok = tok->tokAt (2 ); tok && tok->str () != " >" ; tok = tok->next ()) {
1169- if (Token::Match (tok, " %var% ,|>" ))
1170- typeParametersInDeclaration.push_back (tok);
1171- }
1192+ tok = TemplateParametersInDeclaration (tok->tokAt (2 ), typeParametersInDeclaration);
11721193
11731194 // bail out if the end of the file was reached
11741195 if (!tok)
0 commit comments