[WinEH] Fix problem with removing an element from a SetVector while iterating.
authorAndrew Kaylor <andrew.kaylor@intel.com>
Thu, 12 Nov 2015 17:36:03 +0000 (17:36 +0000)
committerAndrew Kaylor <andrew.kaylor@intel.com>
Thu, 12 Nov 2015 17:36:03 +0000 (17:36 +0000)
Patch provided by Yaron Keren. (Thanks!)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252913 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/WinEHPrepare.cpp

index a4e10d908febe944bee9a3516369d8a56327b9bd..87713f656718987da45bcbda1b8c62cce7ecba98 100644 (file)
@@ -1665,18 +1665,12 @@ void WinEHPrepare::cloneCommonBlocks(
 
         // Remove this block from the FuncletBlocks set of any funclet that
         // isn't the funclet whose color we just selected.
-        for (auto It = BlockColors[BB].begin(), End = BlockColors[BB].end();
-             It != End; ) {
-          // The iterator must be incremented here because we are removing
-          // elements from the set we're walking.
-          auto Temp = It++;
-          BasicBlock *ContainingFunclet = *Temp;
-          if (ContainingFunclet != CorrectColor) {
+        for (BasicBlock *ContainingFunclet : BlockColors[BB])
+          if (ContainingFunclet != CorrectColor)
             FuncletBlocks[ContainingFunclet].erase(BB);
-            BlockColors[BB].remove(ContainingFunclet);
-          }
-        }
-
+        BlockColors[BB].remove_if([&](BasicBlock *ContainingFunclet) {
+          return ContainingFunclet != CorrectColor;
+        });
         // This should leave just one color for BB.
         assert(BlockColors[BB].size() == 1);
         continue;