1! { dg-do compile } 2! { dg-options "-std=f95" } 3! 4! PR fortran/34796 5! 6! This checks for Fortran 2003 extensions. 7! 8! Argument checks: 9! - elements of deferred-shape arrays (= non-dummies) are allowed 10! as the memory is contiguous 11! - while assumed-shape arrays (= dummy arguments) and pointers are 12! not (strides can make them non-contiguous) 13! and 14! - if the memory is non-contigous, character arguments have as 15! storage size only the size of the element itself, check for 16! too short actual arguments. 17! 18subroutine test2(assumed_sh_dummy, pointer_dummy) 19implicit none 20interface 21 subroutine rlv2(y) 22 character :: y(3) 23 end subroutine rlv2 24end interface 25 26character(3) :: assumed_sh_dummy(:,:,:) 27character(3), pointer :: pointer_dummy(:,:,:) 28 29character(3), allocatable :: deferred(:,:,:) 30character(3), pointer :: ptr(:,:,:) 31call rlv2(deferred(1,1,1)) ! Valid since contiguous 32call rlv2(ptr(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 33call rlv2(assumed_sh_dummy(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 34call rlv2(pointer_dummy(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 35 36! The following is kind of ok: The memory access it valid 37! We warn nonetheless as the result is not what is intented 38! and also formally wrong. 39! Using (1:string_length) would be ok. 40call rlv2(deferred(1,1,1)(1:3)) ! OK 41call rlv2(ptr(1,1,1)(1:1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 42call rlv2(assumed_sh_dummy(1,1,1)(1:2)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 43call rlv2(pointer_dummy(1,1,1)(1:3)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 44end 45 46subroutine test3(assumed_sh_dummy, pointer_dummy) 47implicit none 48interface 49 subroutine rlv3(y) 50 character :: y(2) 51 end subroutine rlv3 52end interface 53 54character(2) :: assumed_sh_dummy(:,:,:) 55character(2), pointer :: pointer_dummy(:,:,:) 56 57character(2), allocatable :: deferred(:,:,:) 58character(2), pointer :: ptr(:,:,:) 59call rlv3(deferred(1,1,1)) ! Valid since contiguous 60call rlv3(ptr(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 61call rlv3(assumed_sh_dummy(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 62call rlv3(pointer_dummy(1,1,1)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 63 64call rlv3(deferred(1,1,1)(1:2)) ! Valid since contiguous 65call rlv3(ptr(1,1,1)(1:2)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 66call rlv3(assumed_sh_dummy(1,1,1)(1:2)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 67call rlv3(pointer_dummy(1,1,1)(1:2)) ! { dg-error "Fortran 2003: Scalar CHARACTER actual" } 68end 69