aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGabriel Dos Reis <gdr@integrable-solutions.net>2006-01-22 17:32:30 +0000
committerGabriel Dos Reis <gdr@gcc.gnu.org>2006-01-22 17:32:30 +0000
commit9384e67e4ae1ef2d74ec4eaf4deade9c79d657ab (patch)
treef91ab516febe7d7256e9456f0aba7e8aa8dbe0c8 /gcc
parentdcc21c4c0ae5f44c048e5f016357730395491c8e (diff)
downloadgcc-9384e67e4ae1ef2d74ec4eaf4deade9c79d657ab.zip
gcc-9384e67e4ae1ef2d74ec4eaf4deade9c79d657ab.tar.gz
gcc-9384e67e4ae1ef2d74ec4eaf4deade9c79d657ab.tar.bz2
re PR c++/10891 (code using dynamic_cast causes segfaults when -fno-rtti is used)
2006-01-22 Gabriel Dos Reis <gdr@integrable-solutions.net> PR c++/10891 * rtti.c (build_dynamic_cast): Reject dynamic_cast use if -fno-rtti. testsuite/ 2006-01-22 Gabriel Dos Reis <gdr@integrable-solutions.net> PR c++/10891 * g++.dg/rtti/no-rtti.C: New. From-SVN: r110092
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/rtti.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/rtti/no-rtti.C18
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ea7355b..a4ff093 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-01-22 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ PR c++/10891
+ * rtti.c (build_dynamic_cast): Reject dynamic_cast use if
+ -fno-rtti.
+
2006-01-21 Mark Mitchell <mark@codesourcery.com>
PR c++/25895
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 8a3582d..e8cb52b 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -699,6 +699,14 @@ build_dynamic_cast (tree type, tree expr)
if (type == error_mark_node || expr == error_mark_node)
return error_mark_node;
+ /* Use of dynamic_cast when -fno-rtti is a disaster waiting to happen.
+ See PR C++/10891. Reject. */
+ if (!flag_rtti)
+ {
+ error ("%<dynamic_cast%> not permitted with -fno-rtti");
+ return error_mark_node;
+ }
+
if (processing_template_decl)
{
expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 07aa699..57945e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-22 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ PR c++/10891
+ * g++.dg/rtti/no-rtti.C: New.
+
2006-01-21 Mark Mitchell <mark@codesourcery.com>
PR c++/25895
diff --git a/gcc/testsuite/g++.dg/rtti/no-rtti.C b/gcc/testsuite/g++.dg/rtti/no-rtti.C
new file mode 100644
index 0000000..ca9cb72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/rtti/no-rtti.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fno-rtti" }
+
+// PR C++/10891
+
+struct A {
+ virtual ~A() { }
+};
+
+struct B : A {
+};
+
+A* f();
+
+int main()
+{
+ B* b = dynamic_cast<B*>(f()); // { dg-error "error: " }
+}