1 // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2 
3 // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4 
5 int foo();
6 
xxx(int argc)7 void xxx(int argc) {
8   int x; // expected-note {{initialize the variable 'x' to silence this warning}}
9 #pragma omp critical
10   argc = x; // expected-warning {{variable 'x' is uninitialized when used here}}
11 }
12 
13 template<typename T, int N>
tmain(int argc,char ** argv)14 int tmain(int argc, char **argv) { // expected-note {{declared here}}
15   #pragma omp critical
16   ;
17   #pragma omp critical untied allocate(argc) // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp critical'}} expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp critical'}}
18   #pragma omp critical unknown // expected-warning {{extra tokens at the end of '#pragma omp critical' are ignored}}
19   #pragma omp critical ( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
20   #pragma omp critical ( + // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
21   #pragma omp critical (name2 // expected-error {{expected ')'}} expected-note {{to match this '('}}
22   #pragma omp critical (name1)
23   foo();
24   {
25     #pragma omp critical
26   } // expected-error {{expected statement}}
27   #pragma omp critical (name2) // expected-note {{previous 'critical' region starts here}}
28   #pragma omp critical
29   for (int i = 0; i < 10; ++i) {
30     foo();
31     #pragma omp parallel
32     #pragma omp for
33     for (int j = 0; j < 10; j++) {
34       foo();
35       #pragma omp critical(name2) // expected-error {{cannot nest 'critical' regions having the same name 'name2'}}
36       foo();
37     }
38   }
39   #pragma omp critical (name2)
40   #pragma omp critical
41   for (int i = 0; i < 10; ++i) {
42     foo();
43     #pragma omp parallel
44     #pragma omp for
45     for (int j = 0; j < 10; j++) {
46       #pragma omp critical
47       foo();
48     }
49   }
50   #pragma omp critical (name2)
51   #pragma omp critical
52   for (int i = 0; i < 10; ++i) {
53     foo();
54     #pragma omp parallel
55     #pragma omp for
56     for (int j = 0; j < 10; j++) {
57       #pragma omp critical (nam)
58       foo();
59     }
60   }
61 
62   #pragma omp critical (name2) hint // expected-error {{expected '(' after 'hint'}}
63   foo();
64   #pragma omp critical (name2) hint( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
65   foo();
66   #pragma omp critical (name2) hint(+ // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
67   foo();
68   #pragma omp critical (name2) hint(argc) // expected-error {{integral constant expression}} expected-note 0+{{constant expression}}
69   foo();
70   #pragma omp critical (name) hint(N) // expected-error {{argument to 'hint' clause must be a strictly positive integer value}} expected-error {{constructs with the same name must have a 'hint' clause with the same value}} expected-note {{'hint' clause with value '4'}}
71   foo();
72   #pragma omp critical hint(N) // expected-error {{the name of the construct must be specified in presence of 'hint' clause}}
73   foo();
74   return 0;
75 }
76 
main(int argc,char ** argv)77 int main(int argc, char **argv) { // expected-note {{declared here}}
78   #pragma omp critical
79   ;
80   #pragma omp critical untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp critical'}}
81   #pragma omp critical unknown // expected-warning {{extra tokens at the end of '#pragma omp critical' are ignored}}
82   #pragma omp critical ( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
83   #pragma omp critical ( + // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
84   #pragma omp critical (name2 // expected-error {{expected ')'}} expected-note {{to match this '('}}
85   #pragma omp critical (name1)
86   foo();
87   {
88     #pragma omp critical
89   } // expected-error {{expected statement}}
90   #pragma omp critical (name2) // expected-note {{previous 'critical' region starts here}}
91   #pragma omp critical
92   for (int i = 0; i < 10; ++i) {
93     foo();
94     #pragma omp parallel
95     #pragma omp for
96     for (int j = 0; j < 10; j++) {
97       foo();
98       #pragma omp critical(name2) // expected-error {{cannot nest 'critical' regions having the same name 'name2'}}
99       foo();
100     }
101   }
102   #pragma omp critical (name2)
103   #pragma omp critical
104   for (int i = 0; i < 10; ++i) {
105     foo();
106     #pragma omp parallel
107     #pragma omp for
108     for (int j = 0; j < 10; j++) {
109       #pragma omp critical
110       foo();
111     }
112   }
113   #pragma omp critical (name2)
114   #pragma omp critical
115   for (int i = 0; i < 10; ++i) {
116     foo();
117     #pragma omp parallel
118     #pragma omp for
119     for (int j = 0; j < 10; j++) {
120       #pragma omp critical (nam)
121       foo();
122     }
123   }
124 
125   #pragma omp critical (name2) hint // expected-error {{expected '(' after 'hint'}}
126   foo();
127   #pragma omp critical (name2) hint( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
128   foo();
129   #pragma omp critical (name2) hint(+ // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
130   foo();
131   #pragma omp critical (name2) hint(argc) // expected-error {{integral constant expression}} expected-note 0+{{constant expression}}
132   foo();
133   #pragma omp critical (name) hint(23) // expected-note {{previous 'hint' clause with value '23'}}
134   foo();
135   #pragma omp critical hint(-5) // expected-error {{argument to 'hint' clause must be a strictly positive integer value}}
136   foo();
137   #pragma omp critical hint(1) // expected-error {{the name of the construct must be specified in presence of 'hint' clause}}
138   foo();
139   return tmain<int, 4>(argc, argv) + tmain<float, -5>(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<float, -5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}}
140 }
141 
foo()142 int foo() {
143   L1: // expected-note {{jump exits scope of OpenMP structured block}}
144     foo();
145   #pragma omp critical
146   {
147     foo();
148     goto L1; // expected-error {{cannot jump from this goto statement to its label}}
149   }
150   goto L2; // expected-error {{cannot jump from this goto statement to its label}}
151   #pragma omp critical
152   {  // expected-note {{jump bypasses OpenMP structured block}}
153     L2:
154     foo();
155   }
156 
157   return 0;
158  }
159