decl.c (gnat_to_gnu_entity): Make sure the size of a padding type built around the...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 19 Jun 2015 20:10:50 +0000 (20:10 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 19 Jun 2015 20:10:50 +0000 (20:10 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Function>: Make sure
the size of a padding type built around the return type is positive.
* gcc-interface/trans.c (gnat_to_gnu) <N_Simple_Return_Statement>:
Use INIT_EXPR instead of MODIFY_EXPR to assign to the return object.

From-SVN: r224697

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/ada/gcc-interface/trans.c

index 47aaea51e4f45c390f8d165152f2ddba0113ee36..639d5c8c81e2e41aa34215703e45a325118b1aa4 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Function>: Make sure
+       the size of a padding type built around the return type is positive.
+       * gcc-interface/trans.c (gnat_to_gnu) <N_Simple_Return_Statement>:
+       Use INIT_EXPR instead of MODIFY_EXPR to assign to the return object.
+
 2015-06-17  Andrew MacLeod  <amacleod@redhat.com>
 
        * gcc-interface/cuintp.c: Do not include input.h, line-map.h or is-a.h.
index a17eab6dbfbca4cb3dffeb40b3d6facdf4b9c771..f487e9b5849ab848ae978e40d323daba13e5e1de 100644 (file)
@@ -4242,12 +4242,23 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
            if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_return_type)))
              {
                tree orig_type = gnu_return_type;
+               tree max_return_size
+                 = max_size (TYPE_SIZE (gnu_return_type), true);
+
+               /* If the size overflows to 0, set it to an arbitrary positive
+                  value so that assignments in the type are preserved.  Their
+                  actual size is independent of this positive value.  */
+               if (TREE_CODE (max_return_size) == INTEGER_CST
+                   && TREE_OVERFLOW (max_return_size)
+                   && integer_zerop (max_return_size))
+                 {
+                   max_return_size = copy_node (bitsize_unit_node);
+                   TREE_OVERFLOW (max_return_size) = 1;
+                 }
 
                gnu_return_type
-                 = maybe_pad_type (gnu_return_type,
-                                   max_size (TYPE_SIZE (gnu_return_type),
-                                             true),
-                                   0, gnat_entity, false, false, definition,
+                 = maybe_pad_type (gnu_return_type, max_return_size, 0,
+                                   gnat_entity, false, false, definition,
                                    true);
 
                /* Declare it now since it will never be declared otherwise.
index 85a77ea5fafc92d1b4092ec4f1ba99a1006cef0c..418f923b2bfd8bf67f1de56b3ea9f64b1cc93454 100644 (file)
@@ -6861,7 +6861,7 @@ gnat_to_gnu (Node_Id gnat_node)
                tree gnu_ret_deref
                  = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
                                    gnu_ret_obj);
-               gnu_result = build2 (MODIFY_EXPR, void_type_node,
+               gnu_result = build2 (INIT_EXPR, void_type_node,
                                     gnu_ret_deref, gnu_ret_val);
                add_stmt_with_node (gnu_result, gnat_node);
                gnu_ret_val = NULL_TREE;