1 // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp -fnoopenmp-use-tls -ferror-limit 100 -o - %s
2 
3 // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp-simd -fnoopenmp-use-tls -ferror-limit 100 -o - %s
4 
5 #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}}
6 
7 int a, b; // expected-warning {{declaration is not declared in any declare target region}}
8 __thread int t; // expected-note {{defined as threadprivate or thread local}}
9 
10 #pragma omp declare target . // expected-error {{expected '(' after 'declare target'}}
11 
12 #pragma omp declare target
13 void f();
14 #pragma omp end declare target shared(a) // expected-warning {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
15 
16 #pragma omp declare target map(a) // expected-error {{unexpected 'map' clause, only 'to' or 'link' clauses expected}}
17 
18 #pragma omp declare target to(foo1) // expected-error {{use of undeclared identifier 'foo1'}}
19 
20 #pragma omp declare target link(foo2) // expected-error {{use of undeclared identifier 'foo2'}}
21 
22 void c(); // expected-warning {{declaration is not declared in any declare target region}}
23 
24 void func() {} // expected-note {{'func' defined here}}
25 
26 #pragma omp declare target link(func) // expected-error {{function name is not allowed in 'link' clause}}
27 
28 extern int b;
29 
30 struct NonT {
31   int a;
32 };
33 
34 typedef int sint;
35 
36 #pragma omp declare target // expected-note {{to match this '#pragma omp declare target'}}
37 #pragma omp threadprivate(a) // expected-note {{defined as threadprivate or thread local}}
38 extern int b;
39 int g;
40 
41 struct T {
42   int a;
43   virtual int method();
44 };
45 
46 class VC {
47   T member;
48   NonT member1;
49   public:
50     virtual int method() { T a; return 0; }
51 };
52 
53 struct C {
54   NonT a;
55   sint b;
56   int method();
57   int method1();
58 };
59 
60 int C::method1() {
61   return 0;
62 }
63 
64 void foo() {
65   a = 0; // expected-error {{threadprivate variables cannot be used in target constructs}}
66   b = 0; // expected-note {{used here}}
67   t = 1; // expected-error {{threadprivate variables cannot be used in target constructs}}
68   C object;
69   VC object1;
70   g = object.method();
71   g += object.method1();
72   g += object1.method();
73   f();
74   c(); // expected-note {{used here}}
75 }
76 #pragma omp declare target // expected-error {{expected '#pragma omp end declare target'}}
77 void foo1() {}
78 #pragma omp end declare target
79 #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}}
80 
81 int C::method() {
82   return 0;
83 }
84 
85 struct S {
86 #pragma omp declare target
87   int v;
88 #pragma omp end declare target
89 };
90 
91 int main (int argc, char **argv) {
92 #pragma omp declare target // expected-error {{unexpected OpenMP directive '#pragma omp declare target'}}
93   int v;
94 #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}}
95   foo();
96   return (0);
97 }
98 
99 namespace {
100 #pragma omp declare target // expected-note {{to match this '#pragma omp declare target'}}
101   int x;
102 } //  expected-error {{expected '#pragma omp end declare target'}}
103 #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}}
104 
105 #pragma omp declare target link(S) // expected-error {{'S' used in declare target directive is not a variable or a function name}}
106 
107 #pragma omp declare target (x, x) // expected-error {{'x' appears multiple times in clauses on the same declare target directive}}
108 #pragma omp declare target to(x) to(x) // expected-error {{'x' appears multiple times in clauses on the same declare target directive}}
109 #pragma omp declare target link(x) // expected-error {{'x' must not appear in both clauses 'to' and 'link'}}
110 
111 #pragma omp declare target // expected-error {{expected '#pragma omp end declare target'}} expected-note {{to match this '#pragma omp declare target'}}
112