Hello world,
this patch yields an error for identical values in vector expression
subscripts. The algorithm is O(n**2) because
a) It would be impossible to detect a([i,i]) otherwise
b) This is not likely to be a performance bottleneck because
people don't use large vector indices.
(as noted by the different comments in the PR).
Regression-tested. OK for trunk?
Thomas
2013-07-28 Thomas Koenig <[email protected]>
PR fortran/58009
* expr.c (gfc_check_vardef_context): Check for same values in
vector expression subscripts.
2013-07-28 Thomas Koenig <[email protected]>
PR fortran/58009
* gfortran.dg/vector_subsript_7.f90: New test.
Index: expr.c
===================================================================
--- expr.c (Revision 200743)
+++ expr.c (Arbeitskopie)
@@ -4700,6 +4700,8 @@ gfc_check_vardef_context (gfc_expr* e, bool pointe
bool unlimited;
symbol_attribute attr;
gfc_ref* ref;
+ bool retval;
+ int i;
if (e->expr_type == EXPR_VARIABLE)
{
@@ -4922,5 +4924,54 @@ gfc_check_vardef_context (gfc_expr* e, bool pointe
}
}
- return true;
+ /* Check for same value in vector expression subscript. */
+ retval = true;
+
+ if (e->rank > 0)
+ for (ref = e->ref; ref != NULL; ref = ref->next)
+ if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
+ for (i = 0; i<e->rank; i++)
+ if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
+ {
+ gfc_expr *arr = ref->u.ar.start[i];
+ if (arr->expr_type == EXPR_ARRAY)
+ {
+ gfc_constructor *c, *n;
+ gfc_expr *ec, *en;
+
+ for (c = gfc_constructor_first (arr->value.constructor);
+ c != NULL; c = gfc_constructor_next (c))
+ {
+ if (c == NULL || c->iterator != NULL)
+ continue;
+
+ ec = c->expr;
+
+ for (n = gfc_constructor_next (c); n != NULL;
+ n = gfc_constructor_next (n))
+ {
+ if (n->iterator != NULL)
+ continue;
+
+ en = n->expr;
+ if (gfc_dep_compare_expr (ec, en) == 0)
+ {
+ gfc_error_now ("Elements with the same value at %L"
+ " and %L in vector subscript"
+ " in a variable definition"
+ " context (%s)", &(ec->where),
+ &(en->where), context);
+ retval = false;
+
+ /* Do not issue O(n**2) errors for n occurrences
+ of the same value. */
+ break;
+
+ }
+ }
+ }
+ }
+ }
+
+ return retval;
}
! { dg-do compile }
! PR 58009 - If a vector subscript has two or more elements with the
! same value, an array section with that vector subscript
! shall not appear in a variable definition context.
program main
real, dimension(4) :: a,b
read (*,*) a([1,2,3,2]),i ! { dg-error "Elements with the same value" }
b([1+i,1,i+1,2]) = a ! { dg-error "Elements with the same value" }
call foo (a([4,2,1,1])) ! { dg-error "Elements with the same value" }
print *,a,b
contains
subroutine foo(arg)
real, intent(inout) :: arg(:)
arg = arg + 1
end subroutine foo
end