1 // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp=libiomp5 -ferror-limit 100 %s 2 3 #pragma omp threadprivate // expected-error {{expected '(' after 'threadprivate'}} 4 #pragma omp threadprivate( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}} 5 #pragma omp threadprivate() // expected-error {{expected identifier}} 6 #pragma omp threadprivate(1) // expected-error {{expected unqualified-id}} 7 struct CompleteSt{ 8 int a; 9 }; 10 11 struct CompleteSt1{ 12 #pragma omp threadprivate(1) // expected-error {{expected unqualified-id}} 13 int a; 14 } d; // expected-note {{'d' defined here}} 15 16 int a; // expected-note {{'a' defined here}} 17 18 #pragma omp threadprivate(a) 19 #pragma omp threadprivate(u) // expected-error {{use of undeclared identifier 'u'}} 20 #pragma omp threadprivate(d, a) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} 21 int foo() { // expected-note {{declared here}} 22 static int l; 23 #pragma omp threadprivate(l)) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 24 return (a); 25 } 26 27 #pragma omp threadprivate (a) ( 28 // expected-error@-1 {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning@-1 {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 29 #pragma omp threadprivate (a) [ // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 30 #pragma omp threadprivate (a) { // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 31 #pragma omp threadprivate (a) ) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 32 #pragma omp threadprivate (a) ] // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 33 #pragma omp threadprivate (a) } // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 34 #pragma omp threadprivate a // expected-error {{expected '(' after 'threadprivate'}} 35 #pragma omp threadprivate(d // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd'}} 36 #pragma omp threadprivate(d)) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd'}} expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 37 int x, y; 38 #pragma omp threadprivate(x)) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 39 #pragma omp threadprivate(y)), 40 // expected-warning@-1 {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 41 #pragma omp threadprivate(a,d) 42 // expected-error@-1 {{'#pragma omp threadprivate' must precede all references to variable 'a'}} expected-error@-1 {{'#pragma omp threadprivate' must precede all references to variable 'd'}} 43 #pragma omp threadprivate(d.a) // expected-error {{expected identifier}} 44 #pragma omp threadprivate((float)a) // expected-error {{expected unqualified-id}} 45 int foa; // expected-note {{'foa' declared here}} 46 #pragma omp threadprivate(faa) // expected-error {{use of undeclared identifier 'faa'; did you mean 'foa'?}} 47 #pragma omp threadprivate(foo) // expected-error {{'foo' is not a global variable, static local variable or static data member}} 48 #pragma omp threadprivate (int a=2) // expected-error {{expected unqualified-id}} 49 50 struct IncompleteSt; // expected-note {{forward declaration of 'IncompleteSt'}} 51 52 extern IncompleteSt e; 53 #pragma omp threadprivate (e) // expected-error {{threadprivate variable with incomplete type 'IncompleteSt'}} 54 55 int &f = a; // expected-note {{'f' defined here}} 56 #pragma omp threadprivate (f) // expected-error {{arguments of '#pragma omp threadprivate' cannot be of reference type 'int &'}} 57 58 class TestClass { 59 private: 60 int a; // expected-note {{declared here}} 61 static int b; // expected-note {{'b' declared here}} 62 TestClass() : a(0){} 63 public: 64 TestClass (int aaa) : a(aaa) {} 65 #pragma omp threadprivate (b, a) // expected-error {{'a' is not a global variable, static local variable or static data member}} 66 } g(10); 67 #pragma omp threadprivate (b) // expected-error {{use of undeclared identifier 'b'}} 68 #pragma omp threadprivate (TestClass::b) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'TestClass::b' variable declaration}} 69 #pragma omp threadprivate (g) 70 71 namespace ns { 72 int m; 73 #pragma omp threadprivate (m) 74 } 75 #pragma omp threadprivate (m) // expected-error {{use of undeclared identifier 'm'}} 76 #pragma omp threadprivate (ns::m) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'ns::m'}} 77 #pragma omp threadprivate (ns:m) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} expected-error {{'#pragma omp threadprivate' must precede all references to variable 'ns::m'}} 78 79 const int h = 12; 80 const volatile int i = 10; 81 #pragma omp threadprivate (h, i) 82 83 84 template <class T> 85 class TempClass { 86 private: 87 T a; 88 TempClass() : a(){} 89 public: 90 TempClass (T aaa) : a(aaa) {} 91 static T s; 92 #pragma omp threadprivate (s) 93 }; 94 #pragma omp threadprivate (s) // expected-error {{use of undeclared identifier 's'}} 95 96 static __thread int t; // expected-note {{'t' defined here}} 97 #pragma omp threadprivate (t) // expected-error {{variable 't' cannot be threadprivate because it is thread-local}} 98 99 int o; // expected-note {{candidate found by name lookup is 'o'}} 100 #pragma omp threadprivate (o) 101 namespace { 102 int o; // expected-note {{candidate found by name lookup is '(anonymous namespace)::o'}} 103 #pragma omp threadprivate (o) 104 #pragma omp threadprivate (o) // expected-error {{'#pragma omp threadprivate' must precede all references to variable '(anonymous namespace)::o'}} 105 } 106 #pragma omp threadprivate (o) // expected-error {{reference to 'o' is ambiguous}} 107 #pragma omp threadprivate (::o) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'o'}} 108 109 int main(int argc, char **argv) { // expected-note {{'argc' defined here}} 110 111 int x, y = argc; // expected-note 2 {{'y' defined here}} 112 static double d1; 113 static double d2; 114 static double d3; // expected-note {{'d3' defined here}} 115 static TestClass LocalClass(y); // expected-error {{variable with local storage in initial value of threadprivate variable}} 116 #pragma omp threadprivate(LocalClass) 117 118 d.a = a; 119 d2++; 120 ; 121 #pragma omp threadprivate(argc+y) // expected-error {{expected identifier}} 122 #pragma omp threadprivate(argc,y) // expected-error 2 {{arguments of '#pragma omp threadprivate' must have static storage duration}} 123 #pragma omp threadprivate(d2) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd2'}} 124 #pragma omp threadprivate(d1) 125 { 126 ++a;d2=0; 127 #pragma omp threadprivate(d3) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'd3' variable declaration}} 128 } 129 #pragma omp threadprivate(d3) 130 131 #pragma omp threadprivate(a) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'a' variable declaration}} 132 return (y); 133 #pragma omp threadprivate(d) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'd' variable declaration}} 134 } 135