| // PR c++/38348 | |
| // { dg-do run } | |
| extern "C" void abort (); | |
| int cnt; | |
| template <typename T> | |
| void | |
| f0 (T, int) | |
| { | |
| abort (); | |
| } | |
| template <> | |
| void | |
| f0<int> (int, int type) | |
| { | |
| if (type != 0) | |
| abort (); | |
| #pragma omp atomic | |
| cnt++; | |
| } | |
| template <> | |
| void | |
| f0<const char *> (const char *, int type) | |
| { | |
| if (type != 1) | |
| abort (); | |
| #pragma omp atomic | |
| cnt++; | |
| } | |
| template <typename T> | |
| void | |
| f1 () | |
| { | |
| #pragma omp parallel for | |
| for (int i = 0; i < 10; i++) | |
| f0 (i, 0); | |
| } | |
| template <typename T> | |
| void | |
| f2 () | |
| { | |
| #pragma omp parallel for | |
| for (T i = T (0); i < T (10); i += T (1)) | |
| f0 (i, 0); | |
| } | |
| void | |
| f3 () | |
| { | |
| #pragma omp parallel for | |
| for (int i = 0; i < 10; i++) | |
| f0 (i, 0); | |
| } | |
| const char *p = "abcdefghij"; | |
| template <typename T> | |
| void | |
| f4 () | |
| { | |
| #pragma omp parallel for | |
| for (const char *i = p; i < p + 10; i += 1) | |
| f0 (i, 1); | |
| } | |
| template <typename T> | |
| void | |
| f5 () | |
| { | |
| #pragma omp parallel for | |
| for (T i = T (p); i < T (p + 10); i += 1) | |
| f0 (i, 1); | |
| } | |
| void | |
| f6 () | |
| { | |
| #pragma omp parallel for | |
| for (const char *i = p; i < p + 10; i++) | |
| f0 (i, 1); | |
| } | |
| int | |
| main () | |
| { | |
| f1<int> (); | |
| if (cnt != 10) | |
| abort (); | |
| f2<int> (); | |
| if (cnt != 20) | |
| abort (); | |
| f3 (); | |
| if (cnt != 30) | |
| abort (); | |
| f4<int> (); | |
| if (cnt != 40) | |
| abort (); | |
| f5<const char *> (); | |
| if (cnt != 50) | |
| abort (); | |
| f6 (); | |
| if (cnt != 60) | |
| abort (); | |
| } |