Commit 7e169899 by Eric Botcazou Committed by Eric Botcazou

utils.c (maybe_unconstrained_array): In the reference to unconstrained array…

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
parent 819a653e
2011-09-11 Eric Botcazou <ebotcazou@adacore.com> 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 * gcc-interface/decl.c (maybe_pad_type): Do not try to change the form
of an addressable type. of an addressable type.
* gcc-interface/trans.c (gnat_gimplify_expr) <VIEW_CONVERT_EXPR>: New. * gcc-interface/trans.c (gnat_gimplify_expr) <VIEW_CONVERT_EXPR>: New.
......
...@@ -4241,22 +4241,44 @@ tree ...@@ -4241,22 +4241,44 @@ tree
maybe_unconstrained_array (tree exp) maybe_unconstrained_array (tree exp)
{ {
enum tree_code code = TREE_CODE (exp); enum tree_code code = TREE_CODE (exp);
tree new_exp;
switch (TREE_CODE (TREE_TYPE (exp))) switch (TREE_CODE (TREE_TYPE (exp)))
{ {
case UNCONSTRAINED_ARRAY_TYPE: case UNCONSTRAINED_ARRAY_TYPE:
if (code == UNCONSTRAINED_ARRAY_REF) if (code == UNCONSTRAINED_ARRAY_REF)
{ {
new_exp = TREE_OPERAND (exp, 0); const bool read_only = TREE_READONLY (exp);
new_exp exp = TREE_OPERAND (exp, 0);
= build_unary_op (INDIRECT_REF, NULL_TREE, if (TREE_CODE (exp) == COND_EXPR)
build_component_ref (new_exp, NULL_TREE, {
TYPE_FIELDS tree op1
(TREE_TYPE (new_exp)), = build_unary_op (INDIRECT_REF, NULL_TREE,
false)); build_component_ref (TREE_OPERAND (exp, 1),
TREE_READONLY (new_exp) = TREE_READONLY (exp); NULL_TREE,
return new_exp; 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) else if (code == NULL_EXPR)
...@@ -4270,7 +4292,8 @@ maybe_unconstrained_array (tree exp) ...@@ -4270,7 +4292,8 @@ maybe_unconstrained_array (tree exp)
it contains a template. */ it contains a template. */
if (TYPE_PADDING_P (TREE_TYPE (exp))) 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 if (TREE_CODE (TREE_TYPE (new_exp)) == RECORD_TYPE
&& TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new_exp))) && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new_exp)))
return return
......
...@@ -2046,6 +2046,16 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc, ...@@ -2046,6 +2046,16 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
if (init && TREE_CODE (init) == NULL_EXPR) if (init && TREE_CODE (init) == NULL_EXPR)
return build1 (NULL_EXPR, result_type, TREE_OPERAND (init, 0)); 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 /* 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 sizes of the object and its template. Allocate the whole thing and
fill in the parts that are known. */ fill in the parts that are known. */
......
2011-09-11 Eric Botcazou <ebotcazou@adacore.com> 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. * gnat.dg/atomic5.ad[sb]: New test.
2011-09-10 H.J. Lu <hongjiu.lu@intel.com> 2011-09-10 H.J. Lu <hongjiu.lu@intel.com>
......
-- { 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;
package Cond_Expr2 is
function F (X : integer) return String;
end Cond_Expr2;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment