diff options
author | Harald Anlauf <anlauf@gmx.de> | 2025-03-13 18:46:54 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2025-03-13 18:46:54 +0100 |
commit | a5d56278d145d439092adf6f65c865c85623f881 (patch) | |
tree | 4cfa5c0c40cde5af49d211ea8a624bbcf0be38a5 | |
parent | 20828a812822f3009c3fe8a15d3db9160819b7de (diff) | |
download | gcc-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.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/bounds_check_26.f90 | 4 |
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" } } |