Commit 9cd09177 authored by Rafael Espindola's avatar Rafael Espindola
Browse files

Port r226896 to the 3.6 branch.

Original message:

[pr22293] Don't crash during codegen of a recursive destructor.

 In ItaniumCXXABI::EmitCXXDestructors we first emit the base destructor
and then try to emit the complete one as an alias.

If in the base ends up calling the complete destructor, the GD for the
complete will be in the list of deferred decl by the time we replace
it with an alias and delete the original GV.

llvm-svn: 228684
parent 4814291e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -324,7 +324,7 @@ private:
  /// referenced. These get code generated when the module is done.
  struct DeferredGlobal {
    DeferredGlobal(llvm::GlobalValue *GV, GlobalDecl GD) : GV(GV), GD(GD) {}
    llvm::AssertingVH<llvm::GlobalValue> GV;
    llvm::TrackingVH<llvm::GlobalValue> GV;
    GlobalDecl GD;
  };
  std::vector<DeferredGlobal> DeferredDeclsToEmit;
+11 −0
Original line number Diff line number Diff line
@@ -232,3 +232,14 @@ foo::~foo() {}
// CHECK6: @_ZN6test113fooD2Ev = alias {{.*}} @_ZN6test113barD2Ev
// CHECK6: @_ZN6test113fooD1Ev = alias {{.*}} @_ZN6test113fooD2Ev
}

namespace test12 {
template <int>
struct foo {
  ~foo() { delete this; }
};

template class foo<1>;
// CHECK6: @_ZN6test123fooILi1EED1Ev = weak_odr alias {{.*}} @_ZN6test123fooILi1EED2Ev
// CHECK6: define weak_odr void @_ZN6test123fooILi1EED2Ev({{.*}}) {{.*}} comdat($_ZN6test123fooILi1EED5Ev)
}