OSDN Git Service

PR c++/10091
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2003 04:10:45 +0000 (04:10 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Mar 2003 04:10:45 +0000 (04:10 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64520 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/expr.c

index eaf0994..c2a1825 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/10091
+       * expr.c (expand_expr) [ADDR_EXPR]: Disallow taking the address of
+       an unaligned member of TREE_ADDRESSABLE type.
+
 2003-03-18  Alan Modra  <amodra@bigpond.net.au>
 
        * config/rs6000/linux64.h (MASK_PROFILE_KERNEL): Define.
index 2987491..d6efa61 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/10091
+       * typeck.c (build_class_member_access_expr): Compare 
+       TYPE_MAIN_VARIANTs.
+
 2003-03-17  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/9639
index 0cbff77..142b128 100644 (file)
@@ -1941,7 +1941,8 @@ build_class_member_access_expr (tree object, tree member,
                       && integer_zerop (TREE_OPERAND (object, 0)));
 
       /* Convert OBJECT to the type of MEMBER.  */
-      if (!same_type_p (object_type, member_scope))
+      if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
+                       TYPE_MAIN_VARIANT (member_scope)))
        {
          tree binfo;
          base_kind kind;
@@ -1951,7 +1952,7 @@ build_class_member_access_expr (tree object, tree member,
          if (binfo == error_mark_node)
            return error_mark_node;
 
-         /* It is invalid to use to try to get to a virtual base of a
+         /* It is invalid to try to get to a virtual base of a
             NULL object.  The most common cause is invalid use of
             offsetof macro.  */
          if (null_object_p && kind == bk_via_virtual)
index 04479da..926a18e 100644 (file)
@@ -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;
            }