aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/primary.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2016-11-04 19:23:44 +0000
committerPaul Thomas <pault@gcc.gnu.org>2016-11-04 19:23:44 +0000
commitb125dc1e1bb5932a2de833e07bbdc2395097a868 (patch)
treec25b7ef2b8fc5fc8d013468b90130d1b2405d8a7 /gcc/fortran/primary.c
parent5f4cebba260db0f1b1edf45152be3bad2ed779a8 (diff)
downloadgcc-b125dc1e1bb5932a2de833e07bbdc2395097a868.zip
gcc-b125dc1e1bb5932a2de833e07bbdc2395097a868.tar.gz
gcc-b125dc1e1bb5932a2de833e07bbdc2395097a868.tar.bz2
re PR fortran/64933 (ASSOCIATE on a character variable does not allow substring expressions)
2016-04-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/64933 * primary.c (gfc_match_varspec): If selector expression is unambiguously an array, make sure that the associate name is an array and has an array spec. Modify the original condition for doing this to exclude character types. 2016-04-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/64933 * gfortran.dg/associate_23.f90: New test. From-SVN: r241860
Diffstat (limited to 'gcc/fortran/primary.c')
-rw-r--r--gcc/fortran/primary.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index f26740d..50d7072 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1931,15 +1931,36 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
}
/* For associate names, we may not yet know whether they are arrays or not.
- Thus if we have one and parentheses follow, we have to assume that it
- actually is one for now. The final decision will be made at
- resolution time, of course. */
- if (sym->assoc && gfc_peek_ascii_char () == '('
- && !(sym->assoc->dangling && sym->assoc->st
+ If the selector expression is unambiguously an array; eg. a full array
+ or an array section, then the associate name must be an array and we can
+ fix it now. Otherwise, if parentheses follow and it is not a character
+ type, we have to assume that it actually is one for now. The final
+ decision will be made at resolution, of course. */
+ if (sym->assoc
+ && gfc_peek_ascii_char () == '('
+ && sym->ts.type != BT_CLASS
+ && !sym->attr.dimension)
+ {
+ if ((!sym->assoc->dangling
+ && sym->assoc->target
+ && sym->assoc->target->ref
+ && sym->assoc->target->ref->type == REF_ARRAY
+ && (sym->assoc->target->ref->u.ar.type == AR_FULL
+ || sym->assoc->target->ref->u.ar.type == AR_SECTION))
+ ||
+ (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
+ && sym->assoc->st
&& sym->assoc->st->n.sym
- && sym->assoc->st->n.sym->attr.dimension == 0)
- && sym->ts.type != BT_CLASS)
+ && sym->assoc->st->n.sym->attr.dimension == 0))
+ {
sym->attr.dimension = 1;
+ if (sym->as == NULL && sym->assoc
+ && sym->assoc->st
+ && sym->assoc->st->n.sym
+ && sym->assoc->st->n.sym->as)
+ sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
+ }
+ }
if ((equiv_flag && gfc_peek_ascii_char () == '(')
|| gfc_peek_ascii_char () == '[' || sym->attr.codimension