From 3017c39477f2c72f6064bb9ecd587f7d7a718f00 Mon Sep 17 00:00:00 2001 From: mikael Date: Sun, 4 Mar 2012 20:46:55 +0000 Subject: [PATCH] fortran/ * trans.h (struct gfc_ss_info): Move can_be_null_ref component from the data::scalar subcomponent to the toplevel. * trans-expr.c (gfc_conv_expr): Update component reference. * trans-array.c (gfc_add_loop_ss_code): Ditto. (gfc_walk_elemental_function_args): Ditto. Move the conditional setting the field out of the scalar-only block. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184893 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/trans-array.c | 17 +++++++++-------- gcc/fortran/trans-expr.c | 2 +- gcc/fortran/trans.h | 8 +++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3a072e0..961bd4e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2012-03-04 Mikael Morin + + * trans.h (struct gfc_ss_info): Move can_be_null_ref component from + the data::scalar subcomponent to the toplevel. + * trans-expr.c (gfc_conv_expr): Update component reference. + * trans-array.c (gfc_add_loop_ss_code): Ditto. + (gfc_walk_elemental_function_args): Ditto. Move the conditional setting + the field out of the scalar-only block. + 2012-03-04 Francois-Xavier Coudert PR fortran/36160 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index bbe5afe..b54c95b 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -2448,7 +2448,7 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript, case GFC_SS_REFERENCE: /* Scalar argument to elemental procedure. */ gfc_init_se (&se, NULL); - if (ss_info->data.scalar.can_be_null_ref) + if (ss_info->can_be_null_ref) { /* If the actual argument can be absent (in other words, it can be a NULL reference), don't try to evaluate it; pass instead @@ -8493,17 +8493,18 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg, newss = gfc_get_scalar_ss (head, arg->expr); newss->info->type = type; - if (dummy_arg != NULL - && dummy_arg->sym->attr.optional - && arg->expr->expr_type == EXPR_VARIABLE - && (gfc_expr_attr (arg->expr).optional - || gfc_expr_attr (arg->expr).allocatable - || gfc_expr_attr (arg->expr).pointer)) - newss->info->data.scalar.can_be_null_ref = true; } else scalar = 0; + if (dummy_arg != NULL + && dummy_arg->sym->attr.optional + && arg->expr->expr_type == EXPR_VARIABLE + && (gfc_expr_attr (arg->expr).optional + || gfc_expr_attr (arg->expr).allocatable + || gfc_expr_attr (arg->expr).pointer)) + newss->info->can_be_null_ref = true; + head = newss; if (!tail) { diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d69399c..5fb95b1 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -5458,7 +5458,7 @@ gfc_conv_expr (gfc_se * se, gfc_expr * expr) se->expr = ss_info->data.scalar.value; /* If the reference can be NULL, the value field contains the reference, not the value the reference points to (see gfc_add_loop_ss_code). */ - if (ss_info->data.scalar.can_be_null_ref) + if (ss_info->can_be_null_ref) se->expr = build_fold_indirect_ref_loc (input_location, se->expr); se->string_length = ss_info->string_length; diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index e685a84..8beefe1 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -198,9 +198,6 @@ typedef struct gfc_ss_info struct { tree value; - /* Tells whether the reference can be null in the GFC_SS_REFERENCE case. - Used to handle elemental procedures' optional arguments. */ - bool can_be_null_ref; } scalar; @@ -223,6 +220,11 @@ typedef struct gfc_ss_info /* Suppresses precalculation of scalars in WHERE assignments. */ unsigned where:1; + + /* Tells whether the SS is for an actual argument which can be a NULL + reference. In other words, the associated dummy argument is OPTIONAL. + Used to handle elemental procedures. */ + bool can_be_null_ref; } gfc_ss_info; -- 2.7.4