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