]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix scalarization for intrinsic LEN_TRIM with present KIND argument
authorHarald Anlauf <anlauf@gmx.de>
Tue, 23 Nov 2021 16:51:38 +0000 (17:51 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 23 Nov 2021 16:51:38 +0000 (17:51 +0100)
gcc/fortran/ChangeLog:

PR fortran/87711
PR fortran/87851
* trans-array.c (arg_evaluated_for_scalarization): Add LEN_TRIM to
list of intrinsics for which an optional KIND argument needs to be
removed before scalarization.

gcc/testsuite/ChangeLog:

PR fortran/87711
PR fortran/87851
* gfortran.dg/len_trim.f90: New test.

gcc/fortran/trans-array.c
gcc/testsuite/gfortran.dg/len_trim.f90 [new file with mode: 0644]

index 2090adf01e7cf71fac68e9844392806f1f09d5e8..238b1b7238515a26e8c516ba7a7c8bca36662061 100644 (file)
@@ -11499,6 +11499,7 @@ arg_evaluated_for_scalarization (gfc_intrinsic_sym *function,
       switch (function->id)
        {
          case GFC_ISYM_INDEX:
+         case GFC_ISYM_LEN_TRIM:
            if (strcmp ("kind", gfc_dummy_arg_get_name (*dummy_arg)) == 0)
              return false;
          /* Fallthrough.  */
diff --git a/gcc/testsuite/gfortran.dg/len_trim.f90 b/gcc/testsuite/gfortran.dg/len_trim.f90
new file mode 100644 (file)
index 0000000..2252b81
--- /dev/null
@@ -0,0 +1,27 @@
+! { dg-do compile }
+! { dg-options "-O -Wall -Wconversion-extra -fdump-tree-original" }
+! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } }
+! PR fortran/87711 - ICE in gfc_trans_transfer
+! PR fortran/87851 - return type for len_trim
+
+program main
+  implicit none
+  character(3), parameter :: a(1) = 'aa'
+  character(3)            :: b    = "bb"
+  character(3)            :: c(1) = 'cc'
+  integer(4), parameter   :: l4(1) = len_trim (a, kind=4)
+  integer(8), parameter   :: l8(1) = len_trim (a, kind=8)
+  integer                 :: kk(1) = len_trim (a)
+  integer(4)              :: mm(1) = len_trim (a, kind=4)
+  integer(8)              :: nn(1) = len_trim (a, kind=8)
+  kk = len_trim (a)
+  mm = len_trim (a, kind=4)
+  nn = len_trim (a, kind=8)
+  kk = len_trim ([b])
+  mm = len_trim ([b],kind=4)
+  nn = len_trim ([b],kind=8)
+  kk = len_trim (c)
+  mm = len_trim (c, kind=4)
+  nn = len_trim (c, kind=8)
+  if (any (l4 /= 2_4) .or. any (l8 /= 2_8)) stop 1
+end program main