1 // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp -fnoopenmp-use-tls -ferror-limit 100 -emit-llvm -o - %s 2 // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp -ferror-limit 100 -emit-llvm -o - %s 3 4 #pragma omp threadprivate // expected-error {{expected '(' after 'threadprivate'}} 5 #pragma omp threadprivate( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}} 6 #pragma omp threadprivate() // expected-error {{expected identifier}} 7 #pragma omp threadprivate(1) // expected-error {{expected unqualified-id}} 8 struct CompleteSt{ 9 int a; 10 }; 11 12 struct CompleteSt1{ 13 #pragma omp threadprivate(1) // expected-error {{expected unqualified-id}} 14 int a; 15 } d; // expected-note {{'d' defined here}} 16 17 int a; // expected-note {{'a' defined here}} 18 19 #pragma omp threadprivate(a) 20 #pragma omp threadprivate(u) // expected-error {{use of undeclared identifier 'u'}} 21 #pragma omp threadprivate(d, a) 22 int foo() { // expected-note {{declared here}} 23 static int l; 24 #pragma omp threadprivate(l)) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 25 return (a); 26 } 27 28 #pragma omp threadprivate (a) ( 29 // expected-warning@-1 {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 30 #pragma omp threadprivate (a) [ // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 31 #pragma omp threadprivate (a) { // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 32 #pragma omp threadprivate (a) ) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 33 #pragma omp threadprivate (a) ] // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 34 #pragma omp threadprivate (a) } // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 35 #pragma omp threadprivate a // expected-error {{expected '(' after 'threadprivate'}} 36 #pragma omp threadprivate(d // expected-error {{expected ')'}} expected-note {{to match this '('}} 37 #pragma omp threadprivate(d)) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 38 int x, y; 39 #pragma omp threadprivate(x)) // expected-warning {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 40 #pragma omp threadprivate(y)), 41 // expected-warning@-1 {{extra tokens at the end of '#pragma omp threadprivate' are ignored}} 42 #pragma omp threadprivate(a,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, m) 74 } 75 #pragma omp threadprivate (m) // expected-error {{use of undeclared identifier 'm'}} 76 #pragma omp threadprivate (ns::m) 77 #pragma omp threadprivate (ns:m) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} 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 // Register "0" is currently an invalid register for global register variables. 100 // Use "esp" instead of "0". 101 // register int reg0 __asm__("0"); 102 register int reg0 __asm__("esp"); // expected-note {{'reg0' defined here}} 103 #pragma omp threadprivate (reg0) // expected-error {{variable 'reg0' cannot be threadprivate because it is a global named register variable}} 104 105 int o; // expected-note {{candidate found by name lookup is 'o'}} 106 #pragma omp threadprivate (o) 107 namespace { 108 int o; // expected-note {{candidate found by name lookup is '(anonymous namespace)::o'}} 109 #pragma omp threadprivate (o) 110 #pragma omp threadprivate (o) 111 } 112 #pragma omp threadprivate (o) // expected-error {{reference to 'o' is ambiguous}} 113 #pragma omp threadprivate (::o) 114 115 int main(int argc, char **argv) { // expected-note {{'argc' defined here}} 116 117 int x, y = argc; // expected-note 2 {{'y' defined here}} 118 static double d1; 119 static double d2; 120 static double d3; // expected-note {{'d3' defined here}} 121 static double d4; 122 static TestClass LocalClass(y); // expected-error {{variable with local storage in initial value of threadprivate variable}} 123 #pragma omp threadprivate(LocalClass) 124 125 d.a = a; 126 d2++; 127 ; 128 #pragma omp threadprivate(argc+y) // expected-error {{expected identifier}} 129 #pragma omp threadprivate(argc,y) // expected-error 2 {{arguments of '#pragma omp threadprivate' must have static storage duration}} 130 #pragma omp threadprivate(d2) // expected-error {{'#pragma omp threadprivate' must precede all references to variable 'd2'}} 131 #pragma omp threadprivate(d1) 132 { 133 ++a;d2=0; 134 #pragma omp threadprivate(d3) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'd3' variable declaration}} 135 } 136 #pragma omp threadprivate(d3) 137 label: 138 #pragma omp threadprivate(d4) // expected-error {{'#pragma omp threadprivate' cannot be an immediate substatement}} 139 140 #pragma omp threadprivate(a) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'a' variable declaration}} 141 return (y); 142 #pragma omp threadprivate(d) // expected-error {{'#pragma omp threadprivate' must appear in the scope of the 'd' variable declaration}} 143 } 144