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