]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: avoid NULL pointer dereference on invalid range in logical SELECT CASE
authorHarald Anlauf <anlauf@gmx.de>
Tue, 16 Nov 2021 20:06:06 +0000 (21:06 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 16 Nov 2021 20:06:06 +0000 (21:06 +0100)
gcc/fortran/ChangeLog:

PR fortran/103286
* resolve.c (resolve_select): Choose appropriate range limit to
avoid NULL pointer dereference when generating error message.

gcc/testsuite/ChangeLog:

PR fortran/103286
* gfortran.dg/pr103286.f90: New test.

gcc/fortran/resolve.c
gcc/testsuite/gfortran.dg/pr103286.f90 [new file with mode: 0644]

index 705d2326a29492741de6fca4bb8238ebd27f0446..f074a0ab3a1f24053834bbe4dd5604d65dbc0035 100644 (file)
@@ -8846,7 +8846,8 @@ resolve_select (gfc_code *code, bool select_type)
                  || cp->low != cp->high))
            {
              gfc_error ("Logical range in CASE statement at %L is not "
-                        "allowed", &cp->low->where);
+                        "allowed",
+                        cp->low ? &cp->low->where : &cp->high->where);
              t = false;
              break;
            }
diff --git a/gcc/testsuite/gfortran.dg/pr103286.f90 b/gcc/testsuite/gfortran.dg/pr103286.f90
new file mode 100644 (file)
index 0000000..1c18b71
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "std=gnu" }
+! PR fortran/103286 - ICE in resolve_select
+
+program p
+  select case (.true.) ! { dg-warning "Extension: Conversion" }
+  case (1_8)
+  case (:0)            ! { dg-error "Logical range in CASE statement" }
+  case (2:)            ! { dg-error "Logical range in CASE statement" }
+  end select
+end