smeenai added a comment.

Finally got a chance to dig into some of the failures this patch is causing. 
Here's an example crasher (run with `clang -cc1 -triple i686-windows 
-emit-llvm`):
  struct Q {
    Q(int);
    ~Q();
  };
  struct Z {};
  struct A {
    A(Q);
  };
  struct B : Z, A {
    using A::A;
  };
  B b(Q(1));

What's happening here is that we emit the inlined inherited constructor call 
(B's `using A::A`), which in turn emits the constructor call (`A::A`), which 
eventually winds up in CodeGenFunction::EmitCall, which calls 
deactivateArgCleanupsBeforeCall, which cleans the cleanup stack. However, the 
RunCleanupsScope that I added thinks it has cleanups to do, because the 
EHStack's stable_begin iterator holds a different (empty) value at its 
destruction than it did at its construction. Of course, the cleanup stack is 
actually empty at this point, so attempting to run cleanups just asserts.

I guess what I want is for my added scope to only apply to the cleanups added 
for base destructor calls (since any cleanups for arguments will be handled by 
deactivateArgCleanupsBeforeCall), but I'm not sure how best to accomplish that.

CodeGenFunction::EmitConstructorBody also wraps a RunCleanupsScope around its 
EmitCtorPrologue call, so in theory it should be affected by the same problem. 
I'll try to craft a test.


Repository:
  rC Clang

https://reviews.llvm.org/D44619



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to