diff options
author | Benjamin Smedberg <benjamin@smedbergs.us> | 2006-08-23 14:04:24 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-08-23 10:04:24 -0400 |
commit | 6c9384c3c0abe611d7d70bd6e3dc2b011bb9e69a (patch) | |
tree | 8db35c6e896f3c47a77d77c5ef83c8f54ece5934 /gcc | |
parent | 3467cfd98264600f249f6e4105df5c0d51804022 (diff) | |
download | gcc-6c9384c3c0abe611d7d70bd6e3dc2b011bb9e69a.zip gcc-6c9384c3c0abe611d7d70bd6e3dc2b011bb9e69a.tar.gz gcc-6c9384c3c0abe611d7d70bd6e3dc2b011bb9e69a.tar.bz2 |
re PR c++/28687 (dynamic_cast<void*> disallowed too rigorously with -fno-rtti)
PR c++/28687
* rtti.c (build_dynamic_cast, build_dynamic_cast_1):
Move -fno-rtti check to be more specific.
From-SVN: r116350
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 14 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C | 21 |
4 files changed, 37 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff60084..e2bc2db 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-11 Benjamin Smedberg <benjamin@smedbergs.us> + + PR c++/28687 + * rtti.c (build_dynamic_cast, build_dynamic_cast_1): + Move -fno-rtti check to be more specific. + 2006-08-22 Jason Merrill <jason@redhat.com> PR c++/23372 diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 18beb79..b4cede4 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -619,6 +619,13 @@ build_dynamic_cast_1 (tree type, tree expr) } } + /* Use of dynamic_cast when -fno-rtti is prohibited. */ + if (!flag_rtti) + { + error ("%<dynamic_cast%> not permitted with -fno-rtti"); + return error_mark_node; + } + target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type)); static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype)); td2 = get_tinfo_decl (target_type); @@ -704,13 +711,6 @@ 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 prohibited. */ - 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/doc/invoke.texi b/gcc/doc/invoke.texi index c9b25f7..d7f0826 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -1569,7 +1569,9 @@ functions for use by the C++ runtime type identification features (@samp{dynamic_cast} and @samp{typeid}). If you don't use those parts of the language, you can save some space by using this flag. Note that exception handling uses the same information, but it will generate it as -needed. +needed. The @samp{dynamic_cast} operator can still be used for casts that +do not require runtime type information, i.e. casts to @code{void *} or to +unambiguous base classes. @item -fstats @opindex fstats diff --git a/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C b/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C new file mode 100644 index 0000000..2b3915d --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-fno-rtti" } + +// PR C++/28687 + +struct A { + virtual ~A() { } +}; + +struct B : A { +}; + +A* f() +{ + return new B(); +} + +int main() +{ + void* b = dynamic_cast<void*>(f()); +} |