utils2.c (build_binary_op): Do not use the type of the left operand if...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 30 Jun 2009 19:20:24 +0000 (19:20 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 30 Jun 2009 19:20:24 +0000 (19:20 +0000)
* gcc-interface/utils2.c (build_binary_op) <MODIFY_EXPR>: Do not use
the type of the left operand if it pads a self-referential type when
the right operand is a constructor.

* gcc-interface/lang-specs.h: Fix copyright date.

From-SVN: r149115

gcc/ada/ChangeLog
gcc/ada/gcc-interface/lang-specs.h
gcc/ada/gcc-interface/utils2.c

index 65d3720c33abffa63824a3b8422ab477c9598c1c..a79a583e9812f2b80f5440a9ec4d524cf50e0c8d 100644 (file)
@@ -1,3 +1,11 @@
+2009-06-30  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils2.c (build_binary_op) <MODIFY_EXPR>: Do not use
+       the type of the left operand if it pads a self-referential type when
+       the right operand is a constructor.
+
+       * gcc-interface/lang-specs.h: Fix copyright date.
+
 2009-06-30  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c: Include tree-inline.h.
index 1afba3706b41309cb8311b262f70006830a623db..e0c1be9e1030c3d5c33c7e0ffec0de37fcf62c29 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                              C Header File                               *
  *                                                                          *
- *           Copyright (C) 1992-2008, Free Software Foundation, Inc.        *
+ *           Copyright (C) 1992-2009, Free Software Foundation, Inc.        *
  *                                                                          *
  * GNAT is free software;  you can  redistribute it  and/or modify it under *
  * terms of the  GNU General Public License as published  by the Free Soft- *
index 8ee9d4db918d964598913a0c527e3c030eda9802..e60e5a093ae0103484c3d60dc16fb000eabfffff 100644 (file)
@@ -707,9 +707,10 @@ build_binary_op (enum tree_code op_code, tree result_type,
 
       /* If we are copying between padded objects with compatible types, use
         the padded view of the objects, this is very likely more efficient.
-        Likewise for a padded that is assigned a constructor, in order to
-        avoid putting a VIEW_CONVERT_EXPR on the LHS.  But don't do this if
-        we wouldn't have actually copied anything.  */
+        Likewise for a padded object that is assigned a constructor, if we
+        can convert the constructor to the inner type, to avoid putting a
+        VIEW_CONVERT_EXPR on the LHS.  But don't do so if we wouldn't have
+        actually copied anything.  */
       else if (TREE_CODE (left_type) == RECORD_TYPE
               && TYPE_IS_PADDING_P (left_type)
               && TREE_CONSTANT (TYPE_SIZE (left_type))
@@ -719,9 +720,11 @@ build_binary_op (enum tree_code op_code, tree result_type,
                    && TYPE_IS_PADDING_P
                       (TREE_TYPE (TREE_OPERAND (right_operand, 0)))
                    && gnat_types_compatible_p
-                       (left_type,
-                        TREE_TYPE (TREE_OPERAND (right_operand, 0))))
-                  || TREE_CODE (right_operand) == CONSTRUCTOR)
+                      (left_type,
+                       TREE_TYPE (TREE_OPERAND (right_operand, 0))))
+                  || (TREE_CODE (right_operand) == CONSTRUCTOR
+                      && !CONTAINS_PLACEHOLDER_P
+                          (DECL_SIZE (TYPE_FIELDS (left_type)))))
               && !integer_zerop (TYPE_SIZE (right_type)))
        operation_type = left_type;