From 9815ec0a00fe04db92e51a4160fc905f6cd48f30 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Tue, 23 Jul 2013 02:15:11 +0000 Subject: [PATCH] Revert "[analyzer] Add very limited support for temporary destructors" The analyzer doesn't currently expect CFG blocks with terminators to be empty, but this can happen when generating conditional destructors for a complex logical expression, such as (a && (b || Temp{})). Moreover, the branch conditions for these expressions are not persisted in the state. Even for handling noreturn destructors this needs more work. This reverts r186498. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186925 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/AnalyzerOptions.cpp | 2 +- lib/StaticAnalyzer/Core/ExprEngine.cpp | 10 +--- .../Core/ExprEngineCallAndReturn.cpp | 6 --- test/Analysis/analyzer-config.c | 2 +- test/Analysis/analyzer-config.cpp | 2 +- test/Analysis/dtor.cpp | 15 ------ test/Analysis/temp-obj-dtors-cfg-output.cpp | 51 ------------------- 7 files changed, 4 insertions(+), 84 deletions(-) diff --git a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp index 93b620410b..9dcf58babd 100644 --- a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -119,7 +119,7 @@ bool AnalyzerOptions::getBooleanOption(Optional &V, StringRef Name, bool AnalyzerOptions::includeTemporaryDtorsInCFG() { return getBooleanOption(IncludeTemporaryDtorsInCFG, "cfg-temporary-dtors", - /* Default = */ true); + /* Default = */ false); } bool AnalyzerOptions::mayInlineCXXStandardLibrary() { diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp index d42291da9c..8f5ba0645f 100644 --- a/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -590,15 +590,7 @@ void ExprEngine::ProcessMemberDtor(const CFGMemberDtor D, void ExprEngine::ProcessTemporaryDtor(const CFGTemporaryDtor D, ExplodedNode *Pred, - ExplodedNodeSet &Dst) { - - QualType varType = D.getBindTemporaryExpr()->getSubExpr()->getType(); - - // FIXME: Inlining of temporary destructors is not supported yet anyway, so we - // just put a NULL region for now. This will need to be changed later. - VisitCXXDestructor(varType, NULL, D.getBindTemporaryExpr(), - /*IsBase=*/ false, Pred, Dst); -} + ExplodedNodeSet &Dst) {} void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, ExplodedNodeSet &DstTop) { diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index caceb60569..63dccff374 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -807,12 +807,6 @@ bool ExprEngine::shouldInlineCall(const CallEvent &Call, const Decl *D, AnalysisDeclContextManager &ADCMgr = AMgr.getAnalysisDeclContextManager(); AnalysisDeclContext *CalleeADC = ADCMgr.getContext(D); - // Temporary object destructor processing is currently broken, so we never - // inline them. - // FIME: Remove this once temp destructors are working. - if ((*currBldrCtx->getBlock())[currStmtIdx].getAs()) - return false; - // The auto-synthesized bodies are essential to inline as they are // usually small and commonly used. Note: we should do this check early on to // ensure we always inline these calls. diff --git a/test/Analysis/analyzer-config.c b/test/Analysis/analyzer-config.c index c80eb164b9..55b1df9ca8 100644 --- a/test/Analysis/analyzer-config.c +++ b/test/Analysis/analyzer-config.c @@ -6,7 +6,7 @@ void foo() { bar(); } // CHECK: [config] // CHECK-NEXT: cfg-conditional-static-initializers = true -// CHECK-NEXT: cfg-temporary-dtors = true +// CHECK-NEXT: cfg-temporary-dtors = false // CHECK-NEXT: faux-bodies = true // CHECK-NEXT: graph-trim-interval = 1000 // CHECK-NEXT: ipa = dynamic-bifurcate diff --git a/test/Analysis/analyzer-config.cpp b/test/Analysis/analyzer-config.cpp index 4160508a38..521344a511 100644 --- a/test/Analysis/analyzer-config.cpp +++ b/test/Analysis/analyzer-config.cpp @@ -17,7 +17,7 @@ public: // CHECK-NEXT: c++-stdlib-inlining = true // CHECK-NEXT: c++-template-inlining = true // CHECK-NEXT: cfg-conditional-static-initializers = true -// CHECK-NEXT: cfg-temporary-dtors = true +// CHECK-NEXT: cfg-temporary-dtors = false // CHECK-NEXT: faux-bodies = true // CHECK-NEXT: graph-trim-interval = 1000 // CHECK-NEXT: ipa = dynamic-bifurcate diff --git a/test/Analysis/dtor.cpp b/test/Analysis/dtor.cpp index 80b3157069..58bdcea631 100644 --- a/test/Analysis/dtor.cpp +++ b/test/Analysis/dtor.cpp @@ -416,19 +416,4 @@ namespace NoReturn { f(&x); *x = 47; // no warning } - - void g2(int *x) { - if (! x) NR(); - *x = 47; // no warning - } - - void f3(int **x) { - NR(); - } - - void g3() { - int *x; - f3(&x); - *x = 47; // no warning - } } diff --git a/test/Analysis/temp-obj-dtors-cfg-output.cpp b/test/Analysis/temp-obj-dtors-cfg-output.cpp index ff68a876e9..1ddccb704b 100644 --- a/test/Analysis/temp-obj-dtors-cfg-output.cpp +++ b/test/Analysis/temp-obj-dtors-cfg-output.cpp @@ -108,24 +108,6 @@ TestCtorInits::TestCtorInits() : a(int(A()) + int(B())) , b() {} -class NoReturn { -public: - ~NoReturn() __attribute__((noreturn)); - void f(); -}; - -void test_noreturn1() { - int a; - NoReturn().f(); - int b; -} - -void test_noreturn2() { - int a; - NoReturn(), 47; - int b; -} - // CHECK: [B1 (ENTRY)] // CHECK: Succs (1): B0 // CHECK: [B0 (EXIT)] @@ -864,36 +846,3 @@ void test_noreturn2() { // CHECK: [B0 (EXIT)] // CHECK: Preds (1): B1 -// CHECK: [B3 (ENTRY)] -// CHECK: Succs (1): B2 -// CHECK: [B1] -// CHECK: 1: int b; -// CHECK: Succs (1): B0 -// CHECK: [B2] -// CHECK: 1: int a; -// CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn) -// CHECK: 3: [B2.2] (BindTemporary) -// CHECK: 4: [B2.3].f -// CHECK: 5: [B2.4]() -// CHECK: 6: ~NoReturn() (Temporary object destructor) -// CHECK: Preds (1): B3 -// CHECK: Succs (1): B0 -// CHECK: [B0 (EXIT)] -// CHECK: Preds (2): B1 B2 - -// CHECK: [B3 (ENTRY)] -// CHECK: Succs (1): B2 -// CHECK: [B1] -// CHECK: 1: int b; -// CHECK: Succs (1): B0 -// CHECK: [B2] -// CHECK: 1: int a; -// CHECK: 2: NoReturn() (CXXConstructExpr, class NoReturn) -// CHECK: 3: [B2.2] (BindTemporary) -// CHECK: 4: 47 -// CHECK: 5: ... , [B2.4] -// CHECK: 6: ~NoReturn() (Temporary object destructor) -// CHECK: Preds (1): B3 -// CHECK: Succs (1): B0 -// CHECK: [B0 (EXIT)] -// CHECK: Preds (2): B1 B2 -- 2.40.0