]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Add additional checks for constant expressions.
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 12 Jan 2026 21:58:39 +0000 (13:58 -0800)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Mon, 12 Jan 2026 22:06:04 +0000 (14:06 -0800)
PR fortran/91960

gcc/fortran/ChangeLog:

* resolve.cc (resolve_fl_parameter): Check the righthand symbol
is a constant expression.

gcc/testsuite/ChangeLog:

* gfortran.dg/pr69962.f90: Adjust testcase to ignore new error message.
* gfortran.dg/pr91960_1.f90: New test.
* gfortran.dg/pr91960_2.f90: New test.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/pr69962.f90
gcc/testsuite/gfortran.dg/pr91960_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr91960_2.f90 [new file with mode: 0644]

index 2e8ce074c2463e37b0de7796958cccdcb25248ef..be72132c79dc48d092d52a71143ffeedde02c15d 100644 (file)
@@ -17871,6 +17871,27 @@ resolve_fl_parameter (gfc_symbol *sym)
       return false;
     }
 
+  /* Some programmers can have a typo when using an implied-do loop to
+     initialize an array constant.  For example,
+       INTEGER I,J
+       INTEGER, PARAMETER :: A(3) = [(I, I = 1, 3)]     ! OK
+       INTEGER, PARAMETER :: B(3) = [(A(J), I = 1, 3)]  ! Not OK, J undefined
+     This check catches the typo.  */
+  if (sym->attr.dimension
+      && sym->value && sym->value->expr_type == EXPR_ARRAY
+      && !gfc_is_constant_expr (sym->value))
+    {
+      /* PR fortran/117070 argues a nonconstant proc pointer can appear in
+        the array constructor of a paramater.  This seems inconsistant with
+        the concept of a parameter. TODO: Needs an interpretation.  */
+      if (sym->value->ts.type == BT_DERIVED
+         && sym->value->ts.u.derived
+         && sym->value->ts.u.derived->attr.proc_pointer_comp)
+       return true;
+      gfc_error ("Expecting constant expression near %L", &sym->value->where);
+      return false;
+    }
+
   return true;
 }
 
index 2684398ee311aaf8537ea280938bbeb958275a31..30aaedfdf980dd0130b97e5e10914b7ac9bfe892 100644 (file)
@@ -4,3 +4,4 @@ program p
    character(3), parameter :: x(2) = ['abc', 'xyz']
    character(2), parameter :: y(2) = [x(2)(2:3), x(n)(1:2)] ! { dg-error "CHARACTER length must be a constant" }
 end
+! { dg-prune-output "Expecting constant expression" }
diff --git a/gcc/testsuite/gfortran.dg/pr91960_1.f90 b/gcc/testsuite/gfortran.dg/pr91960_1.f90
new file mode 100644 (file)
index 0000000..90abcaf
--- /dev/null
@@ -0,0 +1,6 @@
+! { dg-do compile }
+module m
+   integer :: i, j
+   integer, parameter :: a(3) = [1, 2, 3]
+   integer, parameter :: b(3) = [(a(j), i=1,3)] ! { dg-error "Expecting constant expression" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pr91960_2.f90 b/gcc/testsuite/gfortran.dg/pr91960_2.f90
new file mode 100644 (file)
index 0000000..a7d41d9
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile }
+module m
+  implicit none
+  integer :: i, j
+  integer, parameter :: a(3) = [1, 2, 3]
+  integer, parameter :: c    = a(j)
+  integer            :: d    = c       ! { dg-error "initialization expression at" }
+end