1! { dg-do compile }
2! { dg-shouldfail "Invalid Fortran 2003 code" }
3! { dg-options "-std=f2003 -fall-intrinsics" }
4! PR fortran/23994
5!
6! Test PROTECTED attribute. Within the module everything is allowed.
7! Outside (use-associated): For pointers, their association status
8! may not be changed. For nonpointers, their value may not be changed.
9!
10! Test of a invalid code
11
12module protmod
13  implicit none
14  integer, Protected          :: a
15  integer, protected, target  :: at
16  integer, protected, pointer :: ap
17end module protmod
18
19program main
20  use protmod
21  implicit none
22  a = 43       ! { dg-error "variable definition context" }
23  ap => null() ! { dg-error "pointer association context" }
24  nullify(ap)  ! { dg-error "pointer association context" }
25  ap => at     ! { dg-error "pointer association context" }
26  ap = 3       ! OK
27  allocate(ap) ! { dg-error "pointer association context" }
28  ap = 73      ! OK
29  call increment(a,at) ! { dg-error "variable definition context" }
30  call pointer_assignments(ap) ! { dg-error "pointer association context" }
31contains
32  subroutine increment(a1,a3)
33    integer, intent(inout) :: a1, a3
34    a1 = a1 + 1
35    a3 = a3 + 1
36  end subroutine increment
37  subroutine pointer_assignments(p)
38    integer, pointer,intent (inout) :: p
39    p => null()
40  end subroutine pointer_assignments
41end program main
42
43module prot2
44  implicit none
45contains
46  subroutine bar
47    real, protected :: b ! { dg-error "only allowed in specification part of a module" }
48  end subroutine bar
49end module prot2
50