aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2003-03-17 23:10:45 -0500
committerJason Merrill <jason@gcc.gnu.org>2003-03-17 23:10:45 -0500
commitbdaa131bd0509fc849ea589e103c6339c45118e8 (patch)
tree6e3aaa141d1542f5a0f87593b7c67daea843b1d0 /gcc/expr.c
parentffcfcb5fd9058825f8a4be55adbd70c0841b0d22 (diff)
downloadgcc-bdaa131bd0509fc849ea589e103c6339c45118e8.zip
gcc-bdaa131bd0509fc849ea589e103c6339c45118e8.tar.gz
gcc-bdaa131bd0509fc849ea589e103c6339c45118e8.tar.bz2
re PR c++/10091 ([parisc] ICE in cp_expr_size, at cp/cp-lang.c:307)
PR c++/10091 * expr.c (expand_expr) [ADDR_EXPR]: Disallow taking the address of an unaligned member of TREE_ADDRESSABLE type. * cp/typeck.c (build_class_member_access_expr): Compare TYPE_MAIN_VARIANTs. From-SVN: r64520
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 04479da..926a18e 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -9243,21 +9243,30 @@ expand_expr (exp, target, tmode, modifier)
&& MEM_ALIGN (op0) < BIGGEST_ALIGNMENT)
{
tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
- rtx new
- = assign_stack_temp_for_type
- (TYPE_MODE (inner_type),
- MEM_SIZE (op0) ? INTVAL (MEM_SIZE (op0))
- : int_size_in_bytes (inner_type),
- 1, build_qualified_type (inner_type,
- (TYPE_QUALS (inner_type)
- | TYPE_QUAL_CONST)));
+ rtx new;
if (TYPE_ALIGN_OK (inner_type))
abort ();
+ if (TREE_ADDRESSABLE (inner_type))
+ {
+ /* We can't make a bitwise copy of this object, so fail. */
+ error ("cannot take the address of an unaligned member");
+ return const0_rtx;
+ }
+
+ new = assign_stack_temp_for_type
+ (TYPE_MODE (inner_type),
+ MEM_SIZE (op0) ? INTVAL (MEM_SIZE (op0))
+ : int_size_in_bytes (inner_type),
+ 1, build_qualified_type (inner_type,
+ (TYPE_QUALS (inner_type)
+ | TYPE_QUAL_CONST)));
+
emit_block_move (new, op0, expr_size (TREE_OPERAND (exp, 0)),
(modifier == EXPAND_STACK_PARM
? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
+
op0 = new;
}