This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH: fix PR 28786 - dynamic_cast<void*>, v2
- From: Benjamin Smedberg <benjamin at smedbergs dot us>
- To: "gcc-patches >> GCC Patches" <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 15 Aug 2006 12:16:47 -0400
- Subject: Re: C++ PATCH: fix PR 28786 - dynamic_cast<void*>, v2
- References: <44E07A8D.4060106@smedbergs.us>
Benjamin Smedberg wrote:
Patch updated per Mark Mitchell's comments: use @code{} in
documentation. Also fixed a typo in the test s/do-do/dg-do/
My email client is munging tabs, so I've attached the patch instead of
putting it inline.
:ADDPATCH C++:
--BDS
2006-08-11 Benjamin Smedberg <benjamin@smedbergs.us>
PR c++/28687
* doc/invoke.texi (-no-rtti): specifically document
dynamic_cast<void*>
cp/
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
testsuite/
2006-08-11 Benjamin Smedberg <benjamin@smedbergs.us>
PR c++/28687
* g++.dg/rtti/no-rtti-voidptr.C: new
Index: cp/rtti.c
===================================================================
--- cp/rtti.c (revision 116129)
+++ cp/rtti.c (working copy)
@@ -619,6 +619,13 @@ build_dynamic_cast_1 (tree type, tree ex
}
}
+ /* 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);
Index: testsuite/g++.dg/rtti/no-rtti-voidptr.C
===================================================================
--- testsuite/g++.dg/rtti/no-rtti-voidptr.C (revision 0)
+++ testsuite/g++.dg/rtti/no-rtti-voidptr.C (revision 0)
@@ -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());
+}
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 116129)
+++ doc/invoke.texi (working copy)
@@ -1569,7 +1569,9 @@ functions for use by the C++ runtime typ
(@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 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