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 good1
13  implicit none
14  integer              :: a
15  integer              :: b,c
16  protected            :: c
17  equivalence (a,c) ! { dg-error "Either all or none of the objects in the EQUIVALENCE" }
18end module good1
19
20
21module bad1
22  implicit none
23  integer, protected   :: a
24  integer              :: b,c
25  protected            :: c
26  equivalence (a,b) ! { dg-error "Either all or none of the objects in the EQUIVALENCE" }
27end module bad1
28
29module bad2
30  implicit none
31  integer, protected   :: a
32  integer              :: b,c,d
33  protected            :: c
34  common /one/ a,b  ! { dg-error "PROTECTED attribute conflicts with COMMON" }
35  common /two/ c,d  ! { dg-error "PROTECTED attribute conflicts with COMMON" }
36end module bad2
37
38module good2
39  implicit none
40  type myT
41     integer :: j
42     integer, pointer :: p
43     real, allocatable, dimension(:) :: array
44  end type myT
45  type(myT), save :: t
46  protected :: t
47end module good2
48
49program main
50  use good2
51  implicit none
52  t%j = 15             ! { dg-error "variable definition context" }
53  nullify(t%p)         ! { dg-error "pointer association context" }
54  allocate(t%array(15))! { dg-error "variable definition context" }
55end program main
56