! { dg-do compile }
|
! { dg-do compile }
|
!
|
!
|
! PR39630: Fortran 2003: Procedure pointer components.
|
! PR39630: Fortran 2003: Procedure pointer components.
|
!
|
!
|
! Probing some error messages.
|
! Probing some error messages.
|
!
|
!
|
! Contributed by Janus Weil
|
! Contributed by Janus Weil
|
|
|
implicit none
|
implicit none
|
|
|
interface
|
interface
|
subroutine sub
|
subroutine sub
|
end subroutine
|
end subroutine
|
end interface
|
end interface
|
|
|
external :: aaargh
|
external :: aaargh
|
|
|
type :: t
|
type :: t
|
procedure(), pointer, nopass :: ptr1
|
procedure(), pointer, nopass :: ptr1
|
procedure(real), pointer, nopass :: ptr2
|
procedure(real), pointer, nopass :: ptr2
|
procedure(sub), pointer, nopass :: ptr3
|
procedure(sub), pointer, nopass :: ptr3
|
procedure(), pointer, nopass ptr4 ! { dg-error "Expected '::'" }
|
procedure(), pointer, nopass ptr4 ! { dg-error "Expected '::'" }
|
procedure(), pointer, nopass, pointer :: ptr5 ! { dg-error "Duplicate" }
|
procedure(), pointer, nopass, pointer :: ptr5 ! { dg-error "Duplicate" }
|
procedure, pointer, nopass :: ptr6 ! { dg-error "Syntax error" }
|
procedure, pointer, nopass :: ptr6 ! { dg-error "Syntax error" }
|
procedure(), pointer, nopass :: ptr7 => ptr2 ! { dg-error "requires a NULL" }
|
procedure(), pointer, nopass :: ptr7 => ptr2 ! { dg-error "requires a NULL" }
|
procedure(), nopass :: ptr8 ! { dg-error "POINTER attribute is required" }
|
procedure(), nopass :: ptr8 ! { dg-error "POINTER attribute is required" }
|
procedure(pp), pointer, nopass :: ptr9 ! { dg-error "declared in a later PROCEDURE statement" }
|
procedure(pp), pointer, nopass :: ptr9 ! { dg-error "declared in a later PROCEDURE statement" }
|
procedure(aaargh), pointer, nopass :: ptr10 ! { dg-error "must be explicit" }
|
procedure(aaargh), pointer, nopass :: ptr10 ! { dg-error "must be explicit" }
|
real :: y
|
real :: y
|
end type t
|
end type t
|
|
|
type,bind(c) :: bct ! { dg-error "BIND.C. derived type" }
|
type,bind(c) :: bct ! { dg-error "BIND.C. derived type" }
|
procedure(), pointer,nopass :: ptr ! { dg-error "cannot be a member of|may not be C interoperable" }
|
procedure(), pointer,nopass :: ptr ! { dg-error "cannot be a member of|may not be C interoperable" }
|
end type bct
|
end type bct
|
|
|
procedure(sub), pointer :: pp
|
procedure(sub), pointer :: pp
|
|
|
type(t) :: x
|
type(t) :: x
|
|
|
x%ptr2 => x ! { dg-error "Invalid procedure pointer assignment" }
|
x%ptr2 => x ! { dg-error "Invalid procedure pointer assignment" }
|
|
|
x => x%ptr2 ! { dg-error "Pointer assignment to non-POINTER" }
|
x => x%ptr2 ! { dg-error "Pointer assignment to non-POINTER" }
|
|
|
print *, x%ptr1() ! { dg-error "attribute conflicts with" }
|
print *, x%ptr1() ! { dg-error "attribute conflicts with" }
|
call x%ptr2() ! { dg-error "attribute conflicts with" }
|
call x%ptr2() ! { dg-error "attribute conflicts with" }
|
print *,x%ptr3() ! { dg-error "attribute conflicts with" }
|
print *,x%ptr3() ! { dg-error "attribute conflicts with" }
|
|
|
call x%y ! { dg-error "Expected type-bound procedure or procedure pointer component" }
|
call x%y ! { dg-error "Expected type-bound procedure or procedure pointer component" }
|
|
|
end
|
end
|
|
|
|
|