From de091aeb4658e986ed8fa5fbce7ab35ef2ae26ec Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 8 Aug 2011 21:43:08 +0000 Subject: [PATCH] Fix another -Wuninitialized assertion failure (this one involving bit casts) resulting from the recent -Wuninitialized changes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137068 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/UninitializedValues.cpp | 31 +++++++++++++++++++++------- test/SemaCXX/uninit-variables.cpp | 11 ++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp index 009922ae92..8bc9506c85 100644 --- a/lib/Analysis/UninitializedValues.cpp +++ b/lib/Analysis/UninitializedValues.cpp @@ -389,6 +389,20 @@ public: }; } +static const Expr *stripCasts(ASTContext &C, const Expr *Ex) { + while (Ex) { + Ex = Ex->IgnoreParenNoopCasts(C); + if (const CastExpr *CE = dyn_cast(Ex)) { + if (CE->getCastKind() == CK_LValueBitCast) { + Ex = CE->getSubExpr(); + continue; + } + } + break; + } + return Ex; +} + void TransferFunctions::reportUninit(const DeclRefExpr *ex, const VarDecl *vd, bool isAlwaysUnit) { if (handler) handler->handleUseOfUninitVariable(ex, vd, isAlwaysUnit); @@ -470,9 +484,9 @@ void TransferFunctions::VisitDeclStmt(DeclStmt *ds) { // appropriately, but we need to continue to analyze subsequent uses // of the variable. if (init == lastLoad) { - DeclRefExpr *DR - = cast(lastLoad-> - getSubExpr()->IgnoreParenNoopCasts(ac.getASTContext())); + const DeclRefExpr *DR + = cast(stripCasts(ac.getASTContext(), + lastLoad->getSubExpr())); if (DR->getDecl() == vd) { // int x = x; // Propagate uninitialized value, but don't immediately report @@ -544,7 +558,8 @@ void TransferFunctions::VisitCastExpr(clang::CastExpr *ce) { } } } - else if (ce->getCastKind() == CK_NoOp) { + else if (ce->getCastKind() == CK_NoOp || + ce->getCastKind() == CK_LValueBitCast) { skipProcessUses = true; } else if (CStyleCastExpr *cse = dyn_cast(ce)) { @@ -580,10 +595,10 @@ void TransferFunctions::ProcessUses(Stmt *s) { // If we reach here, we have seen a load of an uninitialized value // and it hasn't been casted to void or otherwise handled. In this // situation, report the incident. - DeclRefExpr *DR = - cast(lastLoad->getSubExpr()-> - IgnoreParenNoopCasts(ac.getASTContext())); - VarDecl *VD = cast(DR->getDecl()); + const DeclRefExpr *DR = + cast(stripCasts(ac.getASTContext(), + lastLoad->getSubExpr())); + const VarDecl *VD = cast(DR->getDecl()); reportUninit(DR, VD, isAlwaysUninit(vals[VD])); lastLoad = 0; diff --git a/test/SemaCXX/uninit-variables.cpp b/test/SemaCXX/uninit-variables.cpp index 6c5d0068a4..9abccf0751 100644 --- a/test/SemaCXX/uninit-variables.cpp +++ b/test/SemaCXX/uninit-variables.cpp @@ -130,3 +130,14 @@ void test_noop_cast2() { int y = (int&)x; // expected-warning {{uninitialized when used here}} } +// Test handling of bit casts. +void test_bitcasts() { + int x = 1; + int y = (float &)x; // no-warning +} + +void test_bitcasts_2() { + int x; // expected-note {{declared here}} expected-note {{add initialization}} + int y = (float &)x; // expected-warning {{uninitialized when used here}} +} + -- 2.40.0