This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C++ PATCH: fix PR 28786 - dynamic_cast<void*>, v2


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]