From cd6f0c9f3b82185500134ac1a1f88ad7af910671 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Thu, 29 Sep 2016 00:18:44 +0000 Subject: [PATCH] backport: re PR fortran/71730 (ICE when character length specification uses an undefined variable) 2016-09-28 Steven G. Kargl backport from trunk PR fortran/71730 * gfortran.dg/pr71730.f90: New test. * gfortran.dg/bounds_check_strlen_2.f90: Fix invalid code. * gfortran.dg/array_constructor_27.f03: Update dg-error message. * gfortran.dg/array_constructor_26.f03: Ditto. PR fortran/77612 * gfortran.dg/pr77612.f90: New test. 2016-09-28 Steven G. Kargl backport from trunk PR fortran/71730 * decl.c (char_len_param_value): Check return value of gfc_reduce_init_expr(). PR fortran/77612 * decl.c (char_len_param_value): Check parent namespace for seen_implicit_none. From-SVN: r240608 --- gcc/fortran/ChangeLog | 11 +++++++++++ gcc/fortran/decl.c | 12 +++++++++++- gcc/testsuite/ChangeLog | 12 ++++++++++++ gcc/testsuite/gfortran.dg/array_constructor_26.f03 | 3 +-- gcc/testsuite/gfortran.dg/array_constructor_27.f03 | 3 +-- gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90 | 2 +- gcc/testsuite/gfortran.dg/pr71730.f90 | 5 +++++ gcc/testsuite/gfortran.dg/pr77612.f90 | 13 +++++++++++++ 8 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr71730.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr77612.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 03603d5ed4fd..6df115ead6ce 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2016-09-28 Steven G. Kargl + + backport from trunk + PR fortran/71730 + * decl.c (char_len_param_value): Check return value of + gfc_reduce_init_expr(). + + PR fortran/77612 + * decl.c (char_len_param_value): Check parent namespace for + seen_implicit_none. + 2016-09-28 Steven G. Kargl backport from trunk diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d4704d32dfdf..d6327189f10c 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -759,6 +759,7 @@ char_len_param_value (gfc_expr **expr, bool *deferred) goto syntax; else if ((*expr)->expr_type == EXPR_VARIABLE) { + bool t; gfc_expr *e; e = gfc_copy_expr (*expr); @@ -770,7 +771,16 @@ char_len_param_value (gfc_expr **expr, bool *deferred) && e->ref->u.ar.dimen_type[0] == DIMEN_RANGE) goto syntax; - gfc_reduce_init_expr (e); + t = gfc_reduce_init_expr (e); + + if (!t && e->ts.type == BT_UNKNOWN + && e->symtree->n.sym->attr.untyped == 1 + && (e->symtree->n.sym->ns->seen_implicit_none == 1 + || e->symtree->n.sym->ns->parent->seen_implicit_none == 1)) + { + gfc_free_expr (e); + goto syntax; + } if ((e->ref && e->ref->type == REF_ARRAY && e->ref->u.ar.type != AR_ELEMENT) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ea7198a0ad4c..9ffbfff73da4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2016-09-28 Steven G. Kargl + + backport from trunk + PR fortran/71730 + * gfortran.dg/pr71730.f90: New test. + * gfortran.dg/bounds_check_strlen_2.f90: Fix invalid code. + * gfortran.dg/array_constructor_27.f03: Update dg-error message. + * gfortran.dg/array_constructor_26.f03: Ditto. + + PR fortran/77612 + * gfortran.dg/pr77612.f90: New test. + 2016-09-28 Steven G. Kargl backport from trunk diff --git a/gcc/testsuite/gfortran.dg/array_constructor_26.f03 b/gcc/testsuite/gfortran.dg/array_constructor_26.f03 index 9993099af917..bb40d09d090c 100644 --- a/gcc/testsuite/gfortran.dg/array_constructor_26.f03 +++ b/gcc/testsuite/gfortran.dg/array_constructor_26.f03 @@ -10,7 +10,6 @@ MODULE WinData INTEGER (1), PARAMETER :: MAXFLD = 25_1, MAXHED = 5_1, MAXCHR = 80_1 integer :: i TYPE TWindowData - CHARACTER (MAX_FLD_HED, 1) :: DWFdHd(MAXFLD) = [(" ", i = 1, MAXFLD)] - ! { dg-error "specification expression" "" { target *-*-* } 13 } + CHARACTER (MAX_FLD_HED, 1) :: DWFdHd(MAXFLD) = [(" ", i = 1, MAXFLD)] ! { dg-error "Scalar INTEGER expression" } END TYPE TWindowData END MODULE WinData diff --git a/gcc/testsuite/gfortran.dg/array_constructor_27.f03 b/gcc/testsuite/gfortran.dg/array_constructor_27.f03 index 21adac82ad45..de0217a75002 100644 --- a/gcc/testsuite/gfortran.dg/array_constructor_27.f03 +++ b/gcc/testsuite/gfortran.dg/array_constructor_27.f03 @@ -8,8 +8,7 @@ implicit none type t - character (a) :: arr (1) = [ "a" ] - ! { dg-error "specification expression" "" { target *-*-* } 11 } + character (a) :: arr (1) = [ "a" ] ! { dg-error "Scalar INTEGER expression" } end type t end diff --git a/gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90 b/gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90 index 241db66239cd..73c2ea8282ea 100644 --- a/gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90 +++ b/gcc/testsuite/gfortran.dg/bounds_check_strlen_2.f90 @@ -11,8 +11,8 @@ CONTAINS SUBROUTINE test (str, n) IMPLICIT NONE - CHARACTER(len=n) :: str INTEGER :: n + CHARACTER(len=n) :: str END SUBROUTINE test SUBROUTINE test2 (str) diff --git a/gcc/testsuite/gfortran.dg/pr71730.f90 b/gcc/testsuite/gfortran.dg/pr71730.f90 new file mode 100644 index 000000000000..f0d48c43e6f6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr71730.f90 @@ -0,0 +1,5 @@ +! { dg-do compile } +subroutine foo + implicit none + character(len=bar) :: a ! { dg-error "Scalar INTEGER expression" } +end subroutine foo diff --git a/gcc/testsuite/gfortran.dg/pr77612.f90 b/gcc/testsuite/gfortran.dg/pr77612.f90 new file mode 100644 index 000000000000..7bc5a492c789 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr77612.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } + +program bad_len + + implicit none + +contains + + subroutine sub + character(len = ICE) :: line ! { dg-error "INTEGER expression expected" } + end subroutine + +end program -- 2.47.2