2014-04-07 Charles Baylis <charles.baylis@linaro.org>
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr58369.C
blob9284e2ca7684a04d183e72ab2570d9aac477e406
1 // { dg-do compile }
2 // Reduced from boost-1.54
4 int pow(int, int);
5 int sqrt(int);
7 class PolicyA { };
9 template <class>
10 int max_value() { return 0x7fffffff; }
12 template <class>
13 int min_value() { return 1; }
15 void raise_denorm_error();
17 template <class T>
18 void raise_domain_error(int, int, const T &, const PolicyA &);
20 template <class>
21 int check_overflow(long double p1) {
22   long double __trans_tmp_2 = __builtin_fabsl(p1);
23   if (__trans_tmp_2 > max_value<int>())
24     return 1;
25   return 0;
28 template <class>
29 int check_underflow(long double p1) {
30   if (p1 && (double)p1)
31     return 1;
32   return 0;
35 template <class>
36 int check_denorm(long double p1) {
37   long double __trans_tmp_3 = __builtin_fabsl(p1);
38   if (__trans_tmp_3 < min_value<int>() && (double)p1) {
39     raise_denorm_error();
40     return 1;
41   }
42   return 0;
45 template <class, class>
46 double checked_narrowing_cast(long double p1) {
47   if (check_overflow<int>(p1))
48     return 0;
49   if (check_underflow<int>(p1))
50     return 0;
51   if (check_denorm<int>(p1))
52     return 0;
53   return (double)p1;
56 long double ellint_rf_imp(long double, long double, long double);
58 template <typename T, typename Policy>
59 T ellint_rj_imp(T p1, T p2, T p3, T p4, Policy &p5) {
60   T value, tolerance, P, S3;
61   if (p4)
62     return 0;
63   if (p3 || p1)
64     raise_domain_error(0, 0, 0, p5);
65   tolerance = pow(0, 0);
66   if (p4) {
67     T q = -p4;
68     {
69       long double q6 = ellint_rj_imp((long double)p1, (long double)(double)p2, (long double)(double)p3, (long double)(int)0, p5);
70       value = checked_narrowing_cast<T, int>(q6);
71     }
72     {
73       long double q7 = ellint_rf_imp((long double)p1, (long double)(double)p2, (long double)(double)p3);
74       value -= checked_narrowing_cast<T, const int>(q7);
75     }
76     value += p1 * p3 + p4 * q;
77     return value;
78   }
79   do {
80     P = p4 / p1;
81     if (0 < tolerance)
82       break;
83     sqrt(p3);
84   } while (1);
85   S3 = P * p2 * 0;
86   value = S3 / p1;
87   return value;
90 template <typename Policy>
91 void ellint_pi_imp4(double, double p3, Policy &p4) {
92   double x, y, z;
93   ellint_rj_imp(x, y, z, p3, p4);
96 template <typename Policy>
97 double ellint_pi_imp5(double, double p3, double p4, Policy &p5) {
98   double x, y, z, p;
99   if (p3 > 0)
100     return 0;
101   ellint_rj_imp(x, y, z, p, p5);
102   ellint_pi_imp4((double)0, p4, p5);
105 void boost_ellint_3f() {
106   PolicyA p4;
107   ellint_pi_imp5((double)0, (double)0, (double)0, p4);