From 7fead31dbee1a1349d360eff7b56dc6571449443 Mon Sep 17 00:00:00 2001 From: Jordy Rose Date: Thu, 9 Jun 2011 05:44:04 +0000 Subject: [PATCH] [analyzer] Ignore parentheses around block-level expressions when computing liveness. Fixes the other half of PR8962. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132769 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/LiveVariables.cpp | 16 +++++++++++++--- test/Analysis/misc-ps.c | 12 ++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp index 303dc0f604..0fe87e8719 100644 --- a/lib/Analysis/LiveVariables.cpp +++ b/lib/Analysis/LiveVariables.cpp @@ -142,8 +142,12 @@ void TransferFuncs::Visit(Stmt *S) { if (AD.Observer) AD.Observer->ObserveStmt(S, currentBlock, AD, LiveState); - if (getCFG().isBlkExpr(S)) - LiveState(S, AD) = Dead; + if (getCFG().isBlkExpr(S)) { + if (Expr *E = dyn_cast(S)) + LiveState(E->IgnoreParens(), AD) = Dead; + else + LiveState(S, AD) = Dead; + } StmtVisitor::Visit(S); } @@ -157,7 +161,10 @@ void TransferFuncs::Visit(Stmt *S) { } else { // For block-level expressions, mark that they are live. - LiveState(S,AD) = Alive; + if (Expr *E = dyn_cast(S)) + LiveState(E->IgnoreParens(), AD) = Alive; + else + LiveState(S, AD) = Alive; } } @@ -174,6 +181,9 @@ void TransferFuncs::VisitTerminator(CFGBlock* B) { return; assert (getCFG().isBlkExpr(E)); + + if (const Expr *Ex = dyn_cast(E)) + E = Ex->IgnoreParens(); LiveState(E, AD) = Alive; } diff --git a/test/Analysis/misc-ps.c b/test/Analysis/misc-ps.c index 0729ce2f77..84992c6bb2 100644 --- a/test/Analysis/misc-ps.c +++ b/test/Analysis/misc-ps.c @@ -50,3 +50,15 @@ int PR8962_b (int *t) { return *t; // expected-warning {{null pointer}} } +int PR8962_c (int *t) { + // If the last element in a StmtExpr was a ParenExpr, it's still live + if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0; + return *t; // no-warning +} + +int PR8962_d (int *t) { + // If the last element in a StmtExpr is an __extension__, it's still live + if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0; + return *t; // no-warning +} + -- 2.40.0