1! { dg-do compile }
2
3subroutine f1
4  type dt
5    logical :: l = .false.
6  end type
7  type dt2
8    logical :: l = .false.
9  end type
10!$omp declare reduction (foo:integer(kind = 4) & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
11!$omp & :omp_out = omp_out + omp_in)
12!$omp declare reduction (foo:integer(kind = 4) : & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
13!$omp & omp_out = omp_out + omp_in)
14!$omp declare reduction (bar:integer, &
15!$omp & real:omp_out = omp_out + omp_in)
16!$omp declare reduction (baz:integer,real,integer & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
17!$omp & : omp_out = omp_out + omp_in)
18!$omp declare reduction (id1:dt,dt2:omp_out%l=omp_out%l &
19!$omp & .or.omp_in%l)
20!$omp declare reduction (id2:dt,dt:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
21!$omp & .or.omp_in%l)
22!$omp declare reduction (id3:dt2,dt:omp_out%l=omp_out%l & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
23!$omp & .or.omp_in%l)
24!$omp declare reduction (id3:dt2:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
25!$omp & .or.omp_in%l)
26end subroutine f1
27subroutine f2
28  interface
29    subroutine f2a (x, y, z)
30      character (len = *) :: x, y
31      logical :: z
32    end subroutine
33  end interface
34  interface f2b
35    subroutine f2b (x, y, z)
36      character (len = *, kind = 1) :: x, y
37      logical :: z
38    end subroutine
39    subroutine f2c (x, y, z)
40      character (kind = 4, len = *) :: x, y
41      logical :: z
42    end subroutine
43  end interface
44!$omp declare reduction (foo:character(len=*): &
45!$omp & f2a (omp_out, omp_in, .false.)) &
46!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
47!$omp declare reduction (bar:character(len=:): &
48!$omp & f2a (omp_out, omp_in, .false.)) &
49!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
50!$omp declare reduction (baz:character(len=4): &
51!$omp & f2a (omp_out, omp_in, .false.)) &
52!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
53!$omp declare reduction (baz:character(len=5): &
54!$omp & f2a (omp_out, omp_in, .false.)) &
55!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
56!$omp declare reduction (baz:character(len=6): &
57!$omp & f2a (omp_out, omp_in, .false.)) &
58!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
59!$omp declare reduction (id:character(len=*): & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
60!$omp & f2a (omp_out, omp_in, .false.)) &
61!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
62!$omp declare reduction (id: & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
63!$omp & character(len=:) : f2a (omp_out, omp_in, .false.)) &
64!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
65!$omp declare reduction & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
66!$omp (id2:character(len=*), character(len=:): &
67!$omp f2a (omp_out, omp_in, .false.)) &
68!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
69!$omp declare reduction (id3:character(len=*, kind = 1), character(kind=4, len=:): &
70!$omp f2b (omp_out, omp_in, .false.)) &
71!$omp & initializer (f2b (omp_priv, omp_orig, .true.))
72!$omp declare reduction (id4:character(kind=4, len=4), character(kind =1, len=4): &
73!$omp f2b (omp_out, omp_in, .false.)) &
74!$omp & initializer (f2b (omp_priv, omp_orig, .true.))
75end subroutine f2
76