From: Jordan Rose Date: Thu, 6 Jun 2013 01:57:24 +0000 (+0000) Subject: [analyzer] Look through ExprWithCleanups to see if an expr's consumed. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb6f75feaa0fa6621282df1075677a26fdfde1b7;p=clang [analyzer] Look through ExprWithCleanups to see if an expr's consumed. We based decisions during analysis and during path generation on whether or not an expression is consumed, so if a top-level expression has cleanups it's important for us to look through that. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183368 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ParentMap.cpp b/lib/AST/ParentMap.cpp index a9a459b602..dbe0b98e18 100644 --- a/lib/AST/ParentMap.cpp +++ b/lib/AST/ParentMap.cpp @@ -14,6 +14,7 @@ #include "clang/AST/ParentMap.h" #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" +#include "clang/AST/ExprCXX.h" #include "llvm/ADT/DenseMap.h" using namespace clang; @@ -150,8 +151,9 @@ bool ParentMap::isConsumedExpr(Expr* E) const { Stmt *P = getParent(E); Stmt *DirectChild = E; - // Ignore parents that are parentheses or casts. - while (P && (isa(P) || isa(P))) { + // Ignore parents that don't guarantee consumption. + while (P && (isa(P) || isa(P) || + isa(P))) { DirectChild = P; P = getParent(P); } diff --git a/test/Analysis/objc-arc.m b/test/Analysis/objc-arc.m index 41c5970438..ba590d614e 100644 --- a/test/Analysis/objc-arc.m +++ b/test/Analysis/objc-arc.m @@ -1532,13 +1532,13 @@ id rdar14061675() { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line179 +// CHECK-NEXT: line181 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line179 -// CHECK-NEXT: col15 +// CHECK-NEXT: line181 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1553,13 +1553,13 @@ id rdar14061675() { // CHECK-NEXT: start // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line179 +// CHECK-NEXT: line181 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line179 -// CHECK-NEXT: col15 +// CHECK-NEXT: line181 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1600,13 +1600,13 @@ id rdar14061675() { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line187 +// CHECK-NEXT: line189 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line187 -// CHECK-NEXT: col15 +// CHECK-NEXT: line189 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1621,13 +1621,13 @@ id rdar14061675() { // CHECK-NEXT: start // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line187 +// CHECK-NEXT: line189 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line187 -// CHECK-NEXT: col15 +// CHECK-NEXT: line189 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1668,13 +1668,13 @@ id rdar14061675() { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line194 +// CHECK-NEXT: line196 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line194 -// CHECK-NEXT: col15 +// CHECK-NEXT: line196 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1689,13 +1689,13 @@ id rdar14061675() { // CHECK-NEXT: start // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line194 +// CHECK-NEXT: line196 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line194 -// CHECK-NEXT: col15 +// CHECK-NEXT: line196 +// CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: diff --git a/test/Analysis/unix-fns.c b/test/Analysis/unix-fns.c index 2cbe96e8c2..2258a8e5f0 100644 --- a/test/Analysis/unix-fns.c +++ b/test/Analysis/unix-fns.c @@ -1418,6 +1418,40 @@ void test_inline_dispatch_once() { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line190 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line190 +// CHECK-NEXT: col15 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line190 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line190 +// CHECK-NEXT: col15 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line190 // CHECK-NEXT: col24 // CHECK-NEXT: file0 // CHECK-NEXT: