Commit b125dc1e by Paul Thomas

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
parent 5f4cebba
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-11-03 Fritz Reese <fritzoreese@gmail.com> 2016-11-03 Fritz Reese <fritzoreese@gmail.com>
* gfortran.texi: Document. * gfortran.texi: Document.
......
...@@ -1931,15 +1931,36 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, ...@@ -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. /* 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 If the selector expression is unambiguously an array; eg. a full array
actually is one for now. The final decision will be made at or an array section, then the associate name must be an array and we can
resolution time, of course. */ fix it now. Otherwise, if parentheses follow and it is not a character
if (sym->assoc && gfc_peek_ascii_char () == '(' type, we have to assume that it actually is one for now. The final
&& !(sym->assoc->dangling && sym->assoc->st 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
&& sym->assoc->st->n.sym->attr.dimension == 0) && sym->assoc->st->n.sym->attr.dimension == 0))
&& sym->ts.type != BT_CLASS) {
sym->attr.dimension = 1; 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 () == '(') if ((equiv_flag && gfc_peek_ascii_char () == '(')
|| gfc_peek_ascii_char () == '[' || sym->attr.codimension || gfc_peek_ascii_char () == '[' || sym->attr.codimension
......
2016-04-19 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64933
* gfortran.dg/associate_23.f90: New test.
2016-11-04 Jakub Jelinek <jakub@redhat.com> 2016-11-04 Jakub Jelinek <jakub@redhat.com>
PR target/77834 PR target/77834
......
! { dg-do run }
!
! Tests the fix for PR64933
!
! Contributed by Olivier Marsden <olivier.marsden@ecmwf.int>
!
program test_this
implicit none
character(len = 15) :: char_var, char_var_dim (3)
character(len = 80) :: buffer
! Original failing case reported in PR
ASSOCIATE(should_work=>char_var)
should_work = "test succesful"
write (buffer, *) should_work(5:14)
END ASSOCIATE
if (trim (buffer) .ne. " succesful") call abort
! Found to be failing during debugging
ASSOCIATE(should_work=>char_var_dim)
should_work = ["test SUCCESFUL", "test_SUCCESFUL", "test.SUCCESFUL"]
write (buffer, *) should_work(:)(5:14)
END ASSOCIATE
if (trim (buffer) .ne. " SUCCESFUL_SUCCESFUL.SUCCESFUL") call abort
! Found to be failing during debugging
ASSOCIATE(should_work=>char_var_dim(1:2))
should_work = ["test SUCCESFUL", "test_SUCCESFUL", "test.SUCCESFUL"]
write (buffer, *) should_work(:)(5:14)
END ASSOCIATE
if (trim (buffer) .ne. " SUCCESFUL_SUCCESFUL") call abort
end program
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