aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-07 20:04:43 +0000
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-07 20:04:43 +0000
commite2198b857de1e81bc8a1095ef7a962e196cdad36 (patch)
treed3d0d5880537429e6afae3fba5cc066553504f63
parent61ff1ae33c32e7943007584b0bfd969b42bff2e8 (diff)
2015-11-07 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/68151 * match.c (match_case_selector): Check for invalid type. 2015-11-07 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/68151 * gfortran.dg/pr68151.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229938 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/match.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr68151.f9013
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index acbb1b75f06..15583d9848b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-07 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/68151
+ * match.c (match_case_selector): Check for invalid type.
+
2015-11-06 David Malcolm <dmalcolm@redhat.com>
* cpp.c (cb_cpp_error): Convert parameter from location_t to
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 7abb5dee4a9..2844262e0f2 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -5018,7 +5018,9 @@ gfc_free_case_list (gfc_case *p)
}
-/* Match a single case selector. */
+/* Match a single case selector. Combining the requirements of F08:C830
+ and F08:C832 (R838) means that the case-value must have either CHARACTER,
+ INTEGER, or LOGICAL type. */
static match
match_case_selector (gfc_case **cp)
@@ -5036,6 +5038,14 @@ match_case_selector (gfc_case **cp)
goto need_expr;
if (m == MATCH_ERROR)
goto cleanup;
+
+ if (c->high->ts.type != BT_LOGICAL && c->high->ts.type != BT_INTEGER
+ && c->high->ts.type != BT_CHARACTER)
+ {
+ gfc_error ("Expression in CASE selector at %L cannot be %s",
+ &c->high->where, gfc_typename (&c->high->ts));
+ goto cleanup;
+ }
}
else
{
@@ -5045,6 +5055,14 @@ match_case_selector (gfc_case **cp)
if (m == MATCH_NO)
goto need_expr;
+ if (c->low->ts.type != BT_LOGICAL && c->low->ts.type != BT_INTEGER
+ && c->low->ts.type != BT_CHARACTER)
+ {
+ gfc_error ("Expression in CASE selector at %L cannot be %s",
+ &c->low->where, gfc_typename (&c->low->ts));
+ goto cleanup;
+ }
+
/* If we're not looking at a ':' now, make a range out of a single
target. Else get the upper bound for the case range. */
if (gfc_match_char (':') != MATCH_YES)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 18871bfae3e..c9df4b08166 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-07 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/68151
+ * gfortran.dg/pr68151.f90: New test.
+
2015-11-07 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/68235
diff --git a/gcc/testsuite/gfortran.dg/pr68151.f90 b/gcc/testsuite/gfortran.dg/pr68151.f90
new file mode 100644
index 00000000000..830d9f4f437
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr68151.f90
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! PR fortran/68151
+! Original code contribute by Gerhard Steinmetz
+! <gerhard dot steinmetz dot fortran at t-online dot de>
+!
+program p
+ integer :: k = 1
+ select case (k)
+ case (:huge(1._4)) ! { dg-error "Expression in CASE" }
+ case (:huge(2._8)) ! { dg-error "Expression in CASE" }
+ case ((1.0,2.0)) ! { dg-error "Expression in CASE" }
+ end select
+end