1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 %s
24fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
34fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid foo() {
44fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
54fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
64fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevbool foobool(int argc) {
74fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return argc;
84fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
94fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
104fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevstruct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}}
114fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevextern S1 a;
124fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass S2 {
134fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  mutable int a;
144fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
154fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S2():a(0) { }
16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static float S2s; // expected-note {{static data member is predetermined as shared}}
174fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
184fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevconst S2 b;
194fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevconst S2 ba[5];
204fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass S3 {
214fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  int a;
224fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
234fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S3():a(0) { }
244fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
25ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S3 c; // expected-note {{global variable is predetermined as shared}}
26ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S3 ca[5]; // expected-note {{global variable is predetermined as shared}}
27ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesextern const int f; // expected-note {{global variable is predetermined as shared}}
284fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass S4 { // expected-note {{'S4' declared here}}
294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  int a;
304fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S4();
314fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
324fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S4(int v):a(v) { }
334fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
344fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass S5 { // expected-note {{'S5' declared here}}
354fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  int a;
364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S5():a(0) {}
374fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
384fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S5(int v):a(v) { }
394fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
404fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
410c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevint threadvar;
420c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev#pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}}
430c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev
444fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevint main(int argc, char **argv) {
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int d = 5; // expected-note {{constant variable is predetermined as shared}}
46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S4 e(4); // expected-note {{'e' defined here}}
484fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  S5 g(5); // expected-note {{'g' defined here}}
494fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  int i;
504fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  int &j = i; // expected-note {{'j' defined here}}
514fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private // expected-error {{expected '(' after 'private'}}
524fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
534fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private () // expected-error {{expected expression}}
544fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
554fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
564fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (S1) // expected-error {{'S1' does not refer to a value}}
590c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  #pragma omp parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}}
604fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private (argv[1]) // expected-error {{expected variable name}}
614fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private(ba)
620c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  #pragma omp parallel private(ca) // expected-error {{shared variable cannot be private}}
630c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  #pragma omp parallel private(da) // expected-error {{shared variable cannot be private}}
640c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  #pragma omp parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private(e, g) // expected-error 2 {{private variable must have an accessible, unambiguous default constructor}}
660c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  #pragma omp parallel private(threadvar) // expected-error {{threadprivate or thread local variable cannot be private}}
67d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  #pragma omp parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
68d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  foo();
69d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  #pragma omp parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  foo();
714fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private(i)
724fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  #pragma omp parallel private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type 'int &'}}
734fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  foo();
74d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  #pragma omp parallel firstprivate(i)
75d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  for (int k = 0; k < 10; ++k) {
76d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev    #pragma omp parallel private(i)
77d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev    foo();
78d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  }
794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
804fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return 0;
814fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
82