re PR c++/31449 ([4.1] static_cast can remove const-ness)

PR c++/31449
	* class.c (build_base_path): Ensure that the converted pointer has
	the same cv-qualification as the input.
	PR c++/31449
	* g++.dg/init/const5.C: New test.

From-SVN: r123679
This commit is contained in:
Mark Mitchell 2007-04-09 19:45:53 +00:00 committed by Mark Mitchell
parent 80ae8e8ad2
commit a607b96e80
4 changed files with 34 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2007-04-09 Mark Mitchell <mark@codesourcery.com>
PR c++/31449
* class.c (build_base_path): Ensure that the converted pointer has
the same cv-qualification as the input.
2007-04-09 Paolo Carlini <pcarlini@suse.de>
* tree.c (cp_tree_equal): Deal with TRAIT_EXPR.

View File

@ -303,7 +303,18 @@ build_base_path (enum tree_code code,
field, because other parts of the compiler know that such
expressions are always non-NULL. */
if (!virtual_access && integer_zerop (offset))
return build_nop (build_pointer_type (target_type), expr);
{
tree class_type;
/* TARGET_TYPE has been extracted from BINFO, and, is
therefore always cv-unqualified. Extract the
cv-qualifiers from EXPR so that the expression returned
matches the input. */
class_type = TREE_TYPE (TREE_TYPE (expr));
target_type
= cp_build_qualified_type (target_type,
cp_type_quals (class_type));
return build_nop (build_pointer_type (target_type), expr);
}
null_test = error_mark_node;
}

View File

@ -1,3 +1,8 @@
2007-04-09 Mark Mitchell <mark@codesourcery.com>
PR c++/31449
* g++.dg/init/const5.C: New test.
2007-04-09 Jan Hubicka <jh@suse.cz>
* gcc.dg/tree-ssa/foldaddr-3.c: New file.

View File

@ -0,0 +1,11 @@
// PR c++/31449
class Foo {};
class Bar : public Foo {};
static const Foo *foo = 0;
static Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
void func(const Foo *foo) {
Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
}