diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2025-03-07 18:33:29 -0800 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2025-03-07 18:33:29 -0800 |
commit | 3014f8787196d7c0d15d24195c8f07167968ff55 (patch) | |
tree | 0551cc67ebd3c768d5110234f7aa9c89e6afca32 /gcc | |
parent | e8c2f3a427a96a8626f005d4b38492b5d0a96c03 (diff) | |
download | gcc-3014f8787196d7c0d15d24195c8f07167968ff55.zip gcc-3014f8787196d7c0d15d24195c8f07167968ff55.tar.gz gcc-3014f8787196d7c0d15d24195c8f07167968ff55.tar.bz2 |
Fortran: Fix ICE in resolve.cc with -pedantic
Fixes an ICE in gfc_resolve_code when passing an
optional array to an elemental procedure with `-pedantic` enabled.
PR95446 added the original check, this patch fixes the case where the
other actual argument is an array literal (or something else other
than a variable).
PR fortran/119054
gcc/fortran/ChangeLog:
* resolve.cc (resolve_elemental_actual): When checking other
actual arguments to elemental procedures, don't check
attributes of literals and function calls.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr95446.f90: Expand test case to literals and
function calls.
Signed-off-by: Peter Hill <peter.hill@york.ac.uk>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/resolve.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95446.f90 | 14 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 0773d05..eda31ba 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -2429,7 +2429,9 @@ resolve_elemental_actual (gfc_expr *expr, gfc_code *c) for (a = arg0; a; a = a->next) if (a != arg && a->expr->rank == arg->expr->rank - && !a->expr->symtree->n.sym->attr.optional) + && (a->expr->expr_type != EXPR_VARIABLE + || (a->expr->expr_type == EXPR_VARIABLE + && !a->expr->symtree->n.sym->attr.optional))) { t = true; break; diff --git a/gcc/testsuite/gfortran.dg/pr95446.f90 b/gcc/testsuite/gfortran.dg/pr95446.f90 index 86e1019..0787658 100644 --- a/gcc/testsuite/gfortran.dg/pr95446.f90 +++ b/gcc/testsuite/gfortran.dg/pr95446.f90 @@ -22,6 +22,20 @@ program elemental_optional end function outer + function outer_literal(o) result(l) + integer, intent(in), optional :: o(5) + integer :: l(5) + + l = inner(o, [1,2,3,4,5]) + end function outer_literal + + function outer_func(o) result(l) + integer, intent(in), optional :: o(5) + integer :: l(5) + + l = inner(o, outer()) + end function outer_func + elemental function inner(a,b) result(x) integer, intent(in), optional :: a integer, intent(in) :: b |