1// PR c++/ 2// { dg-do run } 3// { dg-options "-std=c++0x -fopenmp" } 4 5extern "C" void abort (); 6int cnt; 7 8template <typename T> 9void 10f0 (T, int) 11{ 12 abort (); 13} 14 15template <> 16void 17f0<int> (int, int type) 18{ 19 if (type != 0) 20 abort (); 21#pragma omp atomic 22 cnt++; 23} 24 25template <> 26void 27f0<const char *> (const char *, int type) 28{ 29 if (type != 1) 30 abort (); 31#pragma omp atomic 32 cnt++; 33} 34 35template <typename T> 36void 37f1 () 38{ 39#pragma omp parallel for 40 for (auto i = 0; i < 10; i++) 41 f0 (i, 0); 42} 43 44template <typename T> 45void 46f2 () 47{ 48#pragma omp parallel for 49 for (auto i = T (0); i < T (10); i += T (1)) 50 f0 (i, 0); 51} 52 53void 54f3 () 55{ 56#pragma omp parallel for 57 for (auto i = 0; i < 10; i++) 58 f0 (i, 0); 59} 60 61const char *p = "abcdefghij"; 62 63template <typename T> 64void 65f4 () 66{ 67#pragma omp parallel for 68 for (auto i = p; i < p + 10; i++) 69 f0 (i, 1); 70} 71 72template <typename T> 73void 74f5 () 75{ 76#pragma omp parallel for 77 for (auto i = T (p); i < T (p + 10); i++) 78 f0 (i, 1); 79} 80 81void 82f6 () 83{ 84#pragma omp parallel for 85 for (auto i = p; i < p + 10; i++) 86 f0 (i, 1); 87} 88 89int 90main () 91{ 92 f1<int> (); 93 if (cnt != 10) 94 abort (); 95 f2<int> (); 96 if (cnt != 20) 97 abort (); 98 f3 (); 99 if (cnt != 30) 100 abort (); 101 f4<int> (); 102 if (cnt != 40) 103 abort (); 104 f5<const char *> (); 105 if (cnt != 50) 106 abort (); 107 f6 (); 108 if (cnt != 60) 109 abort (); 110} 111