! RUN: %python %S/test_errors.py %s %flang_fc1 ! Test various conditions in C1158. implicit none type :: t1 integer :: i end type type, extends(t1) :: t2 end type type(t1),target :: x1 type(t2),target :: x2 class(*), pointer :: ptr class(t1), pointer :: p_or_c !vector subscript related class(t1),DIMENSION(:,:),allocatable::array1 class(t2),DIMENSION(:,:),allocatable::array2 integer, dimension(2) :: V V = (/ 1,2 /) allocate(array1(3,3)) allocate(array2(3,3)) ! A) associate with function, i.e (other than variables) select type ( y => fun(1) ) type is (t1) print *, rank(y%i) end select select type ( y => fun(1) ) type is (t1) y%i = 1 !VDC type is (t2) call sub_with_in_and_inout_param(y,y) !VDC end select select type ( y => (fun(1)) ) type is (t1) !ERROR: Left-hand side of assignment is not definable !BECAUSE: 'y' is construct associated with an expression y%i = 1 !VDC type is (t2) !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'z=' is not definable !BECAUSE: 'y' is construct associated with an expression call sub_with_in_and_inout_param(y,y) !VDC end select ! B) associated with a variable: p_or_c => x1 select type ( a => p_or_c ) type is (t1) a%i = 10 end select select type ( a => p_or_c ) type is (t1) end select !C)Associate with with vector subscript select type (b => array1(V,2)) type is (t1) !ERROR: Left-hand side of assignment is not definable !BECAUSE: Construct association 'b' has a vector subscript b%i = 1 !VDC type is (t2) !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'z=' is not definable !BECAUSE: Variable 'b' has a vector subscript call sub_with_in_and_inout_param_vector(b,b) !VDC end select select type(b => foo(1) ) type is (t1) !ERROR: Left-hand side of assignment is not definable !BECAUSE: 'b' is construct associated with an expression b%i = 1 !VDC type is (t2) !ERROR: Actual argument associated with INTENT(IN OUT) dummy argument 'z=' is not definable !BECAUSE: 'b' is construct associated with an expression call sub_with_in_and_inout_param_vector(b,b) !VDC end select !D) Have no association and should be ok. !1. points to function ptr => fun(1) select type ( ptr ) type is (t1) ptr%i = 1 end select !2. points to variable ptr=>x1 select type (ptr) type is (t1) ptr%i = 10 end select contains function fun(i) class(t1),pointer :: fun integer :: i if (i>0) then fun => x1 else if (i<0) then fun => x2 else fun => NULL() end if end function function foo(i) integer :: i class(t1),DIMENSION(:),allocatable :: foo integer, dimension(2) :: U U = (/ 1,2 /) if (i>0) then foo = array1(2,U) else if (i<0) then foo = array2(2,U) ! ok: t2 extends t1 end if end function function foo2() class(t2),DIMENSION(:),allocatable :: foo2 !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types CLASS(t2) and CLASS(t1) foo2 = array1(2,:) end function subroutine sub_with_in_and_inout_param(y, z) type(t2), INTENT(IN) :: y class(t2), INTENT(INOUT) :: z z%i = 10 end subroutine subroutine sub_with_in_and_inout_param_vector(y, z) type(t2),DIMENSION(:), INTENT(IN) :: y class(t2),DIMENSION(:), INTENT(INOUT) :: z z%i = 10 end subroutine end