Hi Paul,

On 23.02.21 12:52, Paul Richard Thomas via Gcc-patches wrote:
This is a straightforward fix that had the side-effect of uncovering an
invalid testcase, class_assign_4.f90. I had worked up a new test, based on
the one in the PR, and found that another brand determined that it is
invalid according to F2018, C15100.

Namely: "C15100  All dummy arguments of an elemental procedure ... shall
not have the POINTER or ALLOCATABLE attribute."

The operator does not have to be elemental – as the fixed test case show.

→ Can you add also a testcase that which triggers the error message you
see in the unpatched  class_assign_4.f90?
I was unable to find a way to use a typebound operator with a polymorphic
result

I am confused – the attach testcase does seem to work fine with current
GCC. (And if we don't have such a testcase, it should be added.)

Can you elaborate?

and so resorted to correcting class_assign_4.f90 with an operator
interface. This respects the purpose of the test. I have left the commented
out lines in place for the review; these will be removed when committing.

Regtested on FC33/x86_64. OK for 9- to 11-branches?

The patch itself LGTM, except for testing the newly shown error message
and for the confusion about the type-bound operator.

Thanks,

Tobias

Fortran: Fix for class functions as associated target [PR99124].

2021-02-23  Paul Thomas  <pa...@gcc.gnu.org>

gcc/fortran
PR fortran/99124
* resolve.c (resolve_fl_procedure): Include class results in
the test for F2018, C15100.
* trans-array.c (get_class_info_from_ss): Do not use the saved
descriptor to obtain the class expression for variables. Use
gfc_get_class_from_expr instead.

gcc/testsuite/
PR fortran/99124
* gfortran.dg/class_defined_operator_2.f03 : New test.
* class_assign_4.f90: Correct the non-conforming elemental
function with an allocatable result with an operator interface
with array dummies and result.
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank 
Thürauf
module m
type t1
   integer :: i
contains
    PROCEDURE :: add_t1
    GENERIC :: OPERATOR(+) => add_t1
end type

type, extends(t1):: t2
  integer j
end type
contains
  function add_t1 (a, b) result (c)
    class(t1), intent(in) :: a, b
    class(t1), allocatable :: c
    allocate (c, mold = a)
    c%i = a%i + b%i
    select type(c)
     class is (t2)
      select type(a)
       class is (t2)
        select type(b)
          class is (t2)
            c%j = a%j + b%j
          class default
            c%j = a%j
        end select
      end select
    end select
  end
end module m

use m
type(t1) :: v1, v1a
type(t2) :: v2, v2a
class(t1), allocatable :: c1, c2

v1 = t1(42)
v1a = t1(43)
v2 = t2(11,22)
v2a = t2(55,66)

c1 = v1 + v1a
select type (c1); class is (t1); if (c1%i /= 42 + 43) stop 1; class default; stop 2; end select
c1 = v1; c2 = v1a
c1 = c1 + c2
select type (c1); class is (t1); if (c1%i /= 42 + 43) stop 3; class default; stop 4; end select

c1 = v1 + v2
select type (c1); class is (t1); if (c1%i /= 42 + 11) stop 5; class default; stop 6; end select
c1 = v1; c2 = v2
c1 = c1 + c2
select type (c1); class is (t1); if (c1%i /= 42 + 11) stop 7; class default; stop 8; end select

c1 = v2 + v1
select type (c1); class is (t2); if (c1%i /= 11 + 42.or.c1%j /= 22) stop 9; class default; stop 10; end select
c1 = v2; c2 = v1
c1 = c1 + c2
select type (c1); class is (t2); if (c1%i /= 11 + 42.or.c1%j /= 22) stop 11; class default; stop 12; end select
end 

Reply via email to