Commit 6c9384c3 by Benjamin Smedberg Committed by Jason Merrill

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
parent 3467cfd9
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> 2006-08-22 Jason Merrill <jason@redhat.com>
PR c++/23372 PR c++/23372
......
...@@ -619,6 +619,13 @@ build_dynamic_cast_1 (tree type, tree expr) ...@@ -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)); target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype)); static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
td2 = get_tinfo_decl (target_type); td2 = get_tinfo_decl (target_type);
...@@ -704,13 +711,6 @@ build_dynamic_cast (tree type, tree expr) ...@@ -704,13 +711,6 @@ build_dynamic_cast (tree type, tree expr)
if (type == error_mark_node || expr == error_mark_node) if (type == error_mark_node || expr == error_mark_node)
return 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) if (processing_template_decl)
{ {
expr = build_min (DYNAMIC_CAST_EXPR, type, expr); expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
......
...@@ -1569,7 +1569,9 @@ functions for use by the C++ runtime type identification features ...@@ -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 (@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 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 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 @item -fstats
@opindex fstats @opindex fstats
......
// { 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());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment