[-Wunreachable-code] Treat constant globals as configuration values in unreachable...
authorTed Kremenek <kremenek@apple.com>
Fri, 7 Mar 2014 20:51:13 +0000 (20:51 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 7 Mar 2014 20:51:13 +0000 (20:51 +0000)
This one could possibly be refined even further; e.g. looking
at the initializer and see if it is truly a configuration value.

llvm-svn: 203283

clang/lib/Analysis/ReachableCode.cpp
clang/test/SemaCXX/warn-unreachable.cpp

index f563cbd..47f8f2b 100644 (file)
@@ -194,8 +194,20 @@ static bool isConfigurationValue(const Stmt *S) {
   switch (S->getStmtClass()) {
     case Stmt::DeclRefExprClass: {
       const DeclRefExpr *DR = cast<DeclRefExpr>(S);
-      const EnumConstantDecl *ED = dyn_cast<EnumConstantDecl>(DR->getDecl());
-      return ED ? isConfigurationValue(ED->getInitExpr()) : false;
+      const ValueDecl *D = DR->getDecl();
+      if (const EnumConstantDecl *ED = dyn_cast<EnumConstantDecl>(D))
+        return ED ? isConfigurationValue(ED->getInitExpr()) : false;
+      if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
+        // As a heuristic, treat globals as configuration values.  Note
+        // that we only will get here if Sema evaluated this
+        // condition to a constant expression, which means the global
+        // had to be declared in a way to be a truly constant value.
+        // We could generalize this to local variables, but it isn't
+        // clear if those truly represent configuration values that
+        // gate unreachable code.
+        return !VD->hasLocalStorage();
+      }
+      return false;
     }
     case Stmt::IntegerLiteralClass:
       return isExpandedFromConfigurationMacro(S);
index 1030c99..8c191f6 100644 (file)
@@ -155,3 +155,10 @@ bool testBool() {
   return true; // no-warning
 }
 
+static const bool ConditionVar = 1;
+int test_global_as_conditionVariable() {
+  if (ConditionVar)
+    return 1;
+  return 0; // no-warning
+}
+