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
This commit is contained in:
Benjamin Smedberg 2006-08-23 14:04:24 +00:00 committed by Jason Merrill
parent 3467cfd982
commit 6c9384c3c0
4 changed files with 37 additions and 8 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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());
}