1 // { dg-do compile }
2 // { dg-options "-fopenmp" }
3 
4 struct S
5 {
6   #pragma omp declare simd linear(this)		// { dg-error "is not an function argument" }
7   static void foo ();
8   void bar ();
9 };
10 
11 void
bar()12 S::bar ()
13 {
14   #pragma omp parallel firstprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
15     ;
16   #pragma omp parallel for lastprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
17   for (int i = 0; i < 10; i++)
18     ;
19   #pragma omp parallel shared (this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
20     ;
21   #pragma omp for linear (this)			// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
22   for (int i = 0; i < 10; i++)
23     ;
24   #pragma omp task depend(inout: this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
25     ;
26   #pragma omp task depend(inout: this[0])	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
27     ;
28   #pragma omp parallel private (this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
29   {
30     #pragma omp single copyprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
31     ;
32   }
33 }
34 
35 template <int N>
36 struct T
37 {
38   #pragma omp declare simd linear(this)		// { dg-error "is not an function argument" }
39   static void foo ();
40   void bar ();
41 };
42 
43 template <int N>
44 void
bar()45 T<N>::bar ()
46 {
47   #pragma omp parallel firstprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
48     ;
49   #pragma omp parallel for lastprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
50   for (int i = 0; i < 10; i++)
51     ;
52   #pragma omp parallel shared (this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
53     ;
54   #pragma omp for linear (this)			// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
55   for (int i = 0; i < 10; i++)
56     ;
57   #pragma omp task depend(inout: this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
58     ;
59   #pragma omp task depend(inout: this[0])	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
60     ;
61   #pragma omp parallel private (this)		// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
62   {
63     #pragma omp single copyprivate (this)	// { dg-error ".this. allowed in OpenMP only in .declare simd. clauses" }
64     ;
65   }
66 }
67 
68 template struct T<0>;
69