diff options
author | Jason Merrill <jason@redhat.com> | 2014-09-18 08:34:43 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-09-18 08:34:43 -0400 |
commit | 4666e1fb927e6b9ff9498a8023530182cba303f7 (patch) | |
tree | fe6c5b9c31673294c79433d2e8dfa4e8007754b1 /gcc | |
parent | e770bfd997bb5803b88ca4081bdbca3e250fc92e (diff) | |
download | gcc-4666e1fb927e6b9ff9498a8023530182cba303f7.zip gcc-4666e1fb927e6b9ff9498a8023530182cba303f7.tar.gz gcc-4666e1fb927e6b9ff9498a8023530182cba303f7.tar.bz2 |
dyncast.cc (__dynamic_cast): Handle mid-destruction dynamic_cast more gracefully.
* libsupc++/dyncast.cc (__dynamic_cast): Handle mid-destruction
dynamic_cast more gracefully.
From-SVN: r215350
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.dg/rtti/dyncast7.C | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/rtti/dyncast7.C b/gcc/testsuite/g++.dg/rtti/dyncast7.C new file mode 100644 index 0000000..deb4397 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast7.C @@ -0,0 +1,28 @@ +// I think this dynamic_cast has undefined behavior when destroying E::o +// because we're the F period of destruction has started and ap doesn't +// point to the object currently being destroyed--but the reasonable +// options are success or failure, not SEGV. + +// { dg-do run } + +extern "C" void abort(); + +struct A { virtual ~A(); }; +struct B { virtual ~B() { } }; +struct C : B, A { }; +struct E : virtual B { A o; }; +struct F : virtual C, virtual E { }; + +A* ap; +C* cp; + +A::~A() { + C* cp2 = dynamic_cast<C*>(ap); + if (cp2 != cp && cp2 != 0) + abort(); +} + +int main() { + F f; + ap = cp = &f; +} |