aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2025-03-13 18:46:54 +0100
committerHarald Anlauf <anlauf@gmx.de>2025-03-13 18:46:54 +0100
commita5d56278d145d439092adf6f65c865c85623f881 (patch)
tree4cfa5c0c40cde5af49d211ea8a624bbcf0be38a5
parent20828a812822f3009c3fe8a15d3db9160819b7de (diff)
downloadgcc-a5d56278d145d439092adf6f65c865c85623f881.zip
gcc-a5d56278d145d439092adf6f65c865c85623f881.tar.gz
gcc-a5d56278d145d439092adf6f65c865c85623f881.tar.bz2
Fortran: improve checking of substring bounds [PR119118]
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.
-rw-r--r--gcc/fortran/dependency.cc6
-rw-r--r--gcc/testsuite/gfortran.dg/bounds_check_26.f904
2 files changed, 7 insertions, 3 deletions
diff --git a/gcc/fortran/dependency.cc b/gcc/fortran/dependency.cc
index 28b872f..57c0c49 100644
--- a/gcc/fortran/dependency.cc
+++ b/gcc/fortran/dependency.cc
@@ -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:
diff --git a/gcc/testsuite/gfortran.dg/bounds_check_26.f90 b/gcc/testsuite/gfortran.dg/bounds_check_26.f90
index 69ac9fb..ddfcbd0 100644
--- a/gcc/testsuite/gfortran.dg/bounds_check_26.f90
+++ b/gcc/testsuite/gfortran.dg/bounds_check_26.f90
@@ -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" } }