Commit a607b96e by Mark Mitchell Committed by Mark Mitchell

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
parent 80ae8e8a
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.
......
......@@ -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;
}
......
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.
// 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" }
}
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