]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: improve checking of substring bounds [PR119118]
authorHarald Anlauf <anlauf@gmx.de>
Thu, 13 Mar 2025 17:46:54 +0000 (18:46 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 13 Mar 2025 17:46:54 +0000 (18:46 +0100)
Commit r15-7873 copy-pasted erroneous code containing a non-terminating
loop that did not progress its control variable, and a switch statement
with an unhandled case leading to a gcc_unreachable () with suitable input.

PR fortran/119118

gcc/fortran/ChangeLog:

* dependency.cc (contains_forall_index_p): Let loop over elements
of a constructor update its control variable.  Handle REF_INQUIRY
in switch statement.
(gfc_contains_implied_index_p): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/bounds_check_26.f90: Update test.

gcc/fortran/dependency.cc
gcc/testsuite/gfortran.dg/bounds_check_26.f90

index 28b872f66382b445d56526bb7d06ff6189a0246a..57c0c49391bd274e22f0b4bd7bb49f5761449e02 100644 (file)
@@ -1853,7 +1853,7 @@ contains_forall_index_p (gfc_expr *expr)
     case EXPR_STRUCTURE:
     case EXPR_ARRAY:
       for (c = gfc_constructor_first (expr->value.constructor);
-          c; gfc_constructor_next (c))
+          c; c = gfc_constructor_next (c))
        if (contains_forall_index_p (c->expr))
          return true;
       break;
@@ -1874,6 +1874,7 @@ contains_forall_index_p (gfc_expr *expr)
        break;
 
       case REF_COMPONENT:
+      case REF_INQUIRY:
        break;
 
       case REF_SUBSTRING:
@@ -1933,7 +1934,7 @@ gfc_contains_implied_index_p (gfc_expr *expr)
     case EXPR_STRUCTURE:
     case EXPR_ARRAY:
       for (c = gfc_constructor_first (expr->value.constructor);
-          c; gfc_constructor_next (c))
+          c; c = gfc_constructor_next (c))
        if (gfc_contains_implied_index_p (c->expr))
          return true;
       break;
@@ -1954,6 +1955,7 @@ gfc_contains_implied_index_p (gfc_expr *expr)
        break;
 
       case REF_COMPONENT:
+      case REF_INQUIRY:
        break;
 
       case REF_SUBSTRING:
index 69ac9fbe2f22d15c136c771fc6b9f312be4d2f8a..ddfcbd07f3c0d9a3559831b272b7643f7c16d465 100644 (file)
@@ -19,6 +19,8 @@ program main
   print *,      str(-n:11)  ! 2 checked bounds
   print *, len (str(-n:11)) ! 2 checked bounds
 
+  print *,      str(-n*n%kind:sum(n-[0,n%kind])) ! 2 checked bounds
+
 end program main
 
-! { dg-final { scan-tree-dump-times "Substring out of bounds:" 10 "original" } }
+! { dg-final { scan-tree-dump-times "Substring out of bounds:" 12 "original" } }