]> granicus.if.org Git - clang/commitdiff
[-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.

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

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

index f563cbdc593051a3d6624d028f2cba9c96e63207..47f8f2b90cd37e488dd77601db1a71e5cb3360ac 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 1030c993ada7ed31b6ae0ae8f3540fa900a217b1..8c191f6fadc3401ecf201d6a58fc4d1ff84d074a 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
+}
+