[gcc r16-6726] Fortran: Add additional checks for constant expressions.
Jerry DeLisle
jvdelisle@gcc.gnu.org
Mon Jan 12 22:06:20 GMT 2026
https://gcc.gnu.org/g:4cf4b2cd2a2692e97321fb8c5782d8cc5e9fa65d
commit r16-6726-g4cf4b2cd2a2692e97321fb8c5782d8cc5e9fa65d
Author: Steven G. Kargl <kargl@gcc.gnu.org>
Date: Mon Jan 12 13:58:39 2026 -0800
Fortran: Add additional checks for constant expressions.
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.
Diff:
---
gcc/fortran/resolve.cc | 21 +++++++++++++++++++++
gcc/testsuite/gfortran.dg/pr69962.f90 | 1 +
gcc/testsuite/gfortran.dg/pr91960_1.f90 | 6 ++++++
gcc/testsuite/gfortran.dg/pr91960_2.f90 | 8 ++++++++
4 files changed, 36 insertions(+)
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 2e8ce074c246..be72132c79dc 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -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;
}
diff --git a/gcc/testsuite/gfortran.dg/pr69962.f90 b/gcc/testsuite/gfortran.dg/pr69962.f90
index 2684398ee311..30aaedfdf980 100644
--- a/gcc/testsuite/gfortran.dg/pr69962.f90
+++ b/gcc/testsuite/gfortran.dg/pr69962.f90
@@ -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
index 000000000000..90abcaf6934e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91960_1.f90
@@ -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
index 000000000000..a7d41d9c4170
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91960_2.f90
@@ -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
More information about the Gcc-cvs
mailing list