+2014-05-24 Dominique d'Humieres <dominiq@lps.ens.fr>
+
+ Backport r195492 and r195815
+ 2013-01-27 Paul Thomas <pault@gcc.gnu.org>
+
+ 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 <pault@gcc.gnu.org>
+
+ 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 <mikael@gcc.gnu.org>
PR fortran/60677
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,
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. */
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;
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;
}
}
}
- 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);