]> granicus.if.org Git - clang/commitdiff
detect and diagnose empty case ranges:
authorChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 17:48:14 +0000 (17:48 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 Aug 2007 17:48:14 +0000 (17:48 +0000)
switch.c:16:8: warning: empty case range specified
  case 100 ... 99: ;  // expected-warning {{empty case range}}
       ^~~~~~~~~~

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

Sema/SemaStmt.cpp
clang.xcodeproj/project.pbxproj
include/clang/Basic/DiagnosticKinds.def
test/Sema/switch.c

index ee3a8e6a7fe0d59bcf54821095aa0df68ca60f80..6a8c18ced65d8b9b2737f119eb77bebef928a622 100644 (file)
@@ -298,7 +298,7 @@ Sema::FinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) {
     
     // Scan the ranges, computing the high values and removing empty ranges.
     std::vector<llvm::APSInt> HiVals;
-    for (unsigned i = 0, e = CaseVals.size(); i != e; ++i) {
+    for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
       CaseStmt *CR = CaseRanges[i].second;
       llvm::APSInt HiVal(32);
       CR->getRHS()->isIntegerConstantExpr(HiVal, Context);
@@ -308,9 +308,15 @@ Sema::FinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) {
                                          CR->getRHS()->getLocStart(),
                                          diag::warn_case_value_overflow);
       
-      // FIXME: if the low value is bigger than the high value, the case is
-      // empty: emit "empty range specified" warning and drop it.
-
+      // If the low value is bigger than the high value, the case is empty.
+      if (CaseRanges[i].first > HiVal) {
+        Diag(CR->getLHS()->getLocStart(), diag::warn_case_empty_range,
+             SourceRange(CR->getLHS()->getLocStart(),
+                         CR->getRHS()->getLocEnd()));
+        CaseRanges.erase(CaseRanges.begin()+i);
+        --i, --e;
+        continue;
+      }
       HiVals.push_back(HiVal);
     }
 
index 7e38e051dda6344719f9fdb4ee6ba49fcec958d3..19e984ce33e5de08844de1420641bf6c630817b4 100644 (file)
                1ABC36930C7A4BDC006DB0AB /* CGBuiltin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CGBuiltin.cpp; path = CodeGen/CGBuiltin.cpp; sourceTree = "<group>"; };
                84D9A8870C1A57E100AC7ABC /* AttributeList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AttributeList.cpp; path = Parse/AttributeList.cpp; sourceTree = "<group>"; };
                84D9A88B0C1A581300AC7ABC /* AttributeList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AttributeList.h; path = clang/Parse/AttributeList.h; sourceTree = "<group>"; };
-               8DD76F6C0486A84900D96B5E /* clang */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = clang; sourceTree = BUILT_PRODUCTS_DIR; };
+               8DD76F6C0486A84900D96B5E /* clang */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = clang; sourceTree = BUILT_PRODUCTS_DIR; };
                DE01DA480B12ADA300AC22CE /* PPCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPCallbacks.h; sourceTree = "<group>"; };
                DE06756B0C051CFE00EBBFD8 /* ParseExprCXX.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ParseExprCXX.cpp; path = Parse/ParseExprCXX.cpp; sourceTree = "<group>"; };
                DE06B73D0A8307640050E87E /* LangOptions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LangOptions.h; sourceTree = "<group>"; };
index 0dd27c4f6c3bc37c0c9c1884d41faa89ef3898f0..f2dd28225859d4e7cf8a14748c07c954ffe841d7 100644 (file)
@@ -719,6 +719,8 @@ DIAG(err_duplicate_case, ERROR,
      "duplicate case value '%0'")
 DIAG(err_duplicate_case_prev, ERROR,
      "previous case value occurrence defined here")
+DIAG(warn_case_empty_range, WARNING,
+     "empty case range specified")
 DIAG(err_typecheck_return_incompatible, ERROR,
      "incompatible type returning '%1', expected '%0'")
 DIAG(ext_typecheck_return_pointer_int, WARNING,
index a55831d462a1a691ebc8b44c6485ae1a9176affb..0128a216e5a32aae8841c0d7c54c6b2a90b349e2 100644 (file)
@@ -12,6 +12,8 @@ void foo(int X) {
   case 5000000000LL:  // expected-warning {{overflow}}
   case 42:            // expected-error {{duplicate case value}}
    ;
+
+  case 100 ... 99: ;  // expected-warning {{empty case range}}
   }
 }