diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2013-07-28 21:10:23 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2013-07-28 21:10:23 +0000 |
commit | e26793231866c196800a3b3a4f11f6a3e33cde0a (patch) | |
tree | bbe0baa1380d24830310c5eccd77edc8f9a5bc36 /gcc/fortran | |
parent | b698d310d8df1cb7a2a02dfdf63476a5f1146b53 (diff) | |
download | gcc-e26793231866c196800a3b3a4f11f6a3e33cde0a.zip gcc-e26793231866c196800a3b3a4f11f6a3e33cde0a.tar.gz gcc-e26793231866c196800a3b3a4f11f6a3e33cde0a.tar.bz2 |
re PR fortran/58009 (Elements with same value in vector subscript in variable definition context)
2013-07-28 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/58009
* expr.c (gfc_check_vardef_context): Check for same values in
vector expression subscripts.
2013-07-28 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/58009
* gfortran.dg/vector_subsript_7.f90: New test.
From-SVN: r201294
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 45 |
2 files changed, 51 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 559e688..8ec11b6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2013-07-28 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/58009 + * expr.c (gfc_check_vardef_context): Check for same values in + vector expression subscripts. + 2013-07-27 Tobias Burnus <burnus@net-b.de> PR fortran/57991 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 3ece2d3..c00fbc5 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -4700,6 +4700,7 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, bool unlimited; symbol_attribute attr; gfc_ref* ref; + int i; if (e->expr_type == EXPR_VARIABLE) { @@ -4922,5 +4923,49 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, } } + /* Check for same value in vector expression subscript. */ + + 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 < GFC_MAX_DIMENSIONS + && ref->u.ar.dimen_type[i] != 0; 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); + return false; + } + } + } + } + } + return true; } |