xref: /llvm-project/clang/test/OpenMP/scan_messages.cpp (revision 8bd06d5b65845e5e01dd899a2deb773580460b89)
1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 150 %s
2 
3 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 150 %s
4 
5 template <class T>
tmain()6 T tmain() {
7   static T argc;
8 #pragma omp for
9   for (int i = 0; i < 10; ++i) {
10 #pragma omp scan // expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
11     ;
12   }
13 #pragma omp for
14   for (int i = 0; i < 10; ++i) {
15 #pragma omp scan allocate(argc)  // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp scan'}} expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
16 #pragma omp scan untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp scan'}} expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
17 #pragma omp scan unknown // expected-warning {{extra tokens at the end of '#pragma omp scan' are ignored}} expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
18   }
19 #pragma omp for simd reduction(inscan, +: argc)
20   for (int i = 0; i < 10; ++i)
21     if (argc)
22 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
23     if (argc) {
24 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
25     }
26 #pragma omp simd reduction(inscan, +: argc)
27   for (int i = 0; i < 10; ++i)
28   while (argc)
29 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
30     while (argc) {
31 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
32     }
33 #pragma omp simd reduction(inscan, +: argc)
34   for (int i = 0; i < 10; ++i)
35   do
36 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
37     while (argc)
38       ;
39 #pragma omp simd reduction(inscan, +: argc) // expected-error {{the inscan reduction list item must appear as a list item in an 'inclusive' or 'exclusive' clause on an inner 'omp scan' directive}}
40   for (int i = 0; i < 10; ++i)
41   do {
42 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
43   } while (argc);
44 #pragma omp simd reduction(inscan, +: argc)
45   for (int i = 0; i < 10; ++i)
46   switch (argc)
47 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
48     switch (argc)
49     case 1:
50 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
51   switch (argc)
52   case 1: {
53 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
54   }
55 #pragma omp simd reduction(inscan, +: argc) // expected-error {{the inscan reduction list item must appear as a list item in an 'inclusive' or 'exclusive' clause on an inner 'omp scan' directive}}
56   for (int i = 0; i < 10; ++i)
57   switch (argc) {
58 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
59   case 1:
60 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} \
61                                     expected-error{{'#pragma omp scan' cannot be an immediate substatement}}
62     break;
63   default: {
64 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
65   } break;
66   }
67 #pragma omp simd reduction(inscan, +: argc)
68   for (int i = 0; i < 10; ++i)
69   for (;;)
70 #pragma omp scan exclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
71     for (;;) {
72 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
73     }
74 #pragma omp simd reduction(inscan, +: argc)
75   for (int i = 0; i < 10; ++i) {
76 label:
77 #pragma omp scan exclusive(argc) // expected-error{{'#pragma omp scan' cannot be an immediate substatement}}
78   }
79 #pragma omp simd reduction(inscan, +: argc)
80   for (int i = 0; i < 10; ++i) {
81 #pragma omp scan inclusive(argc) // expected-note {{previous 'scan' directive used here}}
82 #pragma omp scan inclusive(argc) // expected-error {{exactly one 'scan' directive must appear in the loop body of an enclosing directive}}
83 label1 : {
84 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
85 }}
86 
87   return T();
88 }
89 
main()90 int main() {
91   static int argc;
92 #pragma omp simd reduction(inscan, +: argc)
93   for (int i = 0; i < 10; ++i) {
94 #pragma omp scan inclusive(argc) inclusive(argc) // expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
95   ;
96   }
97 #pragma omp simd reduction(inscan, +: argc)
98   for (int i = 0; i < 10; ++i) {
99 #pragma omp scan exclusive(argc) inclusive(argc) // expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
100   ;
101   }
102 #pragma omp simd reduction(inscan, +: argc)
103   for (int i = 0; i < 10; ++i) {
104 #pragma omp scan exclusive(argc) exclusive(argc) // expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
105   ;
106   }
107 #pragma omp simd reduction(inscan, +: argc) // expected-error {{the inscan reduction list item must appear as a list item in an 'inclusive' or 'exclusive' clause on an inner 'omp scan' directive}}
108   for (int i = 0; i < 10; ++i) {
109 #pragma omp scan untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp scan'}} expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
110 #pragma omp scan unknown // expected-warning {{extra tokens at the end of '#pragma omp scan' are ignored}} expected-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}}
111   }
112 #pragma omp simd reduction(inscan, +: argc)
113   for (int i = 0; i < 10; ++i)
114   if (argc)
115 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
116     if (argc) {
117 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} expected-error {{the list item must appear in 'reduction' clause with the 'inscan' modifier of the parent directive}}
118     }
119 #pragma omp simd reduction(inscan, +: argc)
120   for (int i = 0; i < 10; ++i)
121   while (argc)
122 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
123     while (argc) {
124 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} expected-error {{the list item must appear in 'reduction' clause with the 'inscan' modifier of the parent directive}}
125     }
126 #pragma omp simd reduction(inscan, +: argc)
127   for (int i = 0; i < 10; ++i)
128   do
129 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
130     while (argc)
131       ;
132 #pragma omp simd reduction(inscan, +: argc)
133   for (int i = 0; i < 10; ++i)
134   do {
135 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
136   } while (argc);
137 #pragma omp simd reduction(inscan, +: argc)
138   for (int i = 0; i < 10; ++i)
139   switch (argc)
140 #pragma omp scan exclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
141     switch (argc)
142     case 1:
143 #pragma omp scan exclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} expected-error {{the list item must appear in 'reduction' clause with the 'inscan' modifier of the parent directive}}
144   switch (argc)
145   case 1: {
146 #pragma omp scan exclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} expected-error {{the list item must appear in 'reduction' clause with the 'inscan' modifier of the parent directive}}
147   }
148 #pragma omp simd reduction(inscan, +: argc)
149   for (int i = 0; i < 10; ++i)
150   switch (argc) {
151 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
152   case 1:
153 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} \
154                                     expected-error{{'#pragma omp scan' cannot be an immediate substatement}}
155     break;
156   default: {
157 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
158   } break;
159   }
160 #pragma omp simd reduction(inscan, +: argc)
161   for (int i = 0; i < 10; ++i)
162   for (;;)
163 #pragma omp scan inclusive(argc) // expected-error {{'#pragma omp scan' cannot be an immediate substatement}} expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
164     for (;;) {
165 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}} expected-error {{the list item must appear in 'reduction' clause with the 'inscan' modifier of the parent directive}}
166     }
167 #pragma omp simd reduction(inscan, +: argc)
168   for (int i = 0; i < 10; ++i) {
169 label:
170 #pragma omp scan inclusive(argc) // expected-error{{'#pragma omp scan' cannot be an immediate substatement}}
171   }
172 #pragma omp simd reduction(inscan, +: argc)
173   for (int i = 0; i < 10; ++i) {
174 #pragma omp scan inclusive(argc) // expected-note {{previous 'scan' directive used here}}
175 #pragma omp scan inclusive(argc) // expected-error {{exactly one 'scan' directive must appear in the loop body of an enclosing directive}}
176 label1 : {
177 #pragma omp scan inclusive(argc) // expected-error {{orphaned 'omp scan' directives are prohibited; perhaps you forget to enclose the directive into a for, simd, for simd, parallel for, or parallel for simd region?}}
178 }
179 }
180 
181   return tmain<int>(); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}}
182 }
183