@@ -2234,28 +2234,23 @@ void dbNet::mergeNet(dbNet* in_net)
22342234 _dbNet* net = (_dbNet*) this ;
22352235 _dbBlock* block = (_dbBlock*) net->getOwner ();
22362236
2237- // in_net->getITerms() returns a terminal iterator, and iterm->connect() can
2238- // invalidate the iterator by disconnecting a dbITerm.
2239- // So storing all dbITerms is needed for safe iterms iteration.
2240- std::vector<dbITerm*> iterms;
2241- for (dbITerm* iterm : in_net->getITerms ()) {
2242- iterms.push_back (iterm);
2243- }
2244-
22452237 for (auto callback : block->_callbacks ) {
22462238 callback->inDbNetPreMerge (this , in_net);
22472239 }
22482240
2241+ // in_net->getITerms() returns a terminal iterator, and iterm->connect() can
2242+ // invalidate the iterator by disconnecting a dbITerm.
2243+ // Calling iterm->connect() during iteration with the iterator is not safe.
2244+ // Thus create another vector for safe iterms iteration.
2245+ auto iterms_set = in_net->getITerms ();
2246+ std::vector<dbITerm*> iterms (iterms_set.begin (), iterms_set.end ());
22492247 for (dbITerm* iterm : iterms) {
22502248 iterm->connect (this );
22512249 }
22522250
2253- // Store dbBTerms for safe iteration.
2254- std::vector<dbBTerm*> bterms;
2255- for (dbBTerm* bterm : in_net->getBTerms ()) {
2256- bterms.push_back (bterm);
2257- }
2258-
2251+ // Create vector for safe iteration.
2252+ auto bterms_set = in_net->getBTerms ();
2253+ std::vector<dbBTerm*> bterms (bterms_set.begin (), bterms_set.end ());
22592254 for (dbBTerm* bterm : bterms) {
22602255 bterm->connect (this );
22612256 }
0 commit comments