aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2007-05-06 04:10:53 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2007-05-06 04:10:53 +0000
commit16f8ffc831e99cf28ed7fe2aa9f96ef8dda30678 (patch)
tree9bf07d951e73fd47e03d74eb9003a09385971baa
parenta758fa89b5177aa2f986245c0b926f7c9376ab5a (diff)
downloadgcc-16f8ffc831e99cf28ed7fe2aa9f96ef8dda30678.zip
gcc-16f8ffc831e99cf28ed7fe2aa9f96ef8dda30678.tar.gz
gcc-16f8ffc831e99cf28ed7fe2aa9f96ef8dda30678.tar.bz2
re PR fortran/31251 (Non-integer character length leads to segfault)
2007-05-05 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/31251 * decl.c (match_char_spec): Add check for invalid character lengths. 2007-05-05 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/31251 * gfortran.dg/char_type_len_2.f90: New test. From-SVN: r124469
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/decl.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/char_type_len_2.f908
4 files changed, 28 insertions, 1 deletions
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 <jvdelisle@gcc.gnu.org>
+
+ PR fortran/31251
+ * decl.c (match_char_spec): Add check for invalid character lengths.
+
2007-05-04 Brooks Moses <brooks.moses@codesourcery.com>
* 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 <jvdelisle@gcc.gnu.org>
+
+ PR fortran/31251
+ * gfortran.dg/char_type_len_2.f90: New test.
+
2007-05-05 Geoffrey Keating <geoffk@apple.com>
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 <jvdelisle@gcc.gnu.org>
+ 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