aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2025-03-07 18:33:29 -0800
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2025-03-07 18:33:29 -0800
commit3014f8787196d7c0d15d24195c8f07167968ff55 (patch)
tree0551cc67ebd3c768d5110234f7aa9c89e6afca32 /gcc
parente8c2f3a427a96a8626f005d4b38492b5d0a96c03 (diff)
downloadgcc-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.cc4
-rw-r--r--gcc/testsuite/gfortran.dg/pr95446.f9014
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