]> granicus.if.org Git - clang/commitdiff
-Wuninitialized: warn about uninitialized values resulting from ?: that evaluate...
authorTed Kremenek <kremenek@apple.com>
Sat, 19 Jan 2013 00:25:06 +0000 (00:25 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 19 Jan 2013 00:25:06 +0000 (00:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172875 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/UninitializedValues.cpp
test/SemaCXX/uninitialized.cpp

index fbd49de20eb7bed0e8c5122c8ec3c93748c99f16..0eb96dc92523747fd5e26a0a3c54afdee2e2951b 100644 (file)
@@ -358,6 +358,16 @@ static const DeclRefExpr *getSelfInitExpr(VarDecl *VD) {
 }
 
 void ClassifyRefs::classify(const Expr *E, Class C) {
+  // The result of a ?: could also be an lvalue.
+  E = E->IgnoreParens();
+  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
+    const Expr *TrueExpr = CO->getTrueExpr();
+    if (!isa<OpaqueValueExpr>(TrueExpr))
+      classify(TrueExpr, C);
+    classify(CO->getFalseExpr(), C);
+    return;
+  }
+
   FindVarResult Var = findVar(E, DC);
   if (const DeclRefExpr *DRE = Var.getDeclRefExpr())
     Classification[DRE] = std::max(Classification[DRE], C);
index f55f10f7edaaa00e82d836530d5c78d206d9e425..6d7d548521bc605759847e8bf7ef4bd7fc57bfd2 100644 (file)
@@ -41,8 +41,8 @@ void test_stuff () {
   int j = far(j);
   int k = __alignof__(k);
 
-  int l = k ? l : l;  // FIXME: warn here
-  int m = 1 + (k ? m : m);  // FIXME: warn here
+  int l = k ? l : l;  // expected-warning {{variable 'l' is uninitialized when used within its own initialization}}
+  int m = 1 + (k ? m : m);  // expected-warning {{'m' is uninitialized when used within its own initialization}}
   int n = -n;  // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
 
   for (;;) {
@@ -61,8 +61,8 @@ void test_stuff () {
     int j = far(j);
     int k = __alignof__(k);
 
-    int l = k ? l : l;  // FIXME: warn here
-    int m = 1 + (k ? m : m);  // FIXME: warn here
+    int l = k ? l : l;  // expected-warning {{variable 'l' is uninitialized when used within its own initialization}}
+    int m = 1 + (k ? m : m);  // expected-warning {{'m' is uninitialized when used within its own initialization}}
     int n = -n;  // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
   }
 }