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:
parent
3467cfd982
commit
6c9384c3c0
4 changed files with 37 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
21
gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C
Normal file
21
gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C
Normal 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());
|
||||
}
|
Loading…
Add table
Reference in a new issue