From 16f8ffc831e99cf28ed7fe2aa9f96ef8dda30678 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Sun, 6 May 2007 04:10:53 +0000 Subject: [PATCH] re PR fortran/31251 (Non-integer character length leads to segfault) 2007-05-05 Jerry DeLisle PR fortran/31251 * decl.c (match_char_spec): Add check for invalid character lengths. 2007-05-05 Jerry DeLisle PR fortran/31251 * gfortran.dg/char_type_len_2.f90: New test. From-SVN: r124469 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/decl.c | 11 ++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/char_type_len_2.f90 | 8 ++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/char_type_len_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 71b388f..9435165 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-05-05 Jerry DeLisle + + PR fortran/31251 + * decl.c (match_char_spec): Add check for invalid character lengths. + 2007-05-04 Brooks Moses * intrinsic.texi (CMPLX): Document result kind. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 7665bc8..1dcc53d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1626,14 +1626,23 @@ rparen: syntax: gfc_error ("Syntax error in CHARACTER declaration at %C"); m = MATCH_ERROR; + gfc_free_expr (len); + return m; done: - if (m == MATCH_YES && gfc_validate_kind (BT_CHARACTER, kind, true) < 0) + if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0) { gfc_error ("Kind %d is not a CHARACTER kind at %C", kind); m = MATCH_ERROR; } + if (seen_length == 1 && len != NULL + && len->ts.type != BT_INTEGER && len->ts.type != BT_UNKNOWN) + { + gfc_error ("Expression at %C must be of INTEGER type"); + m = MATCH_ERROR; + } + if (m != MATCH_YES) { gfc_free_expr (len); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 586cc74..2c6bc0a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-05 Jerry DeLisle + + PR fortran/31251 + * gfortran.dg/char_type_len_2.f90: New test. + 2007-05-05 Geoffrey Keating PR 31775 diff --git a/gcc/testsuite/gfortran.dg/char_type_len_2.f90 b/gcc/testsuite/gfortran.dg/char_type_len_2.f90 new file mode 100644 index 0000000..a5cb835 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char_type_len_2.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! PR31251 Non-integer character length leads to segfault +! Submitted by Jerry DeLisle + character(len=2.3) :: s ! { dg-error "must be of INTEGER type" } + character(kind=1,len=4.3) : t ! { dg-error "must be of INTEGER type" } + character(len=,,7.2,kind=1) : u ! { dg-error "Syntax error in CHARACTER declaration" } + character(len=7,kind=2) : v ! ! { dg-error "Kind 2 is not a CHARACTER kind" } + end -- 2.7.4