aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/match.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/class_is_1.f9015
-rw-r--r--gcc/testsuite/gfortran.dg/type_is_1.f9015
5 files changed, 50 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7d3e31e..cf42e38 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-08 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/66245
+ * match.c (gfc_match_type_is, gfc_match_class_is): Check if the
+ return type spec or derived type spec is validate.
+
2015-06-06 Thomas Koenig <tkoenig@netcologne.de>
PR fortran/47659
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index b51d18a..c064135 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -5456,7 +5456,10 @@ gfc_match_type_is (void)
c = gfc_get_case ();
c->where = gfc_current_locus;
- if (gfc_match_type_spec (&c->ts) == MATCH_ERROR)
+ m = gfc_match_type_spec (&c->ts);
+ if (m == MATCH_NO)
+ goto syntax;
+ if (m == MATCH_ERROR)
goto cleanup;
if (gfc_match_char (')') != MATCH_YES)
@@ -5536,7 +5539,10 @@ gfc_match_class_is (void)
c = gfc_get_case ();
c->where = gfc_current_locus;
- if (match_derived_type_spec (&c->ts) == MATCH_ERROR)
+ m = match_derived_type_spec (&c->ts);
+ if (m == MATCH_NO)
+ goto syntax;
+ if (m == MATCH_ERROR)
goto cleanup;
if (c->ts.type == BT_DERIVED)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 202551f..ffef82e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-08 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/66245
+ * gfortran.dg/class_is_1.f90: New test.
+ * gfortran.dg/type_is_1.f90: Ditto.
+
2015-06-08 Marek Polacek <polacek@redhat.com>
PR c/66415
diff --git a/gcc/testsuite/gfortran.dg/class_is_1.f90 b/gcc/testsuite/gfortran.dg/class_is_1.f90
new file mode 100644
index 0000000..b5bc5a9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/class_is_1.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! PR fortran/66245
+! Original testcase by Gerhard Steinmetz
+! <gerhard dot steinmetz dot fortran at t-online dot de>
+program p
+ type t; end type
+ class(t), allocatable :: x
+ call s
+ contains
+ subroutine s
+ select type ( x )
+ class is ( ) ! { dg-error "error in CLASS IS" }
+ end select
+ end subroutine s
+end program p
diff --git a/gcc/testsuite/gfortran.dg/type_is_1.f90 b/gcc/testsuite/gfortran.dg/type_is_1.f90
new file mode 100644
index 0000000..860a668
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/type_is_1.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! PR fortran/66245
+! Original testcase by Gerhard Steinmetz
+! <gerhard dot steinmetz dot fortran at t-online dot de>
+program p
+ type t; end type
+ class(t), allocatable :: x
+ call s
+ contains
+ subroutine s
+ select type ( x )
+ type is ( ) ! { dg-error "error in TYPE IS" }
+ end select
+ end subroutine s
+end program p