From: Eric Botcazou Date: Sun, 11 Sep 2011 19:14:51 +0000 (+0000) Subject: utils.c (maybe_unconstrained_array): In the reference to unconstrained array case... X-Git-Tag: releases/gcc-4.7.0~3820 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7e169899559dd04cbde3bf6e0599720e6918a461;p=thirdparty%2Fgcc.git utils.c (maybe_unconstrained_array): In the reference to unconstrained array case, deal with each branch of a COND_EXPR. * 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 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d9095295b29a..fd84feb80642 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2011-09-11 Eric Botcazou + + * 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 * gcc-interface/decl.c (maybe_pad_type): Do not try to change the form diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 1a1034732b56..0176c3ea0c43 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -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 diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 424a0c00fd24..87cb269a140f 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a298b1b55b7..3544a279972f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-09-11 Eric Botcazou + + * gnat.dg/cond_expr2.ad[sb]: New test. + 2011-09-11 Eric Botcazou * 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 index 000000000000..02e3ee382662 --- /dev/null +++ b/gcc/testsuite/gnat.dg/cond_expr2.adb @@ -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 index 000000000000..11c822974651 --- /dev/null +++ b/gcc/testsuite/gnat.dg/cond_expr2.ads @@ -0,0 +1,5 @@ +package Cond_Expr2 is + + function F (X : integer) return String; + +end Cond_Expr2;