! RUN: %S/test_errors.sh %s %t %f18 ! Pointer assignment constraints 10.2.2.2 module m1 type :: t(k) integer, kind :: k end type type t2 sequence real :: t2Field end type contains ! C852 subroutine s0 !ERROR: 'p1' may not have both the POINTER and TARGET attributes real, pointer :: p1, p3 allocatable :: p2 !ERROR: 'sin' may not have both the POINTER and INTRINSIC attributes real, intrinsic, pointer :: sin target :: p1 !ERROR: 'p2' may not have both the POINTER and ALLOCATABLE attributes pointer :: p2 !ERROR: 'a' may not have the POINTER attribute because it is a coarray real, pointer :: a(:)[*] end ! C1015 subroutine s1 real, target :: r real(8), target :: r8 logical, target :: l real, pointer :: p p => r !ERROR: Target type REAL(8) is not compatible with pointer type REAL(4) p => r8 !ERROR: Target type LOGICAL(4) is not compatible with pointer type REAL(4) p => l end ! C1019 subroutine s2 real, target :: r1(4), r2(4,4) real, pointer :: p(:) p => r1 !ERROR: Pointer has rank 1 but target has rank 2 p => r2 end ! C1015 subroutine s3 type(t(1)), target :: x1 type(t(2)), target :: x2 type(t(1)), pointer :: p p => x1 !ERROR: Target type t(k=2_4) is not compatible with pointer type t(k=1_4) p => x2 end ! C1016 subroutine s4(x) class(*), target :: x type(t(1)), pointer :: p1 type(t2), pointer :: p2 class(*), pointer :: p3 real, pointer :: p4 p2 => x ! OK - not extensible p3 => x ! OK - unlimited polymorphic !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic p1 => x !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic p4 => x end ! C1020 subroutine s5 real, target :: x[*] real, target, volatile :: y[*] real, pointer :: p real, pointer, volatile :: q p => x !ERROR: Pointer must be VOLATILE when target is a VOLATILE coarray p => y !ERROR: Pointer may not be VOLATILE when target is a non-VOLATILE coarray q => x q => y end ! C1021, C1023 subroutine s6 real, target :: x real :: p type :: tp real, pointer :: a real :: b end type type(tp) :: y !ERROR: 'p' is not a pointer p => x y%a => x !ERROR: 'b' is not a pointer y%b => x end !C1025 (R1037) The expr shall be a designator that designates a !variable with either the TARGET or POINTER attribute and is not !an array section with a vector subscript, or it shall be a reference !to a function that returns a data pointer. subroutine s7 real, target :: a real, pointer :: b real, pointer :: c real :: d b => a c => b !ERROR: In assignment to object pointer 'b', the target 'd' is not an object with POINTER or TARGET attributes b => d end ! C1025 subroutine s8 real :: a(10) integer :: b(10) real, pointer :: p(:) !ERROR: An array section with a vector subscript may not be a pointer target p => a(b) end ! C1025 subroutine s9 real, target :: x real, pointer :: p p => f1() !ERROR: pointer 'p' is associated with the result of a reference to function 'f2' that is a not a pointer p => f2() contains function f1() real, pointer :: f1 f1 => x end function f2() real :: f2 f2 = x end end ! C1026 (R1037) A data-target shall not be a coindexed object. subroutine s10 real, target :: a[*] real, pointer :: b !ERROR: A coindexed object may not be a pointer target b => a[1] end end module m2 type :: t1 real :: a end type type :: t2 type(t1) :: b type(t1), pointer :: c real :: d end type end subroutine s2 use m2 real, pointer :: p type(t2), target :: x type(t2) :: y !OK: x has TARGET attribute p => x%b%a !OK: c has POINTER attribute p => y%c%a !ERROR: In assignment to object pointer 'p', the target 'y%b%a' is not an object with POINTER or TARGET attributes p => y%b%a associate(z => x%b) !OK: x has TARGET attribute p => z%a end associate associate(z => y%c) !OK: c has POINTER attribute p => z%a end associate associate(z => y%b) !ERROR: In assignment to object pointer 'p', the target 'z%a' is not an object with POINTER or TARGET attributes p => z%a end associate associate(z => y%b%a) !ERROR: In assignment to object pointer 'p', the target 'z' is not an object with POINTER or TARGET attributes p => z end associate end