trans.c (gnat_gimplify_expr): Add 'type' variable.
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 22 Nov 2014 12:15:53 +0000 (12:15 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 22 Nov 2014 12:15:53 +0000 (12:15 +0000)
* gcc-interface/trans.c (gnat_gimplify_expr): Add 'type' variable.
<case NULL_EXPR>: Deal with unconstrained array types and use 'type'.
<case ADDR_EXPR>: Use 'type'.
<case DECL_EXPR>: Likewise.

From-SVN: r217964

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/no_streams.ads [new file with mode: 0644]

index 90c685ad9de0d38e2141046a9d1c8518c17599cd..881c2f8f7ef30964c0d281482abafd4530810d4e 100644 (file)
@@ -1,3 +1,10 @@
+2014-11-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (gnat_gimplify_expr): Add 'type' variable.
+       <case NULL_EXPR>: Deal with unconstrained array types and use 'type'.
+       <case ADDR_EXPR>: Use 'type'.
+       <case DECL_EXPR>: Likewise.
+
 2014-11-20  Arnaud Charlet  <charlet@adacore.com>
 
        PR ada/63931
index 01c9234e166a10ab0011ce874704d1c7d6a7d0bd..3d27dde709fd24d293688652ebeb15df048ffe7a 100644 (file)
@@ -7657,6 +7657,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
                    gimple_seq *post_p ATTRIBUTE_UNUSED)
 {
   tree expr = *expr_p;
+  tree type = TREE_TYPE (expr);
   tree op;
 
   if (IS_ADA_STMT (expr))
@@ -7665,16 +7666,17 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
   switch (TREE_CODE (expr))
     {
     case NULL_EXPR:
-      /* If this is for a scalar, just make a VAR_DECL for it.  If for
-        an aggregate, get a null pointer of the appropriate type and
-        dereference it.  */
-      if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
-       *expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr),
-                         convert (build_pointer_type (TREE_TYPE (expr)),
-                                  integer_zero_node));
+      /* If this is an aggregate type, build a null pointer of the appropriate
+        type and dereference it.  */
+      if (AGGREGATE_TYPE_P (type)
+         || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
+       *expr_p = build_unary_op (INDIRECT_REF, NULL_TREE,
+                                 convert (build_pointer_type (type),
+                                          integer_zero_node));
+      /* Otherwise, just make a VAR_DECL.  */
       else
        {
-         *expr_p = create_tmp_var (TREE_TYPE (expr), NULL);
+         *expr_p = create_tmp_var (type, NULL);
          TREE_NO_WARNING (*expr_p) = 1;
        }
 
@@ -7697,7 +7699,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
       if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
        {
          tree addr = build_fold_addr_expr (tree_output_constant_def (op));
-         *expr_p = fold_convert (TREE_TYPE (expr), addr);
+         *expr_p = fold_convert (type, addr);
          return GS_ALL_DONE;
        }
 
@@ -7711,7 +7713,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
         required if the type is passed by reference.  */
       if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR)
          && AGGREGATE_TYPE_P (TREE_TYPE (op))
-         && !AGGREGATE_TYPE_P (TREE_TYPE (expr)))
+         && !AGGREGATE_TYPE_P (type))
        {
          tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
          gimple_add_tmp_var (new_var);
index 11d5fd2823709b7324cf4bbc7c82f311f583f33a..80deed0d419c34f584fa9baf7be6f54fae36c7b3 100644 (file)
@@ -1,3 +1,7 @@
+2014-11-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/no_streams.ads: New test.
+
 2014-11-22  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/store-motion-fgcse-sm.c (dg-final): Cleanup
diff --git a/gcc/testsuite/gnat.dg/specs/no_streams.ads b/gcc/testsuite/gnat.dg/specs/no_streams.ads
new file mode 100644 (file)
index 0000000..e5a0742
--- /dev/null
@@ -0,0 +1,14 @@
+-- { dg-do compile }
+
+pragma Restrictions (No_Streams);
+
+with Ada.Containers.Ordered_Maps;
+
+package No_Streams is
+
+  type Arr is new String (1..8);
+
+  package My_Ordered_Map is new Ada.Containers.Ordered_Maps
+                                  (Key_Type => Natural, Element_Type => Arr);
+
+end No_Streams;