@@ -626,13 +626,26 @@ void TemplateSimplifier::deleteToken(Token *tok)
626626 tok->deleteThis ();
627627}
628628
629- bool TemplateSimplifier::removeTemplate (Token *tok)
629+ static void invalidateForwardDecls (const Token* beg, const Token* end, std::map<Token*, Token*>* forwardDecls) {
630+ if (!forwardDecls)
631+ return ;
632+ for (auto & fwd : *forwardDecls) {
633+ for (const Token* tok = beg; tok != end; tok = tok->next ())
634+ if (fwd.second == tok) {
635+ fwd.second = nullptr ;
636+ break ;
637+ }
638+ }
639+ }
640+
641+ bool TemplateSimplifier::removeTemplate (Token *tok, std::map<Token*, Token*>* forwardDecls)
630642{
631643 if (!Token::simpleMatch (tok, " template <" ))
632644 return false ;
633645
634646 Token *end = findTemplateDeclarationEnd (tok);
635647 if (end && end->next ()) {
648+ invalidateForwardDecls (tok, end->next (), forwardDecls);
636649 eraseTokens (tok, end->next ());
637650 deleteToken (tok);
638651 return true ;
@@ -2417,8 +2430,10 @@ static void invalidateInst(const Token* beg, const Token* end, std::vector<newIn
24172430 return ;
24182431 for (auto & inst : *newInst) {
24192432 for (const Token* tok = beg; tok != end; tok = tok->next ())
2420- if (inst.token == tok)
2433+ if (inst.token == tok) {
24212434 inst.token = nullptr ;
2435+ break ;
2436+ }
24222437 }
24232438}
24242439
@@ -3850,8 +3865,8 @@ void TemplateSimplifier::simplifyTemplates(
38503865 // remove forward declaration if found
38513866 auto it1 = mTemplateForwardDeclarationsMap .find (it->token ());
38523867 if (it1 != mTemplateForwardDeclarationsMap .end ())
3853- removeTemplate (it1->second );
3854- removeTemplate (it->token ());
3868+ removeTemplate (it1->second , & mTemplateForwardDeclarationsMap );
3869+ removeTemplate (it->token (), & mTemplateForwardDeclarationsMap );
38553870 }
38563871 mTemplateDeclarations .erase (decl);
38573872 }
0 commit comments