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