]> granicus.if.org Git - clang/commitdiff
Fix PR 2514: Do not flag dead initializations for variables initialized to a constant...
authorTed Kremenek <kremenek@apple.com>
Mon, 9 Feb 2009 18:01:00 +0000 (18:01 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 9 Feb 2009 18:01:00 +0000 (18:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64149 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CheckDeadStores.cpp
test/Analysis/dead-stores.c

index d5e5f4c9b2a207d99342d722d98858c13223aa1c..504de3c97dce0c75fcaa20c5ecfd91c4b0ef2557 100644 (file)
@@ -195,8 +195,21 @@ public:
               // If x is EVER assigned a new value later, don't issue
               // a warning.  This is because such initialization can be
               // due to defensive programming.
-              if (!E->isConstantInitializer(Ctx))
-                Report(V, DeadInit, V->getLocation(), E->getSourceRange());
+              if (E->isConstantInitializer(Ctx))
+                return;
+              
+              // Special case: check for initializations from constant
+              //  variables.
+              //
+              //  e.g. extern const int MyConstant;
+              //       int x = MyConstant;
+              //
+              if (DeclRefExpr *DRE=dyn_cast<DeclRefExpr>(E->IgnoreParenCasts()))
+                if (VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl()))
+                  if (VD->hasGlobalStorage() &&
+                      VD->getType().isConstQualified()) return;
+              
+              Report(V, DeadInit, V->getLocation(), E->getSourceRange());
             }
           }
       }
index c72bdcf2b45828ba21434879354759efc45eca36..7d7b3696379b4c9db52c83332bc375a54dd0179b 100644 (file)
@@ -147,3 +147,19 @@ int f18() {
 
    return (x = 10); // expected-warning{{Although the value stored to 'x' is used in the enclosing expression, the value is never actually read from 'x'}}
 }
+
+// PR 3514: false positive `dead initialization` warning for init to global
+//  http://llvm.org/bugs/show_bug.cgi?id=3514
+extern const int MyConstant;
+int f19(void) {
+  int x = MyConstant;  // no-warning
+  x = 1;
+  return x;
+}
+
+int f19b(void) { // FIXME: Should this case be considered the same as f19?
+  const int MyConstant = 0;
+  int x = MyConstant; // expected-warning{{never read}}
+  x = 1;
+  return x;  
+}