From 5e0f1fca62d34663d2e2040c61d711c09fa9762d Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 22 Nov 2014 12:15:53 +0000 Subject: trans.c (gnat_gimplify_expr): Add 'type' variable. * gcc-interface/trans.c (gnat_gimplify_expr): Add 'type' variable. : Deal with unconstrained array types and use 'type'. : Use 'type'. : Likewise. From-SVN: r217964 --- gcc/ada/gcc-interface/trans.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'gcc/ada/gcc-interface/trans.c') diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 01c9234..3d27dde 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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); -- cgit v1.1