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