]> granicus.if.org Git - clang/commitdiff
Revert "[analyzer] Add very limited support for temporary destructors"
authorJordan Rose <jordan_rose@apple.com>
Tue, 23 Jul 2013 02:15:11 +0000 (02:15 +0000)
committerJordan Rose <jordan_rose@apple.com>
Tue, 23 Jul 2013 02:15:11 +0000 (02:15 +0000)
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
lib/StaticAnalyzer/Core/ExprEngine.cpp
lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
test/Analysis/analyzer-config.c
test/Analysis/analyzer-config.cpp
test/Analysis/dtor.cpp
test/Analysis/temp-obj-dtors-cfg-output.cpp

index 93b620410bc44070ee4a347069df64bc4f957433..9dcf58babd278c778e51c7933b2887babf224434 100644 (file)
@@ -119,7 +119,7 @@ bool AnalyzerOptions::getBooleanOption(Optional<bool> &V, StringRef Name,
 bool AnalyzerOptions::includeTemporaryDtorsInCFG() {
   return getBooleanOption(IncludeTemporaryDtorsInCFG,
                           "cfg-temporary-dtors",
-                          /* Default = */ true);
+                          /* Default = */ false);
 }
 
 bool AnalyzerOptions::mayInlineCXXStandardLibrary() {
index d42291da9cd908c3a3b0d5cddc0bb50ef754fdc9..8f5ba0645f37b8673100cfb69c788439cf35769d 100644 (file)
@@ -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) {
index caceb6056920a7f642280fcf7b3cc5849583f3bb..63dccff374bcc8f9d0019d26078eaa7b452bf1c6 100644 (file)
@@ -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<CFGTemporaryDtor>())
-    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.
index c80eb164b99efc64581483478e2215c5ab4f65d3..55b1df9ca8a1d991be7789815b597f9aabe2e3bc 100644 (file)
@@ -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
index 4160508a382b7d3a129ab28f1c38b10bf683814e..521344a5119a8bcbd6b7d9641463475091abed0e 100644 (file)
@@ -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
index 80b31570697bbb14480eca65d070699e4819fada..58bdcea6317a5cd066390aa9f458da9c5bce6be8 100644 (file)
@@ -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
-  }
 }
index ff68a876e91049bb80bb78736003a2c1bdf29492..1ddccb704b132d8b1719169d4dff37b4a8191409 100644 (file)
@@ -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