]> granicus.if.org Git - clang/commitdiff
[arcmt] Copy the diagnostics so we don't have to worry about invaliding iterators...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 1 Apr 2013 21:12:30 +0000 (21:12 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 1 Apr 2013 21:12:30 +0000 (21:12 +0000)
Should fix http://llvm.org/PR15500

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

lib/ARCMigrate/TransProtectedScope.cpp

index b8b25f25941cec057c765d90300fb408230d92e8..237aa42877e6eb3b33ead5774ec9ef6f29eb413f 100644 (file)
@@ -109,7 +109,12 @@ public:
 
     SourceRange BodyRange = BodyCtx.getTopStmt()->getSourceRange();
     const CapturedDiagList &DiagList = Pass.getDiags();
-    CapturedDiagList::iterator I = DiagList.begin(), E = DiagList.end();
+    // Copy the diagnostics so we don't have to worry about invaliding iterators
+    // from the diagnostic list.
+    SmallVector<StoredDiagnostic, 16> StoredDiags;
+    StoredDiags.append(DiagList.begin(), DiagList.end());
+    SmallVectorImpl<StoredDiagnostic>::iterator
+        I = StoredDiags.begin(), E = StoredDiags.end();
     while (I != E) {
       if (I->getID() == diag::err_switch_into_protected_scope &&
           isInRange(I->getLocation(), BodyRange)) {
@@ -120,8 +125,9 @@ public:
     }
   }
 
-  void handleProtectedScopeError(CapturedDiagList::iterator &DiagI,
-                                 CapturedDiagList::iterator DiagE) {
+  void handleProtectedScopeError(
+                             SmallVectorImpl<StoredDiagnostic>::iterator &DiagI,
+                             SmallVectorImpl<StoredDiagnostic>::iterator DiagE){
     Transaction Trans(Pass.TA);
     assert(DiagI->getID() == diag::err_switch_into_protected_scope);
     SourceLocation ErrLoc = DiagI->getLocation();