xref: /llvm-project/clang/test/OpenMP/critical_messages.cpp (revision 4e159e4c7b975c4c091e175fde0a340ca643ccd3)
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 non-negative 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 
75   const int omp_lock_hint_none = 0;
76   #pragma omp critical (name3) hint(omp_lock_hint_none)
77   foo();
78   return 0;
79 }
80 
main(int argc,char ** argv)81 int main(int argc, char **argv) { // expected-note {{declared here}}
82   #pragma omp critical
83   ;
84   #pragma omp critical untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp critical'}}
85   #pragma omp critical unknown // expected-warning {{extra tokens at the end of '#pragma omp critical' are ignored}}
86   #pragma omp critical ( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
87   #pragma omp critical ( + // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
88   #pragma omp critical (name2 // expected-error {{expected ')'}} expected-note {{to match this '('}}
89   #pragma omp critical (name1)
90   foo();
91   {
92     #pragma omp critical
93   } // expected-error {{expected statement}}
94   #pragma omp critical (name2) // expected-note {{previous 'critical' region starts here}}
95   #pragma omp critical
96   for (int i = 0; i < 10; ++i) {
97     foo();
98     #pragma omp parallel
99     #pragma omp for
100     for (int j = 0; j < 10; j++) {
101       foo();
102       #pragma omp critical(name2) // expected-error {{cannot nest 'critical' regions having the same name 'name2'}}
103       foo();
104     }
105   }
106   #pragma omp critical (name2)
107   #pragma omp critical
108   for (int i = 0; i < 10; ++i) {
109     foo();
110     #pragma omp parallel
111     #pragma omp for
112     for (int j = 0; j < 10; j++) {
113       #pragma omp critical
114       foo();
115     }
116   }
117   #pragma omp critical (name2)
118   #pragma omp critical
119   for (int i = 0; i < 10; ++i) {
120     foo();
121     #pragma omp parallel
122     #pragma omp for
123     for (int j = 0; j < 10; j++) {
124       #pragma omp critical (nam)
125       foo();
126     }
127   }
128 
129   #pragma omp critical (name2) hint // expected-error {{expected '(' after 'hint'}}
130   foo();
131   #pragma omp critical (name2) hint( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
132   foo();
133   #pragma omp critical (name2) hint(+ // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
134   foo();
135   #pragma omp critical (name2) hint(argc) // expected-error {{integral constant expression}} expected-note 0+{{constant expression}}
136   foo();
137   #pragma omp critical (name) hint(23) // expected-note {{previous 'hint' clause with value '23'}}
138   foo();
139   #pragma omp critical hint(-5) // expected-error {{argument to 'hint' clause must be a non-negative integer value}}
140   foo();
141   #pragma omp critical hint(1) // expected-error {{the name of the construct must be specified in presence of 'hint' clause}}
142   foo();
143   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}}
144 }
145 
foo()146 int foo() {
147   L1: // expected-note {{jump exits scope of OpenMP structured block}}
148     foo();
149   #pragma omp critical
150   {
151     foo();
152     goto L1; // expected-error {{cannot jump from this goto statement to its label}}
153   }
154   goto L2; // expected-error {{cannot jump from this goto statement to its label}}
155   #pragma omp critical
156   {  // expected-note {{jump bypasses OpenMP structured block}}
157     L2:
158     foo();
159   }
160 
161   return 0;
162  }
163