1 // RUN: %clang_cc1 -verify -fopenmp %s 2 3 void foo() { 4 } 5 6 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} expected-note 1 {{forward declaration of 'S1'}} expected-note {{forward declaration of 'S1'}} 7 extern S1 a; 8 class S2 { 9 mutable int a; 10 11 public: 12 S2() : a(0) {} 13 static float S2s; // expected-note {{static data member is predetermined as shared}} expected-note 1 {{static data member is predetermined as shared}} 14 }; 15 const S2 b; 16 const S2 ba[5]; 17 class S3 { 18 int a; 19 20 public: 21 S3() : a(0) {} 22 }; 23 const S3 c; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 24 const S3 ca[5]; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 25 extern const int f; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 26 27 int threadvar; 28 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} 29 30 class S4 { 31 int a; 32 S4(); // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 33 34 public: 35 S4(int v) : a(v) {} 36 }; 37 class S5 { 38 int a; 39 S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 40 41 public: 42 S5(int v) : a(v) {} 43 }; 44 namespace A { 45 double x; 46 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} expected-note 2 {{defined as threadprivate or thread local}} 47 } 48 namespace B { 49 using A::x; 50 } 51 52 S3 h; 53 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 54 55 template <class I, class C, class D, class E> 56 int foomain(I argc, C **argv) { 57 const I d = 5; // expected-note {{constant variable is predetermined as shared}} 58 const I da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}} 59 D e(4); 60 E g[] = {5, 6}; 61 I i; 62 I &j = i; 63 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 64 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 65 #pragma omp target parallel private() // expected-error {{expected expression}} 66 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 67 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 68 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 69 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 70 #pragma omp target parallel private(argc) 71 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 72 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 73 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}} 74 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 75 #pragma omp target parallel private(ba) 76 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}} 77 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}} 78 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 79 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 80 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 81 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 82 foo(); 83 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 84 foo(); 85 #pragma omp target parallel private(i) 86 #pragma omp target parallel private(j) 87 foo(); 88 #pragma omp parallel firstprivate(i) 89 for (int k = 0; k < 10; ++k) { 90 #pragma omp target parallel private(i) 91 foo(); 92 } 93 static int m; 94 #pragma omp target parallel private(m) // OK 95 foo(); 96 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 97 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 98 #pragma omp parallel 99 { 100 int v = 0; 101 int i; 102 #pragma omp target parallel private(i) 103 {} 104 } 105 #pragma omp target parallel shared(i) 106 #pragma omp target parallel private(i) 107 #pragma omp target parallel private(j) 108 #pragma omp target parallel private(i) 109 {} 110 static int si; 111 #pragma omp target parallel private(si) // OK 112 {} 113 return 0; 114 } 115 116 void bar(S4 a[2]) { 117 #pragma omp parallel 118 #pragma omp target parallel private(a) 119 {} 120 } 121 122 int main(int argc, char **argv) { 123 const int d = 5; // expected-note {{constant variable is predetermined as shared}} 124 const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}} 125 S4 e(4); 126 S5 g[] = {5, 6}; 127 int i; 128 int &j = i; 129 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 130 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 131 #pragma omp target parallel private() // expected-error {{expected expression}} 132 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 133 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 134 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 135 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 136 #pragma omp target parallel private(argc) 137 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 138 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 139 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}} 140 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 141 #pragma omp target parallel private(ba) 142 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}} 143 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}} 144 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 145 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 146 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 147 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 148 foo(); 149 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 150 foo(); 151 #pragma omp target parallel private(i) 152 #pragma omp target parallel private(j) 153 foo(); 154 #pragma omp parallel firstprivate(i) 155 for (int k = 0; k < 10; ++k) { 156 #pragma omp target parallel private(i) 157 foo(); 158 } 159 static int m; 160 #pragma omp target parallel private(m) // OK 161 foo(); 162 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 163 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 164 #pragma omp parallel 165 { 166 int i; 167 #pragma omp target parallel private(i) 168 {} 169 } 170 #pragma omp target parallel shared(i) 171 #pragma omp target parallel private(i) 172 #pragma omp target parallel private(j) 173 #pragma omp target parallel private(i) 174 {} 175 static int si; 176 #pragma omp target parallel private(si) // OK 177 {} 178 return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}} 179 } 180 181