for-6.C 1.3 KB

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