OSDN Git Service

* class.c (build_base_path): Use build_address directly.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Aug 2004 18:59:18 +0000 (18:59 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Aug 2004 18:59:18 +0000 (18:59 +0000)
        * typeck.c (build_unary_op): Don't lower &a.b to pointer
        arithmetic directly.
        * typeck2.c (store_init_value): Don't assume !TREE_CONSTANT
        means !initializer_constant_valid_p.

        * g++.dg/other/offsetof1.C: Use __builtin_offsetof.

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

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/typeck.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/offsetof1.C

index 83e38c9..97296e9 100644 (file)
@@ -1,5 +1,13 @@
 2004-08-30  Richard Henderson  <rth@redhat.com>
 
 2004-08-30  Richard Henderson  <rth@redhat.com>
 
+       * class.c (build_base_path): Use build_address directly.
+       * typeck.c (build_unary_op): Don't lower &a.b to pointer
+       arithmetic directly.
+       * typeck2.c (store_init_value): Don't assume !TREE_CONSTANT
+       means !initializer_constant_valid_p.
+
+2004-08-30  Richard Henderson  <rth@redhat.com>
+
        * class.c (fixed_type_or_null): Use get_base_address before
        assuming an ADDR_EXPR is non-null.
 
        * class.c (fixed_type_or_null): Use get_base_address before
        assuming an ADDR_EXPR is non-null.
 
index 9ef15dc..272c4d6 100644 (file)
@@ -319,7 +319,7 @@ build_base_path (enum tree_code code,
       expr = build_indirect_ref (expr, NULL);
       expr = build_simple_base_path (expr, binfo);
       if (want_pointer)
       expr = build_indirect_ref (expr, NULL);
       expr = build_simple_base_path (expr, binfo);
       if (want_pointer)
-       expr = build_unary_op (ADDR_EXPR, expr, 0);
+       expr = build_address (expr);
       target_type = TREE_TYPE (expr);
       goto out;
     }
       target_type = TREE_TYPE (expr);
       goto out;
     }
index 3ec1e42..e62db90 100644 (file)
@@ -3963,19 +3963,6 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
          return arg;
        }
 
          return arg;
        }
 
-      /* For &x[y], return x+y.  But, in a template, ARG may be an
-        ARRAY_REF representing a non-dependent expression.  In that
-        case, there may be an overloaded "operator []" that will be
-        chosen at instantiation time; we must not try to optimize
-        here.  */
-      if (TREE_CODE (arg) == ARRAY_REF && !processing_template_decl)
-       {
-         if (!cxx_mark_addressable (TREE_OPERAND (arg, 0)))
-           return error_mark_node;
-         return cp_build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
-                                    TREE_OPERAND (arg, 1));
-       }
-
       /* Uninstantiated types are all functions.  Taking the
         address of a function is a no-op, so just return the
         argument.  */
       /* Uninstantiated types are all functions.  Taking the
         address of a function is a no-op, so just return the
         argument.  */
@@ -4099,9 +4086,6 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
          }
        else
          {
          }
        else
          {
-           /* Unfortunately we cannot just build an address
-              expression here, because we would not handle
-              address-constant-expressions or offsetof correctly.  */
            tree field = TREE_OPERAND (arg, 1);
            tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
            tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
            tree field = TREE_OPERAND (arg, 1);
            tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
            tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
@@ -4109,10 +4093,9 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
                                      ba_check, NULL);
            
            rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
                                      ba_check, NULL);
            
            rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
-           rval = build_nop (argtype, rval);
-           addr = fold (build2 (PLUS_EXPR, argtype, rval,
-                                cp_convert (argtype,
-                                            byte_position (field))));
+
+           TREE_OPERAND (arg, 0) = build_indirect_ref (rval, NULL);
+           addr = build_address (arg);
          }
 
        if (TREE_CODE (argtype) == POINTER_TYPE
          }
 
        if (TREE_CODE (argtype) == POINTER_TYPE
index 8d77691..0a8ac75 100644 (file)
@@ -609,7 +609,7 @@ store_init_value (tree decl, tree init)
   else if (TYPE_NEEDS_CONSTRUCTING (type))
     return build2 (INIT_EXPR, type, decl, value);
   else if (TREE_STATIC (decl)
   else if (TYPE_NEEDS_CONSTRUCTING (type))
     return build2 (INIT_EXPR, type, decl, value);
   else if (TREE_STATIC (decl)
-          && (! TREE_CONSTANT (value)
+          && (TREE_SIDE_EFFECTS (value)
               || ! initializer_constant_valid_p (value, TREE_TYPE (value))))
     return split_nonconstant_init (decl, value);
   
               || ! initializer_constant_valid_p (value, TREE_TYPE (value))))
     return split_nonconstant_init (decl, value);
   
index 175c078..a5f1a49 100644 (file)
@@ -1,5 +1,9 @@
 2004-08-30  Richard Henderson  <rth@redhat.com>
 
 2004-08-30  Richard Henderson  <rth@redhat.com>
 
+       * g++.dg/other/offsetof1.C: Use __builtin_offsetof.
+
+2004-08-30  Richard Henderson  <rth@redhat.com>
+
        * lib/fortran-torture.exp (fortran-torture-execute): Honor
        additional_flags set by alternate driver.
        (ieee-options): New procedure.
        * lib/fortran-torture.exp (fortran-torture-execute): Honor
        additional_flags set by alternate driver.
        (ieee-options): New procedure.
index 6d4ebf9..39bb783 100644 (file)
@@ -11,4 +11,4 @@ struct F
   char j;
 };
 
   char j;
 };
 
-static int ary[((__SIZE_TYPE__)&((struct F *)0)->j)];
+static int ary[__builtin_offsetof(F, j)];