]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
utils.c (maybe_unconstrained_array): In the reference to unconstrained array case...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 11 Sep 2011 19:14:51 +0000 (19:14 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 11 Sep 2011 19:14:51 +0000 (19:14 +0000)
* gcc-interface/utils.c (maybe_unconstrained_array): In the reference
to unconstrained array case, deal with each branch of a COND_EXPR.
* gcc-interface/utils2.c (build_allocator): Deal with each branch of
a COND_EXPR in the initializer, if present.

From-SVN: r178766

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c
gcc/ada/gcc-interface/utils2.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/cond_expr2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/cond_expr2.ads [new file with mode: 0644]

index d9095295b29a1f996285067d8a637822c59e054a..fd84feb80642415c0af3d2a01f86287b667e8753 100644 (file)
@@ -1,3 +1,10 @@
+2011-09-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (maybe_unconstrained_array): In the reference
+       to unconstrained array case, deal with each branch of a COND_EXPR.
+       * gcc-interface/utils2.c (build_allocator): Deal with each branch of
+       a COND_EXPR in the initializer, if present.
+
 2011-09-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (maybe_pad_type): Do not try to change the form
index 1a1034732b566ac2c176cddb4406894b59cb8770..0176c3ea0c43fc5f01c35c62eb932f5ab664dc18 100644 (file)
@@ -4241,22 +4241,44 @@ tree
 maybe_unconstrained_array (tree exp)
 {
   enum tree_code code = TREE_CODE (exp);
-  tree new_exp;
 
   switch (TREE_CODE (TREE_TYPE (exp)))
     {
     case UNCONSTRAINED_ARRAY_TYPE:
       if (code == UNCONSTRAINED_ARRAY_REF)
        {
-         new_exp = TREE_OPERAND (exp, 0);
-         new_exp
-           = build_unary_op (INDIRECT_REF, NULL_TREE,
-                             build_component_ref (new_exp, NULL_TREE,
-                                                  TYPE_FIELDS
-                                                  (TREE_TYPE (new_exp)),
-                                                  false));
-         TREE_READONLY (new_exp) = TREE_READONLY (exp);
-         return new_exp;
+         const bool read_only = TREE_READONLY (exp);
+         exp = TREE_OPERAND (exp, 0);
+         if (TREE_CODE (exp) == COND_EXPR)
+           {
+             tree op1
+               = build_unary_op (INDIRECT_REF, NULL_TREE,
+                                 build_component_ref (TREE_OPERAND (exp, 1),
+                                                      NULL_TREE,
+                                                      TYPE_FIELDS
+                                                      (TREE_TYPE (exp)),
+                                                      false));
+             tree op2
+               = build_unary_op (INDIRECT_REF, NULL_TREE,
+                                 build_component_ref (TREE_OPERAND (exp, 2),
+                                                      NULL_TREE,
+                                                      TYPE_FIELDS
+                                                      (TREE_TYPE (exp)),
+                                                      false));
+
+             exp = build3 (COND_EXPR,
+                           TREE_TYPE (TREE_TYPE (TYPE_FIELDS
+                                                 (TREE_TYPE (exp)))),
+                           TREE_OPERAND (exp, 0), op1, op2);
+           }
+         else
+           exp = build_unary_op (INDIRECT_REF, NULL_TREE,
+                                 build_component_ref (exp, NULL_TREE,
+                                                      TYPE_FIELDS
+                                                      (TREE_TYPE (exp)),
+                                                      false));
+         TREE_READONLY (exp) = read_only;
+         return exp;
        }
 
       else if (code == NULL_EXPR)
@@ -4270,7 +4292,8 @@ maybe_unconstrained_array (tree exp)
         it contains a template.  */
       if (TYPE_PADDING_P (TREE_TYPE (exp)))
        {
-         new_exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
+         tree new_exp
+           = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
          if (TREE_CODE (TREE_TYPE (new_exp)) == RECORD_TYPE
              && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new_exp)))
            return
index 424a0c00fd245a38c69d4b8fea72dc28e055051f..87cb269a140f7842316bc21a765c822c90887d9e 100644 (file)
@@ -2046,6 +2046,16 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
   if (init && TREE_CODE (init) == NULL_EXPR)
     return build1 (NULL_EXPR, result_type, TREE_OPERAND (init, 0));
 
+  /* If the initializer, if present, is a COND_EXPR, deal with each branch.  */
+  else if (init && TREE_CODE (init) == COND_EXPR)
+    return build3 (COND_EXPR, result_type, TREE_OPERAND (init, 0),
+                  build_allocator (type, TREE_OPERAND (init, 1), result_type,
+                                   gnat_proc, gnat_pool, gnat_node,
+                                   ignore_init_type),
+                  build_allocator (type, TREE_OPERAND (init, 2), result_type,
+                                   gnat_proc, gnat_pool, gnat_node,
+                                   ignore_init_type));
+
   /* If RESULT_TYPE is a fat or thin pointer, set SIZE to be the sum of the
      sizes of the object and its template.  Allocate the whole thing and
      fill in the parts that are known.  */
index 1a298b1b55b7ae9b09ce61d3b49a6fac40522691..3544a279972f3bda6a566b013ad7a4f49037349f 100644 (file)
@@ -1,3 +1,7 @@
+2011-09-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/cond_expr2.ad[sb]: New test.
+
 2011-09-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/atomic5.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/cond_expr2.adb b/gcc/testsuite/gnat.dg/cond_expr2.adb
new file mode 100644 (file)
index 0000000..02e3ee3
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-gnat12" }
+
+package body Cond_Expr2 is
+
+  function F (X : integer) return String is
+  begin
+    return (if X > 0 then "positive" else "negative");
+  end;
+
+end Cond_Expr2;
diff --git a/gcc/testsuite/gnat.dg/cond_expr2.ads b/gcc/testsuite/gnat.dg/cond_expr2.ads
new file mode 100644 (file)
index 0000000..11c8229
--- /dev/null
@@ -0,0 +1,5 @@
+package Cond_Expr2 is
+
+  function F (X : integer) return String;
+
+end Cond_Expr2;