| ! { dg-do compile } |
| ! { dg-options "-fcoarray=single" } |
| ! |
| ! PR fortran/40632 |
| ! |
| ! CONTIGUOUS compile-time tests |
| ! |
| |
| ! C448: Must be an array with POINTER attribute |
| type t1 |
| integer, contiguous :: ca(5) ! { dg-error "Component .ca. at .1. has the CONTIGUOUS" } |
| end type t1 |
| type t2 |
| integer, contiguous, allocatable :: cb(:) ! { dg-error "Component .cb. at .1. has the CONTIGUOUS" } |
| end type t2 |
| type t3 |
| integer, contiguous, pointer :: cc(:) ! OK |
| end type t3 |
| type t4 |
| integer, pointer, contiguous :: cd ! { dg-error "Component .cd. at .1. has the CONTIGUOUS" } |
| end type t4 |
| end |
| |
| ! C530: Must be an array and (a) a POINTER or (b) assumed shape. |
| subroutine test(x, y) |
| integer, pointer :: x(:) |
| integer, intent(in) :: y(:) |
| contiguous :: x, y |
| |
| integer, contiguous :: a(5) ! { dg-error ".a. at .1. has the CONTIGUOUS attribute" } |
| integer, contiguous, allocatable :: b(:) ! { dg-error ".b. at .1. has the CONTIGUOUS attribute" } |
| integer, contiguous, pointer :: c(:) ! OK |
| integer, pointer, contiguous :: d ! { dg-error ".d. at .1. has the CONTIGUOUS attribute" } |
| end |
| |
| ! Pointer assignment check: |
| ! If the pointer object has the CONTIGUOUS attribute, the pointer target shall be contiguous. |
| ! Note: This is not compile-time checkable; but F2008, 5.3.7 except in a very few cases. |
| subroutine ptr_assign() |
| integer, pointer, contiguous :: ptr1(:) |
| integer, target :: tgt(5) |
| ptr1 => tgt |
| end subroutine |
| |
| |
| ! C1239 (R1223) If an actual argument is a nonpointer array that has the ASYNCHRONOUS or VOLATILE |
| ! attribute but is not simply contiguous (6.5.4), and the corresponding dummy argument has either the |
| ! VOLATILE or ASYNCHRONOUS attribute, that dummy argument shall be an assumed-shape array |
| ! that does not have the CONTIGUOUS attribute. |
| |
| subroutine C1239 |
| type t |
| integer :: e(4) |
| end type t |
| type(t), volatile :: f |
| integer, asynchronous :: a(4), b(4) |
| integer, volatile :: c(4), d(4) |
| call test (a,b,c) ! OK |
| call test (a,b(::2),c) ! { dg-error "array without CONTIGUOUS" } |
| call test (a(::2),b,c) ! { dg-error "array without CONTIGUOUS" } |
| |
| call test (a,b,f%e) ! OK |
| call test (a,f%e,c) ! OK |
| call test (f%e,b,c) ! OK |
| call test (a,b,f%e(::2)) ! OK |
| call test (a,f%e(::2),c) ! { dg-error "array without CONTIGUOUS" } |
| call test (f%e(::2),b,c) ! { dg-error "array without CONTIGUOUS" } |
| contains |
| subroutine test(u, v, w) |
| integer, asynchronous :: u(:), v(*) |
| integer, volatile :: w(:) |
| contiguous :: u |
| end subroutine test |
| end subroutine C1239 |
| |
| |
| ! C1240 (R1223) If an actual argument is an array pointer that has the ASYNCHRONOUS or VOLATILE |
| ! attribute but does not have the CONTIGUOUS attribute, and the corresponding dummy argument has |
| ! either the VOLATILE or ASYNCHRONOUS attribute, that dummy argument shall be an array pointer |
| ! or an assumed-shape array that does not have the CONTIGUOUS attribute. |
| |
| subroutine C1240 |
| type t |
| integer,pointer :: e(:) |
| end type t |
| type(t), volatile :: f |
| integer, pointer, asynchronous :: a(:), b(:) |
| integer,pointer, volatile :: c(:), d(:) |
| call test (a,b,c) ! { dg-error "array without CONTIGUOUS" } |
| call test (a,b(::2),c) ! { dg-error "array without CONTIGUOUS" } |
| call test (a(::2),b,c) ! { dg-error "array without CONTIGUOUS" } |
| |
| call test (a,b,f%e) ! { dg-error "array without CONTIGUOUS" } |
| call test (a,f%e,c) ! { dg-error "array without CONTIGUOUS" } |
| call test (f%e,b,c) ! { dg-error "array without CONTIGUOUS" } |
| call test (a,b,f%e(::2)) ! { dg-error "array without CONTIGUOUS" } |
| call test (a,f%e(::2),c) ! { dg-error "array without CONTIGUOUS" } |
| call test (f%e(::2),b,c) ! { dg-error "array without CONTIGUOUS" } |
| |
| call test2(a,b) |
| call test3(a,b) |
| call test2(c,d) |
| call test3(c,d) |
| call test2(f%e,d) |
| call test3(c,f%e) |
| contains |
| subroutine test(u, v, w) |
| integer, asynchronous :: u(:), v(*) |
| integer, volatile :: w(:) |
| contiguous :: u |
| end subroutine test |
| subroutine test2(x,y) |
| integer, asynchronous :: x(:) |
| integer, volatile :: y(:) |
| end subroutine test2 |
| subroutine test3(x,y) |
| integer, pointer, asynchronous :: x(:) |
| integer, pointer, volatile :: y(:) |
| end subroutine test3 |
| end subroutine C1240 |
| |
| |
| |
| ! 12.5.2.7 Pointer dummy variables |
| ! C1241 The actual argument corresponding to a dummy pointer with the CONTIGUOUS attribute shall be |
| ! simply contiguous (6.5.4). |
| |
| subroutine C1241 |
| integer, pointer, contiguous :: a(:) |
| integer, pointer :: b(:) |
| call test(a) |
| call test(b) ! { dg-error "must be simply contiguous" } |
| contains |
| subroutine test(x) |
| integer, pointer, contiguous :: x(:) |
| end subroutine test |
| end subroutine C1241 |
| |
| |
| ! 12.5.2.8 Coarray dummy variables |
| ! If the dummy argument is an array coarray that has the CONTIGUOUS attribute or is not of assumed shape, |
| ! the corresponding actual argument shall be simply contiguous |
| |
| subroutine sect12528(cob) |
| integer, save :: coa(6)[*] |
| integer :: cob(:)[*] |
| |
| call test(coa) |
| call test2(coa) |
| call test3(coa) |
| |
| call test(cob) ! { dg-error "must be simply contiguous" } |
| call test2(cob) ! { dg-error "must be simply contiguous" } |
| call test3(cob) |
| contains |
| subroutine test(x) |
| integer, contiguous :: x(:)[*] |
| end subroutine test |
| subroutine test2(x) |
| integer :: x(*)[*] |
| end subroutine test2 |
| subroutine test3(x) |
| integer :: x(:)[*] |
| end subroutine test3 |
| end subroutine sect12528 |
| |
| |
| |
| subroutine test34 |
| implicit none |
| integer, volatile,pointer :: a(:,:),i |
| call foo(a(2,2:3:2)) ! { dg-error "must be simply contiguous" } |
| contains |
| subroutine foo(x) |
| integer, pointer, contiguous, volatile :: x(:) |
| end subroutine |
| end subroutine test34 |