From 45bb155d8ccb933b84ba2f349ddb41c59b32a2bd Mon Sep 17 00:00:00 2001 From: Dominique d'Humieres Date: Sat, 24 May 2014 17:36:14 +0200 Subject: [PATCH] backport: [multiple changes] 2014-05-24 Dominique d'Humieres Backport r195492 and r195815 2013-01-27 Paul Thomas PR fortran/55789 PR fortran/56047 * gfortran.h : Add associate_var to symbol_attr. * resolve.c (resolve_assoc_var): Set associate_var attribute. If the target class_ok is set, set it for the associate variable. * check.c (allocatable_check): Associate variables should not have the allocatable attribute even if their symbols do. * class.c (gfc_build_class_symbol): Symbols with associate_var set will always have a good class container. 2013-02-06 Paul Thomas PR fortran/55789 * trans-array.c (trans_array_constructor): Remove condition 'dynamic' = true if the loop ubound is a VAR_DECL. From-SVN: r210893 --- gcc/fortran/ChangeLog | 22 ++++++++++++++++++++++ gcc/fortran/check.c | 2 +- gcc/fortran/class.c | 2 +- gcc/fortran/gfortran.h | 5 +++-- gcc/fortran/resolve.c | 7 +++++++ gcc/fortran/trans-array.c | 3 --- 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 11cbdde933b3..6694c5955334 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,25 @@ +2014-05-24 Dominique d'Humieres + + Backport r195492 and r195815 + 2013-01-27 Paul Thomas + + PR fortran/55789 + PR fortran/56047 + * gfortran.h : Add associate_var to symbol_attr. + * resolve.c (resolve_assoc_var): Set associate_var attribute. + If the target class_ok is set, set it for the associate + variable. + * check.c (allocatable_check): Associate variables should not + have the allocatable attribute even if their symbols do. + * class.c (gfc_build_class_symbol): Symbols with associate_var + set will always have a good class container. + + 2013-02-06 Paul Thomas + + PR fortran/55789 + * trans-array.c (trans_array_constructor): Remove condition + 'dynamic' = true if the loop ubound is a VAR_DECL. + 2014-03-29 Mikael Morin PR fortran/60677 diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index f6195aa8b3a0..e5fd0374829a 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -454,7 +454,7 @@ allocatable_check (gfc_expr *e, int n) symbol_attribute attr; attr = gfc_variable_attr (e, NULL); - if (!attr.allocatable) + if (!attr.allocatable || attr.associate_var) { gfc_error ("'%s' argument of '%s' intrinsic at %L must be ALLOCATABLE", gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic, diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index d4ed6b043ac2..55278cae0757 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -493,7 +493,7 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, return SUCCESS; attr->class_ok = attr->dummy || attr->pointer || attr->allocatable - || attr->select_type_temporary; + || attr->select_type_temporary || attr->associate_var; if (!attr->class_ok) /* We can not build the class container yet. */ diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 54310dfbea15..7db6dc55055c 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -786,8 +786,9 @@ typedef struct unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1, private_comp:1, zero_comp:1, coarray_comp:1, lock_comp:1; - /* This is a temporary selector for SELECT TYPE. */ - unsigned select_type_temporary:1; + /* This is a temporary selector for SELECT TYPE or an associate + variable for SELECT_TYPE or ASSOCIATE. */ + unsigned select_type_temporary:1, associate_var:1; /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */ unsigned ext_attr:EXT_ATTR_NUM; diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 514060882d65..7cd2a4069c05 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -7991,6 +7991,13 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) has no corank. */ sym->as->corank = 0; } + + /* Mark this as an associate variable. */ + sym->attr.associate_var = 1; + + /* If the target is a good class object, so is the associate variable. */ + if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok) + sym->attr.class_ok = 1; } diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 25340f58eea2..b9574627f1d1 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -2282,9 +2282,6 @@ trans_array_constructor (gfc_ss * ss, locus * where) } } - if (TREE_CODE (*loop_ubound0) == VAR_DECL) - dynamic = true; - gfc_trans_create_temp_array (&outer_loop->pre, &outer_loop->post, ss, type, NULL_TREE, dynamic, true, false, where); -- 2.47.2