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