blob: 3d3cd635279eac1f512c96619c33a5ed2c38cb81 [file] [log] [blame]
! PR 101337
! { dg-do compile}
!
! TS 29113
! C407b An assumed-type variable name shall not appear in a designator
! or expression except as an actual argument corresponding to a dummy
! argument that is assumed-type, or as the first argument to any of
! the intrinsic and intrinsic module functions IS_CONTIGUOUS, LBOUND,
! PRESENT, RANK, SHAPE, SIZE, UBOUND, and C_LOC.
!
! This file contains tests that are expected to give diagnostics.
! Check that passing an assumed-type variable as an actual argument
! corresponding to a non-assumed-type dummy gives a diagnostic.
module m
interface
subroutine f (a, b)
implicit none
integer :: a
integer :: b
end subroutine
subroutine g (a, b)
implicit none
type(*) :: a
integer :: b
end subroutine
subroutine h (a, b)
implicit none
type(*) :: a(*)
integer :: b
end subroutine
end interface
end module
subroutine s0 (x)
use m
implicit none
type(*) :: x
call g (x, 1)
call f (x, 1) ! { dg-error "Type mismatch" }
call h (x, 1) ! { dg-error "Rank mismatch" }
end subroutine
! Check that you can't use an assumed-type array variable in an array
! element or section designator.
subroutine s1 (x, y)
use m
implicit none
integer :: x(*)
type(*) :: y(*)
call f (x(1), 1)
call g (y(1), 1) ! { dg-error "Assumed.type" }
call h (y, 1) ! ok
call h (y(1:3:1), 1) ! { dg-error "Assumed.type" }
end subroutine
! Check that you can't use an assumed-type array variable in other
! expressions. This is clearly not exhaustive since few operations
! are even plausible from a type perspective.
subroutine s2 (x, y)
implicit none
type(*) :: x, y
integer :: i
! select type
select type (x) ! { dg-error "Assumed.type|Selector shall be polymorphic" }
type is (integer)
i = 0
type is (real)
i = 1
class default
i = -1
end select
! relational operations
if (x & ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
.eq. y) then ! { dg-error "Assumed.type" }
return
end if
if (.not. (x & ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
.ne. y)) then ! { dg-error "Assumed.type" }
return
end if
if (.not. x) then ! { dg-error "Assumed.type" }
return
end if
! assignment
x & ! { dg-error "Assumed.type" }
= y ! { dg-error "Assumed.type" }
i = x ! { dg-error "Assumed.type" }
y = i ! { dg-error "Assumed.type" }
! arithmetic
i = x + 1 ! { dg-error "Assumed.type" }
i = -y ! { dg-error "Assumed.type" }
i = (x & ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
+ y) ! { dg-error "Assumed.type" }
! computed go to
goto (10, 20, 30), x ! { dg-error "Assumed.type|must be a scalar integer" }
10 continue
20 continue
30 continue
! do loops
do i = 1, x ! { dg-error "Assumed.type" }
continue
end do
do x = 1, i ! { dg-error "Assumed.type" }
continue
end do
end subroutine
! Check that calls to disallowed intrinsic functions produce a diagnostic.
! Again, this isn't exhaustive, there are just too many intrinsics and
! hardly any of them are plausible.
subroutine s3 (x, y)
implicit none
type(*) :: x, y
integer :: i
i = bit_size (x) ! { dg-error "Assumed.type" }
i = exponent (x) ! { dg-error "Assumed.type" }
if (extends_type_of (x, & ! { dg-error "Assumed.type" }
y)) then ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
return
end if
if (same_type_as (x, & ! { dg-error "Assumed.type" }
y)) then ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
return
end if
i = storage_size (x) ! { dg-error "Assumed.type" }
i = iand (x, & ! { dg-error "Assumed.type" }
y) ! { dg-error "Assumed.type" "pr101337, failure to diagnose both operands" { xfail *-*-*} }
i = kind (x) ! { dg-error "Assumed.type" }
end subroutine