Commit 00df7c36 by Steven G. Kargl

re PR fortran/64124 ([F95] Valid constant expr rejected)

2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/64124
	PR fortran/70409
	* decl.c (gfc_match_char_spec): Try to reduce a charlen to a constant.

2018-03-07  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/64124
	PR fortran/70409
	* gfortran.dg/pr64124.f90: New tests.
	* gfortran.dg/pr70409.f90: New tests.

From-SVN: r258347
parent 4b7b455c
2018-03-07 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/64124
PR fortran/70409
* decl.c (gfc_match_char_spec): Try to reduce a charlen to a constant.
2017-03-06 Thomas Koenig <tkoenig@gcc.gnu.org> 2017-03-06 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/84697 PR fortran/84697
......
...@@ -3147,7 +3147,24 @@ done: ...@@ -3147,7 +3147,24 @@ done:
if (seen_length == 0) if (seen_length == 0)
cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1); cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
else else
cl->length = len; {
/* If gfortran ends up here, then the len may be reducible to a
constant. Try to do that here. If it does not reduce, simply
assign len to the charlen. */
if (len && len->expr_type != EXPR_CONSTANT)
{
gfc_expr *e;
e = gfc_copy_expr (len);
gfc_reduce_init_expr (e);
if (e->expr_type == EXPR_CONSTANT)
gfc_replace_expr (len, e);
else
gfc_free_expr (e);
cl->length = len;
}
else
cl->length = len;
}
ts->u.cl = cl; ts->u.cl = cl;
ts->kind = kind == 0 ? gfc_default_character_kind : kind; ts->kind = kind == 0 ? gfc_default_character_kind : kind;
......
2018-03-07 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/64124
PR fortran/70409
* gfortran.dg/pr64124.f90: New tests.
* gfortran.dg/pr70409.f90: New tests.
2018-03-07 Segher Boessenkool <segher@kernel.crashing.org> 2018-03-07 Segher Boessenkool <segher@kernel.crashing.org>
PR target/82411 PR target/82411
......
! { dg-do compile }
! PR fortran/64124.f90
character(len=kind(1)) x
integer(len(x)) y
end
! { dg-do run }
! PR fortran/70409
! Contriubted by Harald Anlauf <anlauf at gmx dot de>
program foo
integer, parameter :: huge_1 = huge(0_1)
character( huge_1 ), parameter :: x = 'abc'
character( huge(0_1) ), parameter :: y = 'abc'
character( huge(0_1)+0 ), parameter :: z = 'abcdef'
character( huge(0_1) ) :: a = 'abc'
integer, parameter :: huge_2 = huge(0_2)
character( huge_2 ), parameter :: u = 'abc'
character( huge(0_2) ), parameter :: v = 'abc'
character(int(huge(0_2),4)), parameter :: w = 'abcdef'
character( huge(0_2) ) :: b = 'abc'
if (len(x) /= huge_1) stop 1
if (len(y) /= huge_1) stop 2
if (len(z) /= huge_1) stop 3
if (len(a) /= huge_1) stop 4
if (len(u) /= huge_2) stop 5
if (len(v) /= huge_2) stop 6
if (len(w) /= huge_2) stop 7
if (len(b) /= huge_2) stop 8
end program foo
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