&& (gfc_current_ns == sym->ns
|| (gfc_current_ns == sym->ns->parent
&& gfc_current_ns->proc_name->attr.flavor != FL_MODULE))
- && !(sym->attr.use_assoc || sym->attr.dummy))
+ && !(sym->attr.use_assoc || sym->attr.dummy || sym->attr.result))
gfc_defer_symbol_init (sym);
if ((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_comp)
&& (gfc_current_ns == sym->ns
|| (gfc_current_ns == sym->ns->parent
&& gfc_current_ns->proc_name->attr.flavor != FL_MODULE))
- && !(sym->attr.use_assoc || sym->attr.dummy))
+ && !(sym->attr.use_assoc || sym->attr.dummy || sym->attr.result))
gfc_defer_symbol_init (sym);
/* Dummy PDT 'len' parameters should be checked when they are explicit. */
finish_oacc_declare (ns, sym, false);
- tmp = gfc_trans_code (ns->code);
+ if (gfc_current_ns != ns)
+ {
+ gfc_namespace *old_current_ns = gfc_current_ns;
+ gfc_current_ns = ns;
+ tmp = gfc_trans_code (ns->code);
+ gfc_current_ns = old_current_ns;
+ }
+ else
+ tmp = gfc_trans_code (ns->code);
+
gfc_add_expr_to_block (&body, tmp);
/* This permits the return value to be correctly initialized, even when the
array_expr = expr->value.function.actual->expr;
ns = array_expr->expr_type == EXPR_VARIABLE
&& !array_expr->symtree->n.sym->attr.associate_var
+ && !array_expr->symtree->n.sym->module
? array_expr->symtree->n.sym->ns
: gfc_current_ns;
type = gfc_typenode_for_spec (&array_expr->ts);
const char *iname;
bool t;
gfc_omp_udr *udr = n->u2.udr ? n->u2.udr->udr : NULL;
+ gfc_namespace *old_ns = gfc_current_ns;
+
+ if (gfc_current_ns->proc_name
+ && gfc_current_ns->proc_name->ns != gfc_current_ns)
+ gfc_current_ns = gfc_current_ns->proc_name->ns;
decl = OMP_CLAUSE_DECL (c);
gfc_current_locus = where;
*udr->omp_orig = omp_var_copy[3];
}
}
+
+ gfc_current_ns = old_ns;
}
static tree
--- /dev/null
+!{ dg-do link }
+
+! Contributed by Paul Thomas <pault@gcc.gnu.org>
+! Check PR fortran/125051 is fixed.
+
+module m
+ integer, parameter :: ncells = 8, nsize = ncells+2
+ integer, parameter :: head =2, tail = ncells + 1
+ real :: second_derivative(ncells+2, ncells+2)
+ type :: density_t
+ real :: density(nsize)
+ real:: derivative(nsize)
+ end type
+ type (density_t) :: n[*]
+ real :: n_tail[*] = 0.0
+ real :: n_head[*] = 0.0
+contains
+ subroutine sub
+ integer :: image_no
+ image_no = this_image()
+ sync all
+ if (image_no > 1) n_head = n[image_no -1]%density(tail)
+ if (image_no < num_images()) n_tail = n[image_no +1]%density(head)
+ sync all
+ end
+end module
+
+program main
+ use m
+ implicit none
+ call sub
+contains
+end program
+