On 10.11.20 10:58, Jakub Jelinek via Gcc-patches wrote:

The earlier version of the patch has been successfully bootstrapped
and regtested (only with a few regressions) on x86_64-linux and i686-linux,
this version passed all the new and earlier problematic tests, ok for trunk
if it passes another bootstrap/regtest?

LGTM. Thanks!

Tobias

2020-11-10  Jakub Jelinek  <ja...@redhat.com>

      PR fortran/97768
      * misc.c (gfc_typename): Use ex->value.character.length only if
      ex->expr_type == EXPR_CONSTANT.  If ex->ts.deferred, print : instead
      of length.  If ex->ts.u.cl && ex->ts.u.cl->length == NULL, print
      * instead of length.  Otherwise if character length is non-constant,
      print just CHARACTER or CHARACTER(KIND=N).

      * gfortran.dg/pr97768_1.f90: New test.
      * gfortran.dg/pr97768_2.f90: New test.

--- gcc/fortran/misc.c.jj     2020-11-09 23:01:02.978826528 +0100
+++ gcc/fortran/misc.c        2020-11-10 10:41:22.087850720 +0100
@@ -224,10 +224,32 @@ gfc_typename (gfc_expr *ex)

    if (ex->ts.type == BT_CHARACTER)
      {
-      if (ex->ts.u.cl && ex->ts.u.cl->length)
-     length = gfc_mpz_get_hwi (ex->ts.u.cl->length->value.integer);
-      else
+      if (ex->expr_type == EXPR_CONSTANT)
      length = ex->value.character.length;
+      else if (ex->ts.deferred)
+     {
+       if (ex->ts.kind == gfc_default_character_kind)
+         return "CHARACTER(:)";
+       sprintf (buffer, "CHARACTER(:,%d)", ex->ts.kind);
+       return buffer;
+     }
+      else if (ex->ts.u.cl && ex->ts.u.cl->length == NULL)
+     {
+       if (ex->ts.kind == gfc_default_character_kind)
+         return "CHARACTER(*)";
+       sprintf (buffer, "CHARACTER(*,%d)", ex->ts.kind);
+       return buffer;
+     }
+      else if (ex->ts.u.cl == NULL
+            || ex->ts.u.cl->length->expr_type != EXPR_CONSTANT)
+     {
+       if (ex->ts.kind == gfc_default_character_kind)
+         return "CHARACTER";
+       sprintf (buffer, "CHARACTER(KIND=%d)", ex->ts.kind);
+       return buffer;
+     }
+      else
+     length = gfc_mpz_get_hwi (ex->ts.u.cl->length->value.integer);
        if (ex->ts.kind == gfc_default_character_kind)
      sprintf (buffer, "CHARACTER(" HOST_WIDE_INT_PRINT_DEC ")", length);
        else
--- gcc/testsuite/gfortran.dg/pr97768_1.f90.jj        2020-11-10 
10:22:26.053445061 +0100
+++ gcc/testsuite/gfortran.dg/pr97768_1.f90   2020-11-10 10:22:26.053445061 
+0100
@@ -0,0 +1,25 @@
+! PR fortran/97768
+! { dg-do compile }
+
+module pr97768_1
+  interface operator(.in.)
+    module procedure substr_in_str
+  end interface
+contains
+  pure function to_upper (in_str) result (string)
+    character(len=*), intent(in) :: in_str
+    character(len=len(in_str)) :: string
+    string = in_str
+  end function to_upper
+  logical pure function substr_in_str (substring, string)
+    character(len=*), intent(in) :: string, substring
+    substr_in_str=.false.
+  end function
+end module
+function foo ()
+  use pr97768_1, only : to_upper, operator(.in.)
+  logical :: foo
+  character(len=8) :: str
+  str = 'abcde'
+  foo = 'b' .in. to_upper (str)
+end function foo
--- gcc/testsuite/gfortran.dg/pr97768_2.f90.jj        2020-11-10 
10:22:26.053445061 +0100
+++ gcc/testsuite/gfortran.dg/pr97768_2.f90   2020-11-10 10:46:15.104602757 
+0100
@@ -0,0 +1,53 @@
+! PR fortran/97768
+! { dg-do compile }
+
+module pr97768_2
+  interface operator(.in.)
+    module procedure substr_in_str
+  end interface
+contains
+  pure function to_upper (in_str) result (string)
+    character(len=*), intent(in) :: in_str
+    character(len=len(in_str)) :: string
+    string = in_str
+  end function to_upper
+  logical pure function substr_in_str (substring, string)
+    character(len=*), intent(in) :: string, substring
+    substr_in_str=.false.
+  end function
+end module
+function foo ()
+  use pr97768_2, only : to_upper, operator(.in.)
+  logical :: foo
+  character(len=8) :: str
+  str = 'abcde'
+  foo = to_upper (str) .in. 32    ! { dg-error "are CHARACTER/INTEGER" }
+end function foo
+function bar (str)
+  use pr97768_2, only : operator(.in.)
+  logical :: bar
+  character(len=*) :: str
+  foo = str .in. 32               ! { dg-error "are 
CHARACTER\\(\\*\\)/INTEGER" }
+end function bar
+function baz (lenstr)
+  use pr97768_2, only : operator(.in.)
+  logical :: baz
+  integer :: lenstr
+  character(len=lenstr) :: str
+  str = 'abc'
+  foo = str .in. 32               ! { dg-error "are CHARACTER/INTEGER" }
+end function baz
+function qux ()
+  use pr97768_2, only : operator(.in.)
+  logical :: qux
+  character(len=8) :: str
+  str = 'def'
+  foo = str .in. 32               ! { dg-error "are CHARACTER\\(8\\)/INTEGER" }
+end function qux
+function corge ()
+  use pr97768_2, only : operator(.in.)
+  logical :: corge
+  character(len=:), allocatable :: str
+  str = 'ghijk'
+  foo = str .in. 32               ! { dg-error "are CHARACTER\\(:\\)/INTEGER" }
+end function corge

      Jakub

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander 
Walter

Reply via email to