Commit 5e0f1fca by Eric Botcazou Committed by Eric Botcazou

trans.c (gnat_gimplify_expr): Add 'type' variable.

	* 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
parent 0211f617
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> 2014-11-20 Arnaud Charlet <charlet@adacore.com>
PR ada/63931 PR ada/63931
......
...@@ -7657,6 +7657,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, ...@@ -7657,6 +7657,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
gimple_seq *post_p ATTRIBUTE_UNUSED) gimple_seq *post_p ATTRIBUTE_UNUSED)
{ {
tree expr = *expr_p; tree expr = *expr_p;
tree type = TREE_TYPE (expr);
tree op; tree op;
if (IS_ADA_STMT (expr)) if (IS_ADA_STMT (expr))
...@@ -7665,16 +7666,17 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, ...@@ -7665,16 +7666,17 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
switch (TREE_CODE (expr)) switch (TREE_CODE (expr))
{ {
case NULL_EXPR: case NULL_EXPR:
/* If this is for a scalar, just make a VAR_DECL for it. If for /* If this is an aggregate type, build a null pointer of the appropriate
an aggregate, get a null pointer of the appropriate type and type and dereference it. */
dereference it. */ if (AGGREGATE_TYPE_P (type)
if (AGGREGATE_TYPE_P (TREE_TYPE (expr))) || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
*expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr), *expr_p = build_unary_op (INDIRECT_REF, NULL_TREE,
convert (build_pointer_type (TREE_TYPE (expr)), convert (build_pointer_type (type),
integer_zero_node)); integer_zero_node));
/* Otherwise, just make a VAR_DECL. */
else else
{ {
*expr_p = create_tmp_var (TREE_TYPE (expr), NULL); *expr_p = create_tmp_var (type, NULL);
TREE_NO_WARNING (*expr_p) = 1; TREE_NO_WARNING (*expr_p) = 1;
} }
...@@ -7697,7 +7699,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, ...@@ -7697,7 +7699,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op)) if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
{ {
tree addr = build_fold_addr_expr (tree_output_constant_def (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; return GS_ALL_DONE;
} }
...@@ -7711,7 +7713,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, ...@@ -7711,7 +7713,7 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
required if the type is passed by reference. */ required if the type is passed by reference. */
if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR) if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR)
&& AGGREGATE_TYPE_P (TREE_TYPE (op)) && 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"); tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
gimple_add_tmp_var (new_var); gimple_add_tmp_var (new_var);
......
2014-11-22 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/no_streams.ads: New test.
2014-11-22 Uros Bizjak <ubizjak@gmail.com> 2014-11-22 Uros Bizjak <ubizjak@gmail.com>
* gcc.dg/store-motion-fgcse-sm.c (dg-final): Cleanup * gcc.dg/store-motion-fgcse-sm.c (dg-final): Cleanup
......
-- { 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;
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