While looking at some other PR, I found the urgent need for a rather
obvious improvement to compile-time diagnostics:
The KIND argument to intrinsics must be a compile-time constant.

Regtested on x86_64-pc-linux-gnu.

OK for master?

Thanks,
Harald


PR fortran/97408 - Diagnose non-constant KIND argument to intrinsics

The KIND argument to intrinsics must be a compile-time argument.
Improve check so that the proper diagnostics is emitted.

gcc/fortran/ChangeLog:

        * check.c (kind_check): Enhance check for non-constant KIND
        arguments.

gcc/testsuite/ChangeLog:

        * gfortran.dg/kind_2.f90: New test.

diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 1e64fab3401..fa795538a7c 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -646,7 +646,7 @@ kind_check (gfc_expr *k, int n, bt type)
   if (!scalar_check (k, n))
     return false;

-  if (!gfc_check_init_expr (k))
+  if (!gfc_check_init_expr (k) || k->expr_type == EXPR_VARIABLE)
     {
       gfc_error ("%qs argument of %qs intrinsic at %L must be a constant",
 		 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
diff --git a/gcc/testsuite/gfortran.dg/kind_2.f90 b/gcc/testsuite/gfortran.dg/kind_2.f90
new file mode 100644
index 00000000000..f3e5b7503ef
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/kind_2.f90
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! PR97408 - Diagnose non-constant KIND argument to intrinsics
+
+program p
+  implicit none
+  integer :: i
+  integer, parameter :: lk(1) = [ 4 ]
+  print *, (int     (1     , lk(i)), i=1,1) ! { dg-error "must be a constant" }
+  print *, (real    (1     , lk(i)), i=1,1) ! { dg-error "must be a constant" }
+  print *, (cmplx   (1, kind=lk(i)), i=1,1) ! { dg-error "must be a constant" }
+  print *, (logical (.true., lk(i)), i=1,1) ! { dg-error "must be a constant" }
+end

Reply via email to