aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-06-14 14:15:51 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-06-14 14:15:51 -0400
commit2bbf86a46bdece05107c54d94c4c8d41a2d17023 (patch)
tree1f39a784eab7c00be8e20e81adf42b87e4acf284 /gcc/cp/class.c
parent11f449abc6fc745486699f2f7079497d4c582d40 (diff)
downloadgcc-2bbf86a46bdece05107c54d94c4c8d41a2d17023.zip
gcc-2bbf86a46bdece05107c54d94c4c8d41a2d17023.tar.gz
gcc-2bbf86a46bdece05107c54d94c4c8d41a2d17023.tar.bz2
re PR c++/49369 (typeof() strips const from member when used in const method)
PR c++/49369 * class.c (build_base_path): Fix cv-quals in unevaluated context. From-SVN: r175042
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 69627cb..09444fb 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -289,6 +289,12 @@ build_base_path (enum tree_code code,
offset = BINFO_OFFSET (binfo);
fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
+ /* 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. */
+ target_type = cp_build_qualified_type
+ (target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr))));
+ ptr_target_type = build_pointer_type (target_type);
/* Do we need to look in the vtable for the real offset? */
virtual_access = (v_binfo && fixed_type_p <= 0);
@@ -297,7 +303,7 @@ build_base_path (enum tree_code code,
source type is incomplete and the pointer value doesn't matter. */
if (cp_unevaluated_operand != 0)
{
- expr = build_nop (build_pointer_type (target_type), expr);
+ expr = build_nop (ptr_target_type, expr);
if (!want_pointer)
expr = build_indirect_ref (EXPR_LOCATION (expr), expr, RO_NULL);
return expr;
@@ -312,18 +318,7 @@ 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))
- {
- 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);
- }
+ return build_nop (ptr_target_type, expr);
null_test = error_mark_node;
}
@@ -407,9 +402,6 @@ build_base_path (enum tree_code code,
offset = v_offset;
}
- target_type = cp_build_qualified_type
- (target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr))));
- ptr_target_type = build_pointer_type (target_type);
if (want_pointer)
target_type = ptr_target_type;