xref: /llvm-project/flang/test/Semantics/assign02.f90 (revision 573fc6187b82290665ed7d94aa50641d06260a9e)
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