]> granicus.if.org Git - clang/commitdiff
fix a segfault in cases where there are no cases.
authorChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 14:29:07 +0000 (14:29 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 14:29:07 +0000 (14:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41317 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaStmt.cpp
test/Sema/switch.c

index c660b717423c6487e22faf77ecff32d367cb5e21..ee3a8e6a7fe0d59bcf54821095aa0df68ca60f80 100644 (file)
@@ -274,16 +274,18 @@ Sema::FinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) {
   // Sort all the scalar case values so we can easily detect duplicates.
   std::stable_sort(CaseVals.begin(), CaseVals.end());
   
-  for (unsigned i = 0, e = CaseVals.size()-1; i != e; ++i) {
-    if (CaseVals[i].first == CaseVals[i+1].first) {
-      // If we have a duplicate, report it.
-      Diag(CaseVals[i+1].second->getLHS()->getLocStart(),
-           diag::err_duplicate_case, CaseVals[i].first.toString());
-      Diag(CaseVals[i].second->getLHS()->getLocStart(), 
-           diag::err_duplicate_case_prev);
-      // FIXME: We really want to remove the bogus case stmt from the substmt,
-      // but we have no way to do this right now.
-      CaseListIsErroneous = true;
+  if (!CaseVals.empty()) {
+    for (unsigned i = 0, e = CaseVals.size()-1; i != e; ++i) {
+      if (CaseVals[i].first == CaseVals[i+1].first) {
+        // If we have a duplicate, report it.
+        Diag(CaseVals[i+1].second->getLHS()->getLocStart(),
+             diag::err_duplicate_case, CaseVals[i].first.toString());
+        Diag(CaseVals[i].second->getLHS()->getLocStart(), 
+             diag::err_duplicate_case_prev);
+        // FIXME: We really want to remove the bogus case stmt from the substmt,
+        // but we have no way to do this right now.
+        CaseListIsErroneous = true;
+      }
     }
   }
   
index ce195b175f3c2f48afad4e251234e40227b7c189..a55831d462a1a691ebc8b44c6485ae1a9176affb 100644 (file)
@@ -15,3 +15,7 @@ void foo(int X) {
   }
 }
 
+void test3(void) { 
+  switch (0); 
+}
+