@@ -4013,18 +4013,25 @@ void TemplateSimplifier::replaceTemplateUsage(
40134013 }
40144014 // remembered new token ranges that start in the erased tokens are gone
40154015 if (!mNewTokenRanges .empty () && !removeTokens.empty ()) {
4016- std::unordered_set<const Token*> erasedTokens;
4016+ std::unordered_set<const Token*> rangeStarts;
4017+ for (const auto & range : mNewTokenRanges )
4018+ rangeStarts.insert (range.first );
4019+ std::unordered_set<const Token*> erasedRangeStarts;
40174020 for (const auto & removeToken : removeTokens) {
4018- for (const Token* tok = removeToken.first ->next (); tok && tok != removeToken.second ; tok = tok->next ())
4019- erasedTokens.insert (tok);
4020- }
4021- mNewTokenRanges .erase (
4022- std::remove_if (mNewTokenRanges .begin (),
4023- mNewTokenRanges .end (),
4024- [&](const std::pair<Token*, Token*>& range) {
4025- return erasedTokens.count (range.first ) != 0 ;
4026- }),
4027- mNewTokenRanges .end ());
4021+ for (const Token* tok = removeToken.first ->next (); tok && tok != removeToken.second ; tok = tok->next ()) {
4022+ if (rangeStarts.count (tok) != 0 )
4023+ erasedRangeStarts.insert (tok);
4024+ }
4025+ }
4026+ if (!erasedRangeStarts.empty ()) {
4027+ mNewTokenRanges .erase (
4028+ std::remove_if (mNewTokenRanges .begin (),
4029+ mNewTokenRanges .end (),
4030+ [&](const std::pair<Token*, Token*>& range) {
4031+ return erasedRangeStarts.count (range.first ) != 0 ;
4032+ }),
4033+ mNewTokenRanges .end ());
4034+ }
40284035 }
40294036 while (!removeTokens.empty ()) {
40304037 eraseTokens (removeTokens.back ().first , removeTokens.back ().second );
@@ -4739,16 +4746,12 @@ bool TemplateSimplifier::removeDeferredTemplateDeclarations(SymbolDatabase* symb
47394746
47404747 // the declarations could have been removed by a later simplification - make sure
47414748 // the tokens still exist before removing them
4742- std::unordered_set<const Token*> liveTokens;
4743- for (const Token* tok = mTokenList .front (); tok; tok = tok->next ())
4744- liveTokens.insert (tok);
4749+ const std::unordered_set<Token*> deferred (mDeferredRemovals .cbegin (), mDeferredRemovals .cend ());
47454750 std::vector<Token*> declarations;
4746- std::copy_if (mDeferredRemovals .cbegin (),
4747- mDeferredRemovals .cend (),
4748- std::back_inserter (declarations),
4749- [&](const Token* declTok) {
4750- return liveTokens.count (declTok) != 0 ;
4751- });
4751+ for (Token* tok = mTokenList .front (); tok && declarations.size () < deferred.size (); tok = tok->next ()) {
4752+ if (deferred.count (tok) != 0 )
4753+ declarations.push_back (tok);
4754+ }
47524755 mDeferredRemovals .clear ();
47534756
47544757 // all tokens that are going to be removed
0 commit comments