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
This commit is contained in:
Steven G. Kargl 2018-03-08 00:42:41 +00:00
parent 4b7b455cf9
commit 00df7c36f5
5 changed files with 59 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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>
PR fortran/84697

View File

@ -3147,7 +3147,24 @@ done:
if (seen_length == 0)
cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
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->kind = kind == 0 ? gfc_default_character_kind : kind;

View File

@ -1,3 +1,10 @@
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>
PR target/82411

View File

@ -0,0 +1,5 @@
! { dg-do compile }
! PR fortran/64124.f90
character(len=kind(1)) x
integer(len(x)) y
end

View File

@ -0,0 +1,23 @@
! { 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