16c1ac141SIvan Zhechev! RUN: %python %S/test_errors.py %s %flang_fc1 264ab3302SCarolineConcatto! Pointer assignment constraints 10.2.2.2 364ab3302SCarolineConcatto 464ab3302SCarolineConcattomodule m1 564ab3302SCarolineConcatto type :: t(k) 664ab3302SCarolineConcatto integer, kind :: k 764ab3302SCarolineConcatto end type 864ab3302SCarolineConcatto type t2 964ab3302SCarolineConcatto sequence 102b790490SPete Steinfeld real :: t2Field 1164ab3302SCarolineConcatto end type 1264ab3302SCarolineConcattocontains 1364ab3302SCarolineConcatto 1438095549SPete Steinfeld ! C852 1564ab3302SCarolineConcatto subroutine s0 1664ab3302SCarolineConcatto !ERROR: 'p1' may not have both the POINTER and TARGET attributes 1764ab3302SCarolineConcatto real, pointer :: p1, p3 18de6e88efSPeter Klausler !ERROR: 'p2' may not have both the POINTER and ALLOCATABLE attributes 1964ab3302SCarolineConcatto allocatable :: p2 2064ab3302SCarolineConcatto !ERROR: 'sin' may not have both the POINTER and INTRINSIC attributes 2164ab3302SCarolineConcatto real, intrinsic, pointer :: sin 2264ab3302SCarolineConcatto target :: p1 2364ab3302SCarolineConcatto pointer :: p2 2464ab3302SCarolineConcatto !ERROR: 'a' may not have the POINTER attribute because it is a coarray 2564ab3302SCarolineConcatto real, pointer :: a(:)[*] 2664ab3302SCarolineConcatto end 2764ab3302SCarolineConcatto 2864ab3302SCarolineConcatto ! C1015 2964ab3302SCarolineConcatto subroutine s1 3064ab3302SCarolineConcatto real, target :: r 3164ab3302SCarolineConcatto real(8), target :: r8 3264ab3302SCarolineConcatto logical, target :: l 3364ab3302SCarolineConcatto real, pointer :: p 3464ab3302SCarolineConcatto p => r 3564ab3302SCarolineConcatto !ERROR: Target type REAL(8) is not compatible with pointer type REAL(4) 3664ab3302SCarolineConcatto p => r8 3764ab3302SCarolineConcatto !ERROR: Target type LOGICAL(4) is not compatible with pointer type REAL(4) 3864ab3302SCarolineConcatto p => l 3964ab3302SCarolineConcatto end 4064ab3302SCarolineConcatto 4164ab3302SCarolineConcatto ! C1019 4264ab3302SCarolineConcatto subroutine s2 4364ab3302SCarolineConcatto real, target :: r1(4), r2(4,4) 4464ab3302SCarolineConcatto real, pointer :: p(:) 4564ab3302SCarolineConcatto p => r1 4664ab3302SCarolineConcatto !ERROR: Pointer has rank 1 but target has rank 2 4764ab3302SCarolineConcatto p => r2 4864ab3302SCarolineConcatto end 4964ab3302SCarolineConcatto 5064ab3302SCarolineConcatto ! C1015 5164ab3302SCarolineConcatto subroutine s3 5264ab3302SCarolineConcatto type(t(1)), target :: x1 5364ab3302SCarolineConcatto type(t(2)), target :: x2 5464ab3302SCarolineConcatto type(t(1)), pointer :: p 5564ab3302SCarolineConcatto p => x1 5664ab3302SCarolineConcatto !ERROR: Target type t(k=2_4) is not compatible with pointer type t(k=1_4) 5764ab3302SCarolineConcatto p => x2 5864ab3302SCarolineConcatto end 5964ab3302SCarolineConcatto 6064ab3302SCarolineConcatto ! C1016 6164ab3302SCarolineConcatto subroutine s4(x) 6264ab3302SCarolineConcatto class(*), target :: x 6364ab3302SCarolineConcatto type(t(1)), pointer :: p1 6464ab3302SCarolineConcatto type(t2), pointer :: p2 6564ab3302SCarolineConcatto class(*), pointer :: p3 6664ab3302SCarolineConcatto real, pointer :: p4 6764ab3302SCarolineConcatto p2 => x ! OK - not extensible 6864ab3302SCarolineConcatto p3 => x ! OK - unlimited polymorphic 6964ab3302SCarolineConcatto !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic 7064ab3302SCarolineConcatto p1 => x 7164ab3302SCarolineConcatto !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic 7264ab3302SCarolineConcatto p4 => x 7364ab3302SCarolineConcatto end 7464ab3302SCarolineConcatto 7564ab3302SCarolineConcatto ! C1020 7664ab3302SCarolineConcatto subroutine s5 7764ab3302SCarolineConcatto real, target :: x[*] 7864ab3302SCarolineConcatto real, target, volatile :: y[*] 7964ab3302SCarolineConcatto real, pointer :: p 8064ab3302SCarolineConcatto real, pointer, volatile :: q 8164ab3302SCarolineConcatto p => x 8264ab3302SCarolineConcatto !ERROR: Pointer must be VOLATILE when target is a VOLATILE coarray 8364ab3302SCarolineConcatto p => y 8464ab3302SCarolineConcatto !ERROR: Pointer may not be VOLATILE when target is a non-VOLATILE coarray 8564ab3302SCarolineConcatto q => x 8664ab3302SCarolineConcatto q => y 8764ab3302SCarolineConcatto end 8864ab3302SCarolineConcatto 8964ab3302SCarolineConcatto ! C1021, C1023 9064ab3302SCarolineConcatto subroutine s6 9164ab3302SCarolineConcatto real, target :: x 9264ab3302SCarolineConcatto real :: p 9364ab3302SCarolineConcatto type :: tp 9464ab3302SCarolineConcatto real, pointer :: a 9564ab3302SCarolineConcatto real :: b 9664ab3302SCarolineConcatto end type 9764ab3302SCarolineConcatto type(tp) :: y 98*573fc618SPeter Klausler !ERROR: The left-hand side of a pointer assignment is not definable 99*573fc618SPeter Klausler !BECAUSE: 'p' is not a pointer 10064ab3302SCarolineConcatto p => x 10164ab3302SCarolineConcatto y%a => x 102*573fc618SPeter Klausler !ERROR: The left-hand side of a pointer assignment is not definable 103*573fc618SPeter Klausler !BECAUSE: 'b' is not a pointer 10464ab3302SCarolineConcatto y%b => x 10564ab3302SCarolineConcatto end 10664ab3302SCarolineConcatto 10764ab3302SCarolineConcatto !C1025 (R1037) The expr shall be a designator that designates a 10864ab3302SCarolineConcatto !variable with either the TARGET or POINTER attribute and is not 10964ab3302SCarolineConcatto !an array section with a vector subscript, or it shall be a reference 11064ab3302SCarolineConcatto !to a function that returns a data pointer. 11164ab3302SCarolineConcatto subroutine s7 11264ab3302SCarolineConcatto real, target :: a 11364ab3302SCarolineConcatto real, pointer :: b 11464ab3302SCarolineConcatto real, pointer :: c 11564ab3302SCarolineConcatto real :: d 11664ab3302SCarolineConcatto b => a 11764ab3302SCarolineConcatto c => b 11864ab3302SCarolineConcatto !ERROR: In assignment to object pointer 'b', the target 'd' is not an object with POINTER or TARGET attributes 11964ab3302SCarolineConcatto b => d 12064ab3302SCarolineConcatto end 12164ab3302SCarolineConcatto 12264ab3302SCarolineConcatto ! C1025 12364ab3302SCarolineConcatto subroutine s8 12464ab3302SCarolineConcatto real :: a(10) 12564ab3302SCarolineConcatto integer :: b(10) 12664ab3302SCarolineConcatto real, pointer :: p(:) 12764ab3302SCarolineConcatto !ERROR: An array section with a vector subscript may not be a pointer target 12864ab3302SCarolineConcatto p => a(b) 12964ab3302SCarolineConcatto end 13064ab3302SCarolineConcatto 13164ab3302SCarolineConcatto ! C1025 13264ab3302SCarolineConcatto subroutine s9 13364ab3302SCarolineConcatto real, target :: x 13464ab3302SCarolineConcatto real, pointer :: p 13564ab3302SCarolineConcatto p => f1() 13664ab3302SCarolineConcatto !ERROR: pointer 'p' is associated with the result of a reference to function 'f2' that is a not a pointer 13764ab3302SCarolineConcatto p => f2() 13864ab3302SCarolineConcatto contains 13964ab3302SCarolineConcatto function f1() 14064ab3302SCarolineConcatto real, pointer :: f1 14164ab3302SCarolineConcatto f1 => x 14264ab3302SCarolineConcatto end 14364ab3302SCarolineConcatto function f2() 14464ab3302SCarolineConcatto real :: f2 14564ab3302SCarolineConcatto f2 = x 14664ab3302SCarolineConcatto end 14764ab3302SCarolineConcatto end 14864ab3302SCarolineConcatto 14964ab3302SCarolineConcatto ! C1026 (R1037) A data-target shall not be a coindexed object. 15064ab3302SCarolineConcatto subroutine s10 15164ab3302SCarolineConcatto real, target :: a[*] 15264ab3302SCarolineConcatto real, pointer :: b 15364ab3302SCarolineConcatto !ERROR: A coindexed object may not be a pointer target 15464ab3302SCarolineConcatto b => a[1] 15564ab3302SCarolineConcatto end 15664ab3302SCarolineConcatto 15764ab3302SCarolineConcattoend 15864ab3302SCarolineConcatto 15964ab3302SCarolineConcattomodule m2 16064ab3302SCarolineConcatto type :: t1 16164ab3302SCarolineConcatto real :: a 16264ab3302SCarolineConcatto end type 16364ab3302SCarolineConcatto type :: t2 16464ab3302SCarolineConcatto type(t1) :: b 16564ab3302SCarolineConcatto type(t1), pointer :: c 16664ab3302SCarolineConcatto real :: d 16764ab3302SCarolineConcatto end type 16864ab3302SCarolineConcattoend 16964ab3302SCarolineConcatto 17064ab3302SCarolineConcattosubroutine s2 17164ab3302SCarolineConcatto use m2 17264ab3302SCarolineConcatto real, pointer :: p 17364ab3302SCarolineConcatto type(t2), target :: x 17464ab3302SCarolineConcatto type(t2) :: y 17564ab3302SCarolineConcatto !OK: x has TARGET attribute 17664ab3302SCarolineConcatto p => x%b%a 17764ab3302SCarolineConcatto !OK: c has POINTER attribute 17864ab3302SCarolineConcatto p => y%c%a 17964ab3302SCarolineConcatto !ERROR: In assignment to object pointer 'p', the target 'y%b%a' is not an object with POINTER or TARGET attributes 18064ab3302SCarolineConcatto p => y%b%a 18164ab3302SCarolineConcatto associate(z => x%b) 18264ab3302SCarolineConcatto !OK: x has TARGET attribute 18364ab3302SCarolineConcatto p => z%a 18464ab3302SCarolineConcatto end associate 18564ab3302SCarolineConcatto associate(z => y%c) 18664ab3302SCarolineConcatto !OK: c has POINTER attribute 18764ab3302SCarolineConcatto p => z%a 18864ab3302SCarolineConcatto end associate 18964ab3302SCarolineConcatto associate(z => y%b) 19064ab3302SCarolineConcatto !ERROR: In assignment to object pointer 'p', the target 'z%a' is not an object with POINTER or TARGET attributes 19164ab3302SCarolineConcatto p => z%a 19264ab3302SCarolineConcatto end associate 19364ab3302SCarolineConcatto associate(z => y%b%a) 19464ab3302SCarolineConcatto !ERROR: In assignment to object pointer 'p', the target 'z' is not an object with POINTER or TARGET attributes 19564ab3302SCarolineConcatto p => z 19664ab3302SCarolineConcatto end associate 19764ab3302SCarolineConcattoend 198