https://gcc.gnu.org/g:3014f8787196d7c0d15d24195c8f07167968ff55

commit r15-7903-g3014f8787196d7c0d15d24195c8f07167968ff55
Author: Jerry DeLisle <jvdeli...@gcc.gnu.org>
Date:   Fri Mar 7 18:33:29 2025 -0800

    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.h...@york.ac.uk>

Diff:
---
 gcc/fortran/resolve.cc                |  4 +++-
 gcc/testsuite/gfortran.dg/pr95446.f90 | 14 ++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 0773d05bfc6f..eda31ba8adc3 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 86e1019d7af9..0787658813aa 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

Reply via email to