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