master_taskloop_loop_messages.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. // RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized
  2. // RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized
  3. // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp4 %s -Wuninitialized
  4. // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify=expected,omp5 %s -Wuninitialized
  5. class S {
  6. int a;
  7. S() : a(0) {}
  8. public:
  9. S(int v) : a(v) {}
  10. S(const S &s) : a(s.a) {}
  11. };
  12. static int sii;
  13. // expected-note@+1 {{defined as threadprivate or thread local}}
  14. #pragma omp threadprivate(sii)
  15. static int globalii;
  16. // Currently, we cannot use "0" for global register variables.
  17. // register int reg0 __asm__("0");
  18. int reg0;
  19. int test_iteration_spaces() {
  20. const int N = 100;
  21. float a[N], b[N], c[N];
  22. int ii, jj, kk;
  23. float fii;
  24. double dii;
  25. register int reg; // expected-warning {{'register' storage class specifier is deprecated}}
  26. #pragma omp parallel
  27. #pragma omp master taskloop
  28. for (int i = 0; i < 10; i += 1) {
  29. c[i] = a[i] + b[i];
  30. }
  31. #pragma omp parallel
  32. #pragma omp master taskloop
  33. for (char i = 0; i < 10; i++) {
  34. c[i] = a[i] + b[i];
  35. }
  36. #pragma omp parallel
  37. #pragma omp master taskloop
  38. for (char i = 0; i < 10; i += '\1') {
  39. c[i] = a[i] + b[i];
  40. }
  41. #pragma omp parallel
  42. #pragma omp master taskloop
  43. for (long long i = 0; i < 10; i++) {
  44. c[i] = a[i] + b[i];
  45. }
  46. #pragma omp parallel
  47. // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
  48. #pragma omp master taskloop
  49. for (long long i = 0; i < 10; i += 1.5) {
  50. c[i] = a[i] + b[i];
  51. }
  52. #pragma omp parallel
  53. #pragma omp master taskloop
  54. for (long long i = 0; i < 'z'; i += 1u) {
  55. c[i] = a[i] + b[i];
  56. }
  57. #pragma omp parallel
  58. // expected-error@+2 {{variable must be of integer or random access iterator type}}
  59. #pragma omp master taskloop
  60. for (float fi = 0; fi < 10.0; fi++) {
  61. c[(int)fi] = a[(int)fi] + b[(int)fi];
  62. }
  63. #pragma omp parallel
  64. // expected-error@+2 {{variable must be of integer or random access iterator type}}
  65. #pragma omp master taskloop
  66. for (double fi = 0; fi < 10.0; fi++) {
  67. c[(int)fi] = a[(int)fi] + b[(int)fi];
  68. }
  69. #pragma omp parallel
  70. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  71. #pragma omp master taskloop
  72. for (int &ref = ii; ref < 10; ref++) {
  73. }
  74. #pragma omp parallel
  75. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  76. #pragma omp master taskloop
  77. for (int i; i < 10; i++)
  78. c[i] = a[i];
  79. #pragma omp parallel
  80. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  81. #pragma omp master taskloop
  82. for (int i = 0, j = 0; i < 10; ++i)
  83. c[i] = a[i];
  84. #pragma omp parallel
  85. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  86. #pragma omp master taskloop
  87. for (; ii < 10; ++ii)
  88. c[ii] = a[ii];
  89. #pragma omp parallel
  90. // expected-warning@+3 {{expression result unused}}
  91. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  92. #pragma omp master taskloop
  93. for (ii + 1; ii < 10; ++ii)
  94. c[ii] = a[ii];
  95. #pragma omp parallel
  96. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  97. #pragma omp master taskloop
  98. for (c[ii] = 0; ii < 10; ++ii)
  99. c[ii] = a[ii];
  100. #pragma omp parallel
  101. // Ok to skip parenthesises.
  102. #pragma omp master taskloop
  103. for (((ii)) = 0; ii < 10; ++ii)
  104. c[ii] = a[ii];
  105. #pragma omp parallel
  106. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
  107. #pragma omp master taskloop
  108. for (int i = 0; i; i++)
  109. c[i] = a[i];
  110. #pragma omp parallel
  111. // omp4-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
  112. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
  113. #pragma omp master taskloop
  114. for (int i = 0; jj < kk; ii++)
  115. c[i] = a[i];
  116. #pragma omp parallel
  117. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
  118. #pragma omp master taskloop
  119. for (int i = 0; !!i; i++)
  120. c[i] = a[i];
  121. // Ok
  122. #pragma omp parallel
  123. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
  124. #pragma omp master taskloop
  125. for (int i = 0; i != 1; i++)
  126. c[i] = a[i];
  127. #pragma omp parallel
  128. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
  129. #pragma omp master taskloop
  130. for (int i = 0;; i++)
  131. c[i] = a[i];
  132. #pragma omp parallel
  133. // Ok.
  134. #pragma omp master taskloop
  135. for (int i = 11; i > 10; i--)
  136. c[i] = a[i];
  137. #pragma omp parallel
  138. // Ok.
  139. #pragma omp master taskloop
  140. for (int i = 0; i < 10; ++i)
  141. c[i] = a[i];
  142. #pragma omp parallel
  143. // Ok.
  144. #pragma omp master taskloop
  145. for (ii = 0; ii < 10; ++ii)
  146. c[ii] = a[ii];
  147. #pragma omp parallel
  148. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  149. #pragma omp master taskloop
  150. for (ii = 0; ii < 10; ++jj)
  151. c[ii] = a[jj];
  152. #pragma omp parallel
  153. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  154. #pragma omp master taskloop
  155. for (ii = 0; ii < 10; ++++ii)
  156. c[ii] = a[ii];
  157. #pragma omp parallel
  158. // Ok but undefined behavior (in general, cannot check that incr
  159. // is really loop-invariant).
  160. #pragma omp master taskloop
  161. for (ii = 0; ii < 10; ii = ii + ii)
  162. c[ii] = a[ii];
  163. #pragma omp parallel
  164. // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
  165. #pragma omp master taskloop
  166. for (ii = 0; ii < 10; ii = ii + 1.0f)
  167. c[ii] = a[ii];
  168. #pragma omp parallel
  169. // Ok - step was converted to integer type.
  170. #pragma omp master taskloop
  171. for (ii = 0; ii < 10; ii = ii + (int)1.1f)
  172. c[ii] = a[ii];
  173. #pragma omp parallel
  174. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  175. #pragma omp master taskloop
  176. for (ii = 0; ii < 10; jj = ii + 2)
  177. c[ii] = a[ii];
  178. #pragma omp parallel
  179. // expected-warning@+3 {{relational comparison result unused}}
  180. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  181. #pragma omp master taskloop
  182. for (ii = 0; ii<10; jj> kk + 2)
  183. c[ii] = a[ii];
  184. #pragma omp parallel
  185. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  186. #pragma omp master taskloop
  187. for (ii = 0; ii < 10;)
  188. c[ii] = a[ii];
  189. #pragma omp parallel
  190. // expected-warning@+3 {{expression result unused}}
  191. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  192. #pragma omp master taskloop
  193. for (ii = 0; ii < 10; !ii)
  194. c[ii] = a[ii];
  195. #pragma omp parallel
  196. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  197. #pragma omp master taskloop
  198. for (ii = 0; ii < 10; ii ? ++ii : ++jj)
  199. c[ii] = a[ii];
  200. #pragma omp parallel
  201. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
  202. #pragma omp master taskloop
  203. for (ii = 0; ii < 10; ii = ii < 10)
  204. c[ii] = a[ii];
  205. #pragma omp parallel
  206. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  207. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  208. #pragma omp master taskloop
  209. for (ii = 0; ii < 10; ii = ii + 0)
  210. c[ii] = a[ii];
  211. #pragma omp parallel
  212. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  213. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  214. #pragma omp master taskloop
  215. for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
  216. c[ii] = a[ii];
  217. #pragma omp parallel
  218. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  219. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  220. #pragma omp master taskloop
  221. for (ii = 0; (ii) < 10; ii -= 25)
  222. c[ii] = a[ii];
  223. #pragma omp parallel
  224. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  225. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  226. #pragma omp master taskloop
  227. for (ii = 0; (ii < 10); ii -= 0)
  228. c[ii] = a[ii];
  229. #pragma omp parallel
  230. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  231. // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
  232. #pragma omp master taskloop
  233. for (ii = 0; ii > 10; (ii += 0))
  234. c[ii] = a[ii];
  235. #pragma omp parallel
  236. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  237. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  238. #pragma omp master taskloop
  239. for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii))
  240. c[ii] = a[ii];
  241. #pragma omp parallel
  242. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  243. // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
  244. #pragma omp master taskloop
  245. for ((ii = 0); ii > 10; (ii -= 0))
  246. c[ii] = a[ii];
  247. #pragma omp parallel
  248. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  249. // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
  250. #pragma omp master taskloop
  251. for (ii = 0; (ii < 10); (ii -= 0))
  252. c[ii] = a[ii];
  253. #pragma omp parallel
  254. // expected-note@+2 {{defined as firstprivate}}
  255. // expected-error@+2 {{loop iteration variable in the associated loop of 'omp master taskloop' directive may not be firstprivate, predetermined as private}}
  256. #pragma omp master taskloop firstprivate(ii)
  257. for (ii = 0; ii < 10; ii++)
  258. c[ii] = a[ii];
  259. #pragma omp parallel
  260. // expected-error@+1 {{unexpected OpenMP clause 'linear' in directive '#pragma omp master taskloop'}}
  261. #pragma omp master taskloop linear(ii)
  262. for (ii = 0; ii < 10; ii++)
  263. c[ii] = a[ii];
  264. #pragma omp parallel
  265. #pragma omp master taskloop private(ii)
  266. for (ii = 0; ii < 10; ii++)
  267. c[ii] = a[ii];
  268. #pragma omp parallel
  269. #pragma omp master taskloop lastprivate(ii)
  270. for (ii = 0; ii < 10; ii++)
  271. c[ii] = a[ii];
  272. #pragma omp parallel
  273. {
  274. // expected-error@+2 {{loop iteration variable in the associated loop of 'omp master taskloop' directive may not be threadprivate or thread local, predetermined as private}}
  275. #pragma omp master taskloop
  276. for (sii = 0; sii < 10; sii += 1)
  277. c[sii] = a[sii];
  278. }
  279. #pragma omp parallel
  280. {
  281. #pragma omp master taskloop
  282. for (reg0 = 0; reg0 < 10; reg0 += 1)
  283. c[reg0] = a[reg0];
  284. }
  285. #pragma omp parallel
  286. {
  287. #pragma omp master taskloop
  288. for (reg = 0; reg < 10; reg += 1)
  289. c[reg] = a[reg];
  290. }
  291. #pragma omp parallel
  292. {
  293. #pragma omp master taskloop
  294. for (globalii = 0; globalii < 10; globalii += 1)
  295. c[globalii] = a[globalii];
  296. }
  297. #pragma omp parallel
  298. {
  299. #pragma omp master taskloop collapse(2)
  300. for (ii = 0; ii < 10; ii += 1)
  301. for (globalii = 0; globalii < 10; globalii += 1)
  302. c[globalii] += a[globalii] + ii;
  303. }
  304. #pragma omp parallel
  305. // omp4-error@+2 {{statement after '#pragma omp master taskloop' must be a for loop}}
  306. #pragma omp master taskloop
  307. for (auto &item : a) {
  308. item = item + 1;
  309. }
  310. #pragma omp parallel
  311. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  312. // expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
  313. #pragma omp master taskloop
  314. for (unsigned i = 9; i < 10; i--) {
  315. c[i] = a[i] + b[i];
  316. }
  317. int(*lb)[4] = nullptr;
  318. #pragma omp parallel
  319. #pragma omp master taskloop
  320. for (int(*p)[4] = lb; p < lb + 8; ++p) {
  321. }
  322. #pragma omp parallel
  323. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  324. #pragma omp master taskloop
  325. for (int a{0}; a < 10; ++a) {
  326. }
  327. return 0;
  328. }
  329. // Iterators allowed in openmp for-loops.
  330. namespace std {
  331. struct random_access_iterator_tag {};
  332. template <class Iter>
  333. struct iterator_traits {
  334. typedef typename Iter::difference_type difference_type;
  335. typedef typename Iter::iterator_category iterator_category;
  336. };
  337. template <class Iter>
  338. typename iterator_traits<Iter>::difference_type
  339. distance(Iter first, Iter last) { return first - last; }
  340. }
  341. class Iter0 {
  342. public:
  343. Iter0() {}
  344. Iter0(const Iter0 &) {}
  345. Iter0 operator++() { return *this; }
  346. Iter0 operator--() { return *this; }
  347. bool operator<(Iter0 a) { return true; }
  348. };
  349. // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}}
  350. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}}
  351. int operator-(Iter0 a, Iter0 b) { return 0; }
  352. class Iter1 {
  353. public:
  354. Iter1(float f = 0.0f, double d = 0.0) {}
  355. Iter1(const Iter1 &) {}
  356. Iter1 operator++() { return *this; }
  357. Iter1 operator--() { return *this; }
  358. bool operator<(Iter1 a) { return true; }
  359. bool operator>=(Iter1 a) { return false; }
  360. };
  361. class GoodIter {
  362. public:
  363. GoodIter() {}
  364. GoodIter(const GoodIter &) {}
  365. GoodIter(int fst, int snd) {}
  366. GoodIter &operator=(const GoodIter &that) { return *this; }
  367. GoodIter &operator=(const Iter0 &that) { return *this; }
  368. GoodIter &operator+=(int x) { return *this; }
  369. GoodIter &operator-=(int x) { return *this; }
  370. explicit GoodIter(void *) {}
  371. GoodIter operator++() { return *this; }
  372. GoodIter operator--() { return *this; }
  373. bool operator!() { return true; }
  374. bool operator<(GoodIter a) { return true; }
  375. bool operator<=(GoodIter a) { return true; }
  376. bool operator>=(GoodIter a) { return false; }
  377. typedef int difference_type;
  378. typedef std::random_access_iterator_tag iterator_category;
  379. };
  380. // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}}
  381. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
  382. int operator-(GoodIter a, GoodIter b) { return 0; }
  383. // expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}}
  384. GoodIter operator-(GoodIter a) { return a; }
  385. // expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}}
  386. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
  387. GoodIter operator-(GoodIter a, int v) { return GoodIter(); }
  388. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}}
  389. GoodIter operator+(GoodIter a, int v) { return GoodIter(); }
  390. // expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}}
  391. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}}
  392. GoodIter operator-(int v, GoodIter a) { return GoodIter(); }
  393. // expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}}
  394. GoodIter operator+(int v, GoodIter a) { return GoodIter(); }
  395. int test_with_random_access_iterator() {
  396. GoodIter begin, end;
  397. Iter0 begin0, end0;
  398. #pragma omp parallel
  399. #pragma omp master taskloop
  400. for (GoodIter I = begin; I < end; ++I)
  401. ++I;
  402. #pragma omp parallel
  403. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  404. #pragma omp master taskloop
  405. for (GoodIter &I = begin; I < end; ++I)
  406. ++I;
  407. #pragma omp parallel
  408. #pragma omp master taskloop
  409. for (GoodIter I = begin; I >= end; --I)
  410. ++I;
  411. #pragma omp parallel
  412. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  413. #pragma omp master taskloop
  414. for (GoodIter I(begin); I < end; ++I)
  415. ++I;
  416. #pragma omp parallel
  417. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  418. #pragma omp master taskloop
  419. for (GoodIter I(nullptr); I < end; ++I)
  420. ++I;
  421. #pragma omp parallel
  422. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  423. #pragma omp master taskloop
  424. for (GoodIter I(0); I < end; ++I)
  425. ++I;
  426. #pragma omp parallel
  427. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  428. #pragma omp master taskloop
  429. for (GoodIter I(1, 2); I < end; ++I)
  430. ++I;
  431. #pragma omp parallel
  432. #pragma omp master taskloop
  433. for (begin = GoodIter(0); begin < end; ++begin)
  434. ++begin;
  435. // expected-error@+4 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}}
  436. // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
  437. #pragma omp parallel
  438. #pragma omp master taskloop
  439. for (begin = begin0; begin < end; ++begin)
  440. ++begin;
  441. #pragma omp parallel
  442. // expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  443. #pragma omp master taskloop
  444. for (++begin; begin < end; ++begin)
  445. ++begin;
  446. #pragma omp parallel
  447. #pragma omp master taskloop
  448. for (begin = end; begin < end; ++begin)
  449. ++begin;
  450. #pragma omp parallel
  451. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
  452. #pragma omp master taskloop
  453. for (GoodIter I = begin; I - I; ++I)
  454. ++I;
  455. #pragma omp parallel
  456. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
  457. #pragma omp master taskloop
  458. for (GoodIter I = begin; begin < end; ++I)
  459. ++I;
  460. #pragma omp parallel
  461. // omp4-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} omp5-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'I'}}
  462. #pragma omp master taskloop
  463. for (GoodIter I = begin; !I; ++I)
  464. ++I;
  465. #pragma omp parallel
  466. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  467. // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  468. #pragma omp master taskloop
  469. for (GoodIter I = begin; I >= end; I = I + 1)
  470. ++I;
  471. #pragma omp parallel
  472. #pragma omp master taskloop
  473. for (GoodIter I = begin; I >= end; I = I - 1)
  474. ++I;
  475. #pragma omp parallel
  476. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
  477. #pragma omp master taskloop
  478. for (GoodIter I = begin; I >= end; I = -I)
  479. ++I;
  480. #pragma omp parallel
  481. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  482. // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  483. #pragma omp master taskloop
  484. for (GoodIter I = begin; I >= end; I = 2 + I)
  485. ++I;
  486. #pragma omp parallel
  487. // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
  488. #pragma omp master taskloop
  489. for (GoodIter I = begin; I >= end; I = 2 - I)
  490. ++I;
  491. // In the following example, we cannot update the loop variable using '+='
  492. // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
  493. #pragma omp parallel
  494. #pragma omp master taskloop
  495. for (Iter0 I = begin0; I < end0; ++I)
  496. ++I;
  497. #pragma omp parallel
  498. // Initializer is constructor without params.
  499. // expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
  500. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  501. #pragma omp master taskloop
  502. for (Iter0 I; I < end0; ++I)
  503. ++I;
  504. Iter1 begin1, end1;
  505. // expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'Iter1')}}
  506. // expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
  507. #pragma omp parallel
  508. #pragma omp master taskloop
  509. for (Iter1 I = begin1; I < end1; ++I)
  510. ++I;
  511. #pragma omp parallel
  512. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  513. // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  514. #pragma omp master taskloop
  515. for (Iter1 I = begin1; I >= end1; ++I)
  516. ++I;
  517. #pragma omp parallel
  518. // expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}}
  519. // expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
  520. // Initializer is constructor with all default params.
  521. // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
  522. #pragma omp master taskloop
  523. for (Iter1 I; I < end1; ++I) {
  524. }
  525. return 0;
  526. }
  527. template <typename IT, int ST>
  528. class TC {
  529. public:
  530. int dotest_lt(IT begin, IT end) {
  531. #pragma omp parallel
  532. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  533. // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
  534. #pragma omp master taskloop
  535. for (IT I = begin; I < end; I = I + ST) {
  536. ++I;
  537. }
  538. #pragma omp parallel
  539. // expected-note@+3 {{loop step is expected to be positive due to this condition}}
  540. // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
  541. #pragma omp master taskloop
  542. for (IT I = begin; I <= end; I += ST) {
  543. ++I;
  544. }
  545. #pragma omp parallel
  546. #pragma omp master taskloop
  547. for (IT I = begin; I < end; ++I) {
  548. ++I;
  549. }
  550. }
  551. static IT step() {
  552. return IT(ST);
  553. }
  554. };
  555. template <typename IT, int ST = 0>
  556. int dotest_gt(IT begin, IT end) {
  557. #pragma omp parallel
  558. // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
  559. // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  560. #pragma omp master taskloop
  561. for (IT I = begin; I >= end; I = I + ST) {
  562. ++I;
  563. }
  564. #pragma omp parallel
  565. // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
  566. // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  567. #pragma omp master taskloop
  568. for (IT I = begin; I >= end; I += ST) {
  569. ++I;
  570. }
  571. #pragma omp parallel
  572. // expected-note@+3 {{loop step is expected to be negative due to this condition}}
  573. // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
  574. #pragma omp master taskloop
  575. for (IT I = begin; I >= end; ++I) {
  576. ++I;
  577. }
  578. #pragma omp parallel
  579. #pragma omp master taskloop
  580. for (IT I = begin; I < end; I += TC<int, ST>::step()) {
  581. ++I;
  582. }
  583. }
  584. void test_with_template() {
  585. GoodIter begin, end;
  586. TC<GoodIter, 100> t1;
  587. TC<GoodIter, -100> t2;
  588. t1.dotest_lt(begin, end);
  589. t2.dotest_lt(begin, end); // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
  590. dotest_gt(begin, end); // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
  591. dotest_gt<unsigned, 10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, 10>' requested here}}
  592. }
  593. void test_loop_break() {
  594. const int N = 100;
  595. float a[N], b[N], c[N];
  596. #pragma omp parallel
  597. #pragma omp master taskloop
  598. for (int i = 0; i < 10; i++) {
  599. c[i] = a[i] + b[i];
  600. for (int j = 0; j < 10; ++j) {
  601. if (a[i] > b[j])
  602. break; // OK in nested loop
  603. }
  604. switch (i) {
  605. case 1:
  606. b[i]++;
  607. break;
  608. default:
  609. break;
  610. }
  611. if (c[i] > 10)
  612. break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
  613. if (c[i] > 11)
  614. break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
  615. }
  616. #pragma omp parallel
  617. #pragma omp master taskloop
  618. for (int i = 0; i < 10; i++) {
  619. for (int j = 0; j < 10; j++) {
  620. c[i] = a[i] + b[i];
  621. if (c[i] > 10) {
  622. if (c[i] < 20) {
  623. break; // OK
  624. }
  625. }
  626. }
  627. }
  628. }
  629. void test_loop_eh() {
  630. const int N = 100;
  631. float a[N], b[N], c[N];
  632. #pragma omp parallel
  633. #pragma omp master taskloop
  634. for (int i = 0; i < 10; i++) {
  635. c[i] = a[i] + b[i];
  636. try {
  637. for (int j = 0; j < 10; ++j) {
  638. if (a[i] > b[j])
  639. throw a[i];
  640. }
  641. throw a[i];
  642. } catch (float f) {
  643. if (f > 0.1)
  644. throw a[i];
  645. return; // expected-error {{cannot return from OpenMP region}}
  646. }
  647. switch (i) {
  648. case 1:
  649. b[i]++;
  650. break;
  651. default:
  652. break;
  653. }
  654. for (int j = 0; j < 10; j++) {
  655. if (c[i] > 10)
  656. throw c[i];
  657. }
  658. }
  659. if (c[9] > 10)
  660. throw c[9]; // OK
  661. #pragma omp parallel
  662. #pragma omp master taskloop
  663. for (int i = 0; i < 10; ++i) {
  664. struct S {
  665. void g() { throw 0; }
  666. };
  667. }
  668. }
  669. void test_loop_firstprivate_lastprivate() {
  670. S s(4);
  671. #pragma omp parallel
  672. #pragma omp master taskloop lastprivate(s) firstprivate(s)
  673. for (int i = 0; i < 16; ++i)
  674. ;
  675. }