1*404b540aSrobert! { dg-do run }
2*404b540aSrobert! { dg-options "-w" }
3*404b540aSrobert
4*404b540aSrobert  character (6) :: c, f2
5*404b540aSrobert  character (6) :: d(2)
6*404b540aSrobert  c = f1 (6)
7*404b540aSrobert  if (c .ne. 'opqrst') call abort
8*404b540aSrobert  c = f2 (6)
9*404b540aSrobert  if (c .ne. '_/!!/_') call abort
10*404b540aSrobert  d = f3 (6)
11*404b540aSrobert  if (d(1) .ne. 'opqrst' .or. d(2) .ne. 'a') call abort
12*404b540aSrobert  d = f4 (6)
13*404b540aSrobert  if (d(1) .ne. 'Opqrst' .or. d(2) .ne. 'A') call abort
14*404b540aSrobertcontains
15*404b540aSrobert  function f1 (n)
16*404b540aSrobert    use omp_lib
17*404b540aSrobert    character (n) :: f1
18*404b540aSrobert    logical :: l
19*404b540aSrobert    f1 = 'abcdef'
20*404b540aSrobert    l = .false.
21*404b540aSrobert!$omp parallel firstprivate (f1) reduction (.or.:l) num_threads (2)
22*404b540aSrobert    l = f1 .ne. 'abcdef'
23*404b540aSrobert    if (omp_get_thread_num () .eq. 0) f1 = 'ijklmn'
24*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f1 = 'IJKLMN'
25*404b540aSrobert!$omp barrier
26*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 0 .and. f1 .ne. 'ijklmn')
27*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 1 .and. f1 .ne. 'IJKLMN')
28*404b540aSrobert!$omp end parallel
29*404b540aSrobert    f1 = 'zZzz_z'
30*404b540aSrobert!$omp parallel shared (f1) reduction (.or.:l) num_threads (2)
31*404b540aSrobert    l = l .or. f1 .ne. 'zZzz_z'
32*404b540aSrobert!$omp barrier
33*404b540aSrobert!$omp master
34*404b540aSrobert    f1 = 'abc'
35*404b540aSrobert!$omp end master
36*404b540aSrobert!$omp barrier
37*404b540aSrobert    l = l .or. f1 .ne. 'abc'
38*404b540aSrobert!$omp barrier
39*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f1 = 'def'
40*404b540aSrobert!$omp barrier
41*404b540aSrobert    l = l .or. f1 .ne. 'def'
42*404b540aSrobert!$omp end parallel
43*404b540aSrobert    if (l) call abort
44*404b540aSrobert    f1 = 'opqrst'
45*404b540aSrobert  end function f1
46*404b540aSrobert  function f3 (n)
47*404b540aSrobert    use omp_lib
48*404b540aSrobert    character (n), dimension (2) :: f3
49*404b540aSrobert    logical :: l
50*404b540aSrobert    f3 = 'abcdef'
51*404b540aSrobert    l = .false.
52*404b540aSrobert!$omp parallel firstprivate (f3) reduction (.or.:l) num_threads (2)
53*404b540aSrobert    l = any (f3 .ne. 'abcdef')
54*404b540aSrobert    if (omp_get_thread_num () .eq. 0) f3 = 'ijklmn'
55*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f3 = 'IJKLMN'
56*404b540aSrobert!$omp barrier
57*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 0 .and. any (f3 .ne. 'ijklmn'))
58*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 1 .and. any (f3 .ne. 'IJKLMN'))
59*404b540aSrobert!$omp end parallel
60*404b540aSrobert    f3 = 'zZzz_z'
61*404b540aSrobert!$omp parallel shared (f3) reduction (.or.:l) num_threads (2)
62*404b540aSrobert    l = l .or. any (f3 .ne. 'zZzz_z')
63*404b540aSrobert!$omp barrier
64*404b540aSrobert!$omp master
65*404b540aSrobert    f3 = 'abc'
66*404b540aSrobert!$omp end master
67*404b540aSrobert!$omp barrier
68*404b540aSrobert    l = l .or. any (f3 .ne. 'abc')
69*404b540aSrobert!$omp barrier
70*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f3 = 'def'
71*404b540aSrobert!$omp barrier
72*404b540aSrobert    l = l .or. any (f3 .ne. 'def')
73*404b540aSrobert!$omp end parallel
74*404b540aSrobert    if (l) call abort
75*404b540aSrobert    f3(1) = 'opqrst'
76*404b540aSrobert    f3(2) = 'a'
77*404b540aSrobert  end function f3
78*404b540aSrobert  function f4 (n)
79*404b540aSrobert    use omp_lib
80*404b540aSrobert    character (n), dimension (n - 4) :: f4
81*404b540aSrobert    logical :: l
82*404b540aSrobert    f4 = 'abcdef'
83*404b540aSrobert    l = .false.
84*404b540aSrobert!$omp parallel firstprivate (f4) reduction (.or.:l) num_threads (2)
85*404b540aSrobert    l = any (f4 .ne. 'abcdef')
86*404b540aSrobert    if (omp_get_thread_num () .eq. 0) f4 = 'ijklmn'
87*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f4 = 'IJKLMN'
88*404b540aSrobert!$omp barrier
89*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 0 .and. any (f4 .ne. 'ijklmn'))
90*404b540aSrobert    l = l .or. (omp_get_thread_num () .eq. 1 .and. any (f4 .ne. 'IJKLMN'))
91*404b540aSrobert    l = l .or. size (f4) .ne. 2
92*404b540aSrobert!$omp end parallel
93*404b540aSrobert    f4 = 'zZzz_z'
94*404b540aSrobert!$omp parallel shared (f4) reduction (.or.:l) num_threads (2)
95*404b540aSrobert    l = l .or. any (f4 .ne. 'zZzz_z')
96*404b540aSrobert!$omp barrier
97*404b540aSrobert!$omp master
98*404b540aSrobert    f4 = 'abc'
99*404b540aSrobert!$omp end master
100*404b540aSrobert!$omp barrier
101*404b540aSrobert    l = l .or. any (f4 .ne. 'abc')
102*404b540aSrobert!$omp barrier
103*404b540aSrobert    if (omp_get_thread_num () .eq. 1) f4 = 'def'
104*404b540aSrobert!$omp barrier
105*404b540aSrobert    l = l .or. any (f4 .ne. 'def')
106*404b540aSrobert    l = l .or. size (f4) .ne. 2
107*404b540aSrobert!$omp end parallel
108*404b540aSrobert    if (l) call abort
109*404b540aSrobert    f4(1) = 'Opqrst'
110*404b540aSrobert    f4(2) = 'A'
111*404b540aSrobert  end function f4
112*404b540aSrobertend
113*404b540aSrobertfunction f2 (n)
114*404b540aSrobert  use omp_lib
115*404b540aSrobert  character (*) :: f2
116*404b540aSrobert  logical :: l
117*404b540aSrobert  f2 = 'abcdef'
118*404b540aSrobert  l = .false.
119*404b540aSrobert!$omp parallel firstprivate (f2) reduction (.or.:l) num_threads (2)
120*404b540aSrobert  l = f2 .ne. 'abcdef'
121*404b540aSrobert  if (omp_get_thread_num () .eq. 0) f2 = 'ijklmn'
122*404b540aSrobert  if (omp_get_thread_num () .eq. 1) f2 = 'IJKLMN'
123*404b540aSrobert!$omp barrier
124*404b540aSrobert  l = l .or. (omp_get_thread_num () .eq. 0 .and. f2 .ne. 'ijklmn')
125*404b540aSrobert  l = l .or. (omp_get_thread_num () .eq. 1 .and. f2 .ne. 'IJKLMN')
126*404b540aSrobert!$omp end parallel
127*404b540aSrobert  f2 = 'zZzz_z'
128*404b540aSrobert!$omp parallel shared (f2) reduction (.or.:l) num_threads (2)
129*404b540aSrobert  l = l .or. f2 .ne. 'zZzz_z'
130*404b540aSrobert!$omp barrier
131*404b540aSrobert!$omp master
132*404b540aSrobert  f2 = 'abc'
133*404b540aSrobert!$omp end master
134*404b540aSrobert!$omp barrier
135*404b540aSrobert  l = l .or. f2 .ne. 'abc'
136*404b540aSrobert!$omp barrier
137*404b540aSrobert  if (omp_get_thread_num () .eq. 1) f2 = 'def'
138*404b540aSrobert!$omp barrier
139*404b540aSrobert  l = l .or. f2 .ne. 'def'
140*404b540aSrobert!$omp end parallel
141*404b540aSrobert  if (l) call abort
142*404b540aSrobert  f2 = '_/!!/_'
143*404b540aSrobertend function f2
144