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 28687 (v2.1)


Jason Merrill wrote:

Please make that change, verify that the generated documentation looks
correct, and resubmit your patch.

But we can't apply it until this happens.

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: doc/invoke.texi
===================================================================
--- doc/invoke.texi	(revision 116331)
+++ 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 @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
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: cp/rtti.c
===================================================================
--- cp/rtti.c	(revision 116331)
+++ 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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]