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