+2010-07-10 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/44773
+ * trans-expr.c (arrayfunc_assign_needs_temporary): No temporary
+ if the lhs has never been host associated, as well as not being
+ use associated, a pointer or a target.
+ * resolve.c (resolve_variable): Mark variables that are host
+ associated.
+ * gfortran.h: Add the host_assoc bit to the symbol_attribute
+ structure.
+
2010-07-09 Janus Weil <janus@gcc.gnu.org>
* intrinsic.texi: Add documentation for SAME_TYPE_AS, EXTENDS_TYPE_OF,
use_assoc:1, /* Symbol has been use-associated. */
use_only:1, /* Symbol has been use-associated, with ONLY. */
use_rename:1, /* Symbol has been use-associated and renamed. */
- imported:1; /* Symbol has been associated by IMPORT. */
+ imported:1, /* Symbol has been associated by IMPORT. */
+ host_assoc:1; /* Symbol has been host associated. */
unsigned in_namelist:1, in_common:1, in_equivalence:1;
unsigned function:1, subroutine:1, procedure:1;
sym->entry_id = current_entry_id + 1;
}
+ /* If a symbol has been host_associated mark it. This is used latter,
+ to identify if aliasing is possible via host association. */
+ if (sym->attr.flavor == FL_VARIABLE
+ && gfc_current_ns->parent
+ && (gfc_current_ns->parent == sym->ns
+ || (gfc_current_ns->parent->parent
+ && gfc_current_ns->parent->parent == sym->ns)))
+ sym->attr.host_assoc = 1;
+
resolve_procedure:
if (t == SUCCESS && resolve_procedure_expression (e) == FAILURE)
t = FAILURE;
if (!expr2->value.function.esym->attr.contained)
return false;
+ /* A temporary is not needed if the lhs has never been host
+ associated and the procedure is contained. */
+ else if (!sym->attr.host_assoc)
+ return false;
+
/* A temporary is not needed if the variable is local and not
a pointer, a target or a result. */
if (sym->ns->parent