Hello,

Low-hanging fruit, almost embarassing to fix. But then again I caused
this bug -- in 1999 or so :-)

Will commit after testing.

Ciao!
Steven


fortran/
        * resolve.c (resolve_select): Fix list traversal in case the
        last element of the CASE list was dropped as unreachable code.

testsuite/
        * gfortran.dg/pr62135.f90: New test.

Index: fortran/resolve.c
===================================================================
--- fortran/resolve.c   (revision 214292)
+++ fortran/resolve.c   (working copy)
@@ -7761,7 +7761,7 @@ resolve_select (gfc_code *code, bool select_type)
        /* Strip all other unreachable cases.  */
        if (body->ext.block.case_list)
          {
-           for (cp = body->ext.block.case_list; cp->next; cp = cp->next)
+           for (cp = body->ext.block.case_list; cp && cp->next; cp = cp->next)
              {
                if (cp->next->unreachable)
                  {
Index: testsuite/gfortran.dg/pr62135.f90
===================================================================
--- testsuite/gfortran.dg/pr62135.f90   (revision 0)
+++ testsuite/gfortran.dg/pr62135.f90   (working copy)
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! { dg-options -Wsurprising }
+
+   PROGRAM PR62135
+      IMPLICIT NONE
+      CHARACTER*1 :: choice
+      choice = 'x'
+      SELECT CASE (choice)
+         ! This triggered an ICE: an unreachable case clause
+         ! as the last of a list.
+         CASE ('2':'7','9':'0') ! { dg-warning "can never be matched" }
+            WRITE(*,*) "barf"
+         CASE DEFAULT
+            CONTINUE
+      END SELECT
+   END PROGRAM PR62135
+

Reply via email to