blob: 4ac27a349a0168b11f3adcad39e79cb8cbcb13ea [file] [log] [blame]
// PR c++/50060
// { dg-do compile { target c++14 } }
// sincos and lgamma_r aren't available in -std=c++14,
// only in -std=gnu++14. Use __builtin_* in that case.
extern "C" void sincos (double, double *, double *);
extern "C" double frexp (double, int *);
extern "C" double modf (double, double *);
extern "C" double remquo (double, double, int *);
extern "C" double lgamma_r (double, int *);
constexpr double
f0 (double x)
{
double y {};
double z {};
__builtin_sincos (x, &y, &z);
return y;
}
constexpr double
f1 (double x)
{
double y {};
double z {};
__builtin_sincos (x, &y, &z);
return z;
}
constexpr double
f2 (double x)
{
int y {};
return frexp (x, &y);
}
constexpr int
f3 (double x)
{
int y {};
frexp (x, &y);
return y;
}
constexpr double
f4 (double x)
{
double y {};
return modf (x, &y);
}
constexpr double
f5 (double x)
{
double y {};
modf (x, &y);
return y;
}
constexpr double
f6 (double x, double y)
{
int z {};
return remquo (x, y, &z);
}
constexpr int
f7 (double x, double y)
{
int z {};
remquo (x, y, &z);
return z;
}
constexpr double
f8 (double x)
{
int y {};
return __builtin_lgamma_r (x, &y);
}
constexpr int
f9 (double x)
{
int y {};
__builtin_lgamma_r (x, &y);
return y;
}
static_assert (f0 (0.0) == 0.0, "");
static_assert (f1 (0.0) == 1.0, "");
static_assert (f2 (6.5) == 0.8125, "");
static_assert (f3 (6.5) == 3, "");
static_assert (f4 (-7.25) == -0.25, "");
static_assert (f5 (-7.25) == -7.0, "");
static_assert (f6 (3.0, 2.0) == -1.0, "");
static_assert (f7 (3.0, 2.0) == 2, "");
static_assert (f8 (0.75) >= 0.20 && f8 (0.75) <= 0.21, "");
static_assert (f8 (0.75) >= 0.20 && f8 (0.75) <= 0.21, "");
static_assert (f9 (0.75) == 1, "");