taskloop_simd_loop_messages.cpp 27 KB

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