Commit 8dc998fb by Harald Anlauf Committed by Steven G. Kargl

re PR fortran/69741 (Bad error in forall with array loop counters)

2016-11-20  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/69741
	* resolve.c (gfc_resolve_forall): Check for nonscalar index variables.

2016-11-20  Harald Anlauf  <anlauf@gmx.de>
 
	PR fortran/69741
	* gfortran.dg/forall_18.f90: New testcase.

From-SVN: r242641
parent 9692308d
2016-11-20 Harald Anlauf <anlauf@gmx.de>
PR fortran/69741
* resolve.c (gfc_resolve_forall): Check for nonscalar index variables.
2016-11-20 Andre Vehreschild <vehre@gcc.gnu.org> 2016-11-20 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78395 PR fortran/78395
......
...@@ -9647,16 +9647,15 @@ gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save) ...@@ -9647,16 +9647,15 @@ gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
static gfc_expr **var_expr; static gfc_expr **var_expr;
static int total_var = 0; static int total_var = 0;
static int nvar = 0; static int nvar = 0;
int old_nvar, tmp; int i, old_nvar, tmp;
gfc_forall_iterator *fa; gfc_forall_iterator *fa;
int i;
old_nvar = nvar; old_nvar = nvar;
/* Start to resolve a FORALL construct */ /* Start to resolve a FORALL construct */
if (forall_save == 0) if (forall_save == 0)
{ {
/* Count the total number of FORALL index in the nested FORALL /* Count the total number of FORALL indices in the nested FORALL
construct in order to allocate the VAR_EXPR with proper size. */ construct in order to allocate the VAR_EXPR with proper size. */
total_var = gfc_count_forall_iterators (code); total_var = gfc_count_forall_iterators (code);
...@@ -9664,19 +9663,25 @@ gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save) ...@@ -9664,19 +9663,25 @@ gfc_resolve_forall (gfc_code *code, gfc_namespace *ns, int forall_save)
var_expr = XCNEWVEC (gfc_expr *, total_var); var_expr = XCNEWVEC (gfc_expr *, total_var);
} }
/* The information about FORALL iterator, including FORALL index start, end /* The information about FORALL iterator, including FORALL indices start, end
and stride. The FORALL index can not appear in start, end or stride. */ and stride. An outer FORALL indice cannot appear in start, end or stride. */
for (fa = code->ext.forall_iterator; fa; fa = fa->next) for (fa = code->ext.forall_iterator; fa; fa = fa->next)
{ {
/* Fortran 20008: C738 (R753). */
if (fa->var->ref && fa->var->ref->type == REF_ARRAY)
{
gfc_error ("FORALL index-name at %L must be a scalar variable "
"of type integer", &fa->var->where);
continue;
}
/* Check if any outer FORALL index name is the same as the current /* Check if any outer FORALL index name is the same as the current
one. */ one. */
for (i = 0; i < nvar; i++) for (i = 0; i < nvar; i++)
{ {
if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym) if (fa->var->symtree->n.sym == var_expr[i]->symtree->n.sym)
{ gfc_error ("An outer FORALL construct already has an index "
gfc_error ("An outer FORALL construct already has an index " "with this name %L", &fa->var->where);
"with this name %L", &fa->var->where);
}
} }
/* Record the current FORALL index. */ /* Record the current FORALL index. */
......
2016-11-20 Harald Anlauf <anlauf@gmx.de>
PR fortran/69741
* gfortran.dg/forall_18.f90: New testcase.
2016-11-20 Marc Glisse <marc.glisse@inria.fr> 2016-11-20 Marc Glisse <marc.glisse@inria.fr>
* gcc.dg/tree-ssa/cmpexactdiv.c: New file. * gcc.dg/tree-ssa/cmpexactdiv.c: New file.
......
! { dg-do compile }
! PR fortran/69741 - improve error message for nonscalar FORALL index variables
!
subroutine check
integer :: ii(2), i
real :: a(3,2)
forall (ii(1)=1:3, i=1:2) ! { dg-error "scalar variable of type integer" }
a(ii(1),i) = ii(1) * i
end forall
forall (j=1:3, ii(2)=1:2) ! { dg-error "scalar variable of type integer" }
a(j,ii(2)) = j * ii(2)
end forall
end subroutine check
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment