aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-09-18 08:34:43 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-09-18 08:34:43 -0400
commit4666e1fb927e6b9ff9498a8023530182cba303f7 (patch)
treefe6c5b9c31673294c79433d2e8dfa4e8007754b1 /gcc
parente770bfd997bb5803b88ca4081bdbca3e250fc92e (diff)
downloadgcc-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.C28
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;
+}