================
Comment at: lib/Analysis/CFG.cpp:3549
@@ -3599,3 +3548,3 @@
     if (Dtor->isNoReturn()) {
       Succ = B;
       Block = createNoReturnBlock();
----------------
The actual problem was here:
Instead of unconditionally setting Succ to B, we have to do:
if (B) Succ = B;
(like below).

The problem is that this leads to new regressions (which are correct to regress 
:P).

Consider:
struct abort {
  abort();
  ~abort() __attribute__((noreturn));
};

int f1(int x) {
  switch (x)
  default:
  abort();
}

The problem is that with the new way the CFG is built for temp dtors, we'll get 
a "branch" at destruction time of the abort, that either doesn't return (good), 
or falls through to the normal path (oh noes).
Of course there is no path where the constructor wasn't executed, but a simple 
path based analysis doesn't know that (UnreachableCode.cpp).

The idea to fix that would be to only insert the decision blocks for temporary 
destructors if we are at a branching point, and otherwise just flow up like 
normal.

Other ideas / thoughts?

http://reviews.llvm.org/D3627



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to