diff options
| -rw-r--r-- | clang/lib/Analysis/UninitializedValues.cpp | 10 | ||||
| -rw-r--r-- | clang/test/SemaCXX/uninitialized.cpp | 8 | 
2 files changed, 14 insertions, 4 deletions
diff --git a/clang/lib/Analysis/UninitializedValues.cpp b/clang/lib/Analysis/UninitializedValues.cpp index fbd49de20eb..0eb96dc9252 100644 --- a/clang/lib/Analysis/UninitializedValues.cpp +++ b/clang/lib/Analysis/UninitializedValues.cpp @@ -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); diff --git a/clang/test/SemaCXX/uninitialized.cpp b/clang/test/SemaCXX/uninitialized.cpp index f55f10f7eda..6d7d548521b 100644 --- a/clang/test/SemaCXX/uninitialized.cpp +++ b/clang/test/SemaCXX/uninitialized.cpp @@ -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}}    }  }  | 

