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 5 int 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 11 void 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 16 void c(); // expected-warning {{declaration is not declared in any declare target region}} 17 18 extern int b; 19 20 struct NonT { 21 int a; 22 }; 23 24 typedef 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}} 28 extern int b; 29 int g; 30 31 struct T { // expected-note {{mappable type cannot be polymorphic}} 32 int a; 33 virtual int method(); 34 }; 35 36 class 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 43 struct C { 44 NonT a; 45 sint b; 46 int method(); 47 int method1(); 48 }; 49 50 int C::method1() { 51 return 0; 52 } 53 54 void 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'}} 67 void foo1() {} 68 #pragma omp end declare target 69 #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}} 70 71 int C::method() { 72 return 0; 73 } 74 75 struct 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 81 int 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 89 namespace { 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