aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/c_global/cmath259
-rw-r--r--libstdc++-v3/include/tr1/cmath257
-rw-r--r--libstdc++-v3/testsuite/26_numerics/headers/cmath/overloads_c++0x_neg.cc65
-rw-r--r--libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/overloads_neg.cc66
5 files changed, 389 insertions, 270 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index af2f9b9..0ba7118 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2011-05-09 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/48933
+ * include/c_global/cmath (acosh, asinh, atanh, cbrt, copysign,
+ erf, erfc, exp2, expm1, fdim, fma, fmax, hypot, ilogb, lgamma,
+ llrint, llround, log1p, log2, logb, lrint, lround, nearbyint,
+ nextafter, nexttoward, remainder, remquo, rint, round, scalbln,
+ scalbn, tgamma, trunc): Use __enable_if on the return type.
+ * include/tr1/cmath: Likewise.
+ * testsuite/26_numerics/headers/cmath/overloads_c++0x_neg.cc: New.
+ * testsuite/tr1/8_c_compatibility/cmath/overloads_neg.cc: Likewise.
+
2011-05-07 François Dumont <francois.cppdevs@free.fr>
* include/debug/macro.h (_GLIBCXX_DEBUG_VERIFY_AT): New.
diff --git a/libstdc++-v3/include/c_global/cmath b/libstdc++-v3/include/c_global/cmath
index a333eb5..e38ab9d 100644
--- a/libstdc++-v3/include/c_global/cmath
+++ b/libstdc++-v3/include/c_global/cmath
@@ -1,7 +1,7 @@
// -*- C++ -*- C forwarding header.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-// 2006, 2007, 2008, 2009, 2010
+// 2006, 2007, 2008, 2009, 2010, 2011
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -1120,12 +1120,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_acoshl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
acosh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return acosh(__type(__x));
- }
+ { return __builtin_acosh(__x); }
inline float
asinh(float __x)
@@ -1136,12 +1134,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_asinhl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
asinh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return asinh(__type(__x));
- }
+ { return __builtin_asinh(__x); }
inline float
atanh(float __x)
@@ -1152,12 +1148,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_atanhl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
atanh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return atanh(__type(__x));
- }
+ { return __builtin_atanh(__x); }
inline float
cbrt(float __x)
@@ -1168,12 +1162,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_cbrtl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
cbrt(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return cbrt(__type(__x));
- }
+ { return __builtin_cbrt(__x); }
inline float
copysign(float __x, float __y)
@@ -1184,7 +1176,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_copysignl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
copysign(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1200,12 +1196,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_erfl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
erf(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return erf(__type(__x));
- }
+ { return __builtin_erf(__x); }
inline float
erfc(float __x)
@@ -1216,12 +1210,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_erfcl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
erfc(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return erfc(__type(__x));
- }
+ { return __builtin_erfc(__x); }
inline float
exp2(float __x)
@@ -1232,12 +1224,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_exp2l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
exp2(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return exp2(__type(__x));
- }
+ { return __builtin_exp2(__x); }
inline float
expm1(float __x)
@@ -1248,12 +1238,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_expm1l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
expm1(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return expm1(__type(__x));
- }
+ { return __builtin_expm1(__x); }
inline float
fdim(float __x, float __y)
@@ -1264,7 +1252,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fdiml(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fdim(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1280,7 +1272,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fmal(__x, __y, __z); }
template<typename _Tp, typename _Up, typename _Vp>
- inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
+ inline
+ typename __gnu_cxx::__promote_3<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value
+ && __is_arithmetic<_Vp>::__value,
+ _Tp>::__type, _Up, _Vp>::__type
fma(_Tp __x, _Up __y, _Vp __z)
{
typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
@@ -1296,7 +1293,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fmaxl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fmax(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1312,7 +1313,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fminl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fmin(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1328,8 +1333,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_hypotl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
- hypot(_Tp __x, _Up __y)
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
+ hypot(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
return hypot(__type(__x), __type(__y));
@@ -1344,12 +1353,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_ilogbl(__x); }
template<typename _Tp>
- inline int
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ int>::__type
ilogb(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return ilogb(__type(__x));
- }
+ { return __builtin_ilogb(__x); }
inline float
lgamma(float __x)
@@ -1360,12 +1367,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lgammal(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
lgamma(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lgamma(__type(__x));
- }
+ { return __builtin_lgamma(__x); }
inline long long
llrint(float __x)
@@ -1376,12 +1381,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_llrintl(__x); }
template<typename _Tp>
- inline long long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long long>::__type
llrint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return llrint(__type(__x));
- }
+ { return __builtin_llrint(__x); }
inline long long
llround(float __x)
@@ -1392,12 +1395,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_llroundl(__x); }
template<typename _Tp>
- inline long long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long long>::__type
llround(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return llround(__type(__x));
- }
+ { return __builtin_llround(__x); }
inline float
log1p(float __x)
@@ -1408,12 +1409,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_log1pl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
log1p(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return log1p(__type(__x));
- }
+ { return __builtin_log1p(__x); }
// DR 568.
inline float
@@ -1425,12 +1424,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_log2l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
log2(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return log2(__type(__x));
- }
+ { return __builtin_log2(__x); }
inline float
logb(float __x)
@@ -1441,12 +1438,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_logbl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
logb(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return logb(__type(__x));
- }
+ { return __builtin_logb(__x); }
inline long
lrint(float __x)
@@ -1457,12 +1452,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lrintl(__x); }
template<typename _Tp>
- inline long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long>::__type
lrint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lrint(__type(__x));
- }
+ { return __builtin_lrint(__x); }
inline long
lround(float __x)
@@ -1473,12 +1466,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lroundl(__x); }
template<typename _Tp>
- inline long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long>::__type
lround(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lround(__type(__x));
- }
+ { return __builtin_lround(__x); }
inline float
nearbyint(float __x)
@@ -1489,12 +1480,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nearbyintl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
nearbyint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return nearbyint(__type(__x));
- }
+ { return __builtin_nearbyint(__x); }
inline float
nextafter(float __x, float __y)
@@ -1505,7 +1494,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nextafterl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
nextafter(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1521,12 +1514,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nexttowardl(__x, __y); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
nexttoward(_Tp __x, long double __y)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return nexttoward(__type(__x), __y);
- }
+ { return __builtin_nexttoward(__x, __y); }
inline float
remainder(float __x, float __y)
@@ -1537,7 +1528,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_remainderl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
remainder(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1553,7 +1548,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_remquol(__x, __y, __pquo); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
remquo(_Tp __x, _Up __y, int* __pquo)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -1569,12 +1568,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_rintl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
rint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return rint(__type(__x));
- }
+ { return __builtin_rint(__x); }
inline float
round(float __x)
@@ -1585,12 +1582,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_roundl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
round(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return round(__type(__x));
- }
+ { return __builtin_round(__x); }
inline float
scalbln(float __x, long __ex)
@@ -1601,12 +1596,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_scalblnl(__x, __ex); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
scalbln(_Tp __x, long __ex)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return scalbln(__type(__x), __ex);
- }
+ { return __builtin_scalbln(__x, __ex); }
inline float
scalbn(float __x, int __ex)
@@ -1617,12 +1610,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_scalbnl(__x, __ex); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
scalbn(_Tp __x, int __ex)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return scalbn(__type(__x), __ex);
- }
+ { return __builtin_scalbn(__x, __ex); }
inline float
tgamma(float __x)
@@ -1633,12 +1624,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_tgammal(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
tgamma(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return tgamma(__type(__x));
- }
+ { return __builtin_tgamma(__x); }
inline float
trunc(float __x)
@@ -1649,12 +1638,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_truncl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
trunc(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return trunc(__type(__x));
- }
+ { return __builtin_trunc(__x); }
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
diff --git a/libstdc++-v3/include/tr1/cmath b/libstdc++-v3/include/tr1/cmath
index 21bdee8..9ada637 100644
--- a/libstdc++-v3/include/tr1/cmath
+++ b/libstdc++-v3/include/tr1/cmath
@@ -429,12 +429,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_acoshl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
acosh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return acosh(__type(__x));
- }
+ { return __builtin_acosh(__x); }
using std::asin;
@@ -447,12 +445,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_asinhl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
asinh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return asinh(__type(__x));
- }
+ { return __builtin_asinh(__x); }
using std::atan;
using std::atan2;
@@ -466,12 +462,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_atanhl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
atanh(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return atanh(__type(__x));
- }
+ { return __builtin_atanh(__x); }
inline float
cbrt(float __x)
@@ -482,12 +476,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_cbrtl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
cbrt(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return cbrt(__type(__x));
- }
+ { return __builtin_cbrt(__x); }
using std::ceil;
@@ -500,7 +492,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_copysignl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
copysign(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -519,12 +515,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_erfl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
erf(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return erf(__type(__x));
- }
+ { return __builtin_erf(__x); }
inline float
erfc(float __x)
@@ -535,12 +529,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_erfcl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
erfc(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return erfc(__type(__x));
- }
+ { return __builtin_erfc(__x); }
using std::exp;
@@ -553,12 +545,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_exp2l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
exp2(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return exp2(__type(__x));
- }
+ { return __builtin_exp2(__x); }
inline float
expm1(float __x)
@@ -569,12 +559,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_expm1l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
expm1(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return expm1(__type(__x));
- }
+ { return __builtin_expm1(__x); }
// Note: we deal with fabs in a special way, because an using std::fabs
// would bring in also the overloads for complex types, which in C++0x
@@ -604,7 +592,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fdiml(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fdim(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -622,7 +614,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fmal(__x, __y, __z); }
template<typename _Tp, typename _Up, typename _Vp>
- inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
+ inline
+ typename __gnu_cxx::__promote_3<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value
+ && __is_arithmetic<_Vp>::__value,
+ _Tp>::__type, _Up, _Vp>::__type
fma(_Tp __x, _Up __y, _Vp __z)
{
typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
@@ -638,7 +635,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fmaxl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fmax(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -654,7 +655,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_fminl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
fmin(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -673,11 +678,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_hypotl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
- hypot(_Tp __x, _Up __y)
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
+ hypot(_Tp __y, _Up __x)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
- return hypot(__type(__x), __type(__y));
+ return hypot(__type(__y), __type(__x));
}
inline int
@@ -689,12 +698,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_ilogbl(__x); }
template<typename _Tp>
- inline int
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ int>::__type
ilogb(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return ilogb(__type(__x));
- }
+ { return __builtin_ilogb(__x); }
using std::ldexp;
@@ -707,12 +714,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lgammal(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
lgamma(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lgamma(__type(__x));
- }
+ { return __builtin_lgamma(__x); }
inline long long
llrint(float __x)
@@ -723,12 +728,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_llrintl(__x); }
template<typename _Tp>
- inline long long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long long>::__type
llrint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return llrint(__type(__x));
- }
+ { return __builtin_llrint(__x); }
inline long long
llround(float __x)
@@ -739,12 +742,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_llroundl(__x); }
template<typename _Tp>
- inline long long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long long>::__type
llround(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return llround(__type(__x));
- }
+ { return __builtin_llround(__x); }
using std::log;
using std::log10;
@@ -758,12 +759,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_log1pl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
log1p(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return log1p(__type(__x));
- }
+ { return __builtin_log1p(__x); }
// DR 568.
inline float
@@ -775,12 +774,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_log2l(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
log2(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return log2(__type(__x));
- }
+ { return __builtin_log2(__x); }
inline float
logb(float __x)
@@ -791,11 +788,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_logbl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
logb(_Tp __x)
{
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return logb(__type(__x));
+ return __builtin_logb(__x);
}
inline long
@@ -807,12 +804,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lrintl(__x); }
template<typename _Tp>
- inline long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long>::__type
lrint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lrint(__type(__x));
- }
+ { return __builtin_lrint(__x); }
inline long
lround(float __x)
@@ -823,12 +818,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_lroundl(__x); }
template<typename _Tp>
- inline long
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ long>::__type
lround(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return lround(__type(__x));
- }
+ { return __builtin_lround(__x); }
inline float
nearbyint(float __x)
@@ -839,12 +832,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nearbyintl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
nearbyint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return nearbyint(__type(__x));
- }
+ { return __builtin_nearbyint(__x); }
inline float
nextafter(float __x, float __y)
@@ -855,7 +846,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nextafterl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
nextafter(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -871,12 +866,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_nexttowardl(__x, __y); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
nexttoward(_Tp __x, long double __y)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return nexttoward(__type(__x), __y);
- }
+ { return __builtin_nexttoward(__x, __y); }
// DR 550. What should the return type of pow(float,int) be?
// NB: C++0x and TR1 != C++03.
@@ -891,7 +884,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_remainderl(__x, __y); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
remainder(_Tp __x, _Up __y)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -907,7 +904,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_remquol(__x, __y, __pquo); }
template<typename _Tp, typename _Up>
- inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+ inline
+ typename __gnu_cxx::__promote_2<
+ typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
+ && __is_arithmetic<_Up>::__value,
+ _Tp>::__type, _Up>::__type
remquo(_Tp __x, _Up __y, int* __pquo)
{
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
@@ -923,12 +924,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_rintl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
rint(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return rint(__type(__x));
- }
+ { return __builtin_rint(__x); }
inline float
round(float __x)
@@ -939,12 +938,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_roundl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
round(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return round(__type(__x));
- }
+ { return __builtin_round(__x); }
inline float
scalbln(float __x, long __ex)
@@ -955,12 +952,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_scalblnl(__x, __ex); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
scalbln(_Tp __x, long __ex)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return scalbln(__type(__x), __ex);
- }
+ { return __builtin_scalbln(__x, __ex); }
inline float
scalbn(float __x, int __ex)
@@ -971,12 +966,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_scalbnl(__x, __ex); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
scalbn(_Tp __x, int __ex)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return scalbn(__type(__x), __ex);
- }
+ { return __builtin_scalbn(__x, __ex); }
using std::sin;
using std::sinh;
@@ -993,12 +986,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_tgammal(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
tgamma(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return tgamma(__type(__x));
- }
+ { return __builtin_tgamma(__x); }
inline float
trunc(float __x)
@@ -1009,12 +1000,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __builtin_truncl(__x); }
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
+ double>::__type
trunc(_Tp __x)
- {
- typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
- return trunc(__type(__x));
- }
+ { return __builtin_trunc(__x); }
#endif
_GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/overloads_c++0x_neg.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/overloads_c++0x_neg.cc
new file mode 100644
index 0000000..2d8862e
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/cmath/overloads_c++0x_neg.cc
@@ -0,0 +1,65 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <cmath>
+
+// libstdc++/48933
+
+#ifdef _GLIBCXX_USE_C99_MATH_TR1
+
+struct Foo { };
+
+template Foo std::atan2<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::acosh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::asinh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::atanh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::cbrt<Foo>(Foo); // { dg-error "not match" }
+template Foo std::copysign<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::erf<Foo>(Foo); // { dg-error "not match" }
+template Foo std::erfc<Foo>(Foo); // { dg-error "not match" }
+template Foo std::exp2<Foo>(Foo); // { dg-error "not match" }
+template Foo std::expm1<Foo>(Foo); // { dg-error "not match" }
+template Foo std::fdim<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::fma<Foo, Foo, Foo>(Foo(), Foo(), Foo()); // { dg-error "not match" }
+template Foo std::fmax<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::fmin<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::hypot<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template int std::ilogb<Foo>(Foo); // { dg-error "not match" }
+template Foo std::lgamma<Foo>(Foo); // { dg-error "not match" }
+template long long std::llrint<Foo>(Foo); // { dg-error "not match" }
+template long long std::llround<Foo>(Foo); // { dg-error "not match" }
+template Foo std::log1p<Foo>(Foo); // { dg-error "not match" }
+template Foo std::log2<Foo>(Foo); // { dg-error "not match" }
+template Foo std::logb<Foo>(Foo); // { dg-error "not match" }
+template long std::lrint<Foo>(Foo); // { dg-error "not match" }
+template long std::lround<Foo>(Foo); // { dg-error "not match" }
+template Foo std::nearbyint<Foo>(Foo); // { dg-error "not match" }
+template Foo std::nextafter<Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::nexttoward<Foo>(Foo, long double); // { dg-error "not match" }
+template Foo std::remainder<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::remquo<Foo>(Foo, Foo, int*); // { dg-error "not match" }
+template Foo std::rint<Foo>(Foo); // { dg-error "not match" }
+template Foo std::round<Foo>(Foo); // { dg-error "not match" }
+template Foo std::scalbln<Foo>(Foo, long); // { dg-error "not match" }
+template Foo std::scalbn<Foo>(Foo, int); // { dg-error "not match" }
+template Foo std::tgamma<Foo>(Foo); // { dg-error "not match" }
+template Foo std::trunc<Foo>(Foo); // { dg-error "not match" }
+
+#endif
diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/overloads_neg.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/overloads_neg.cc
new file mode 100644
index 0000000..174a81d
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/overloads_neg.cc
@@ -0,0 +1,66 @@
+// { dg-do compile }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 8.16.4 Additional overloads
+
+#include <tr1/cmath>
+
+// libstdc++/48933
+
+#ifdef _GLIBCXX_USE_C99_MATH_TR1
+
+struct Foo { };
+
+template Foo std::tr1::atan2<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::acosh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::asinh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::atanh<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::cbrt<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::copysign<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::erf<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::erfc<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::exp2<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::expm1<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::fdim<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::fma<Foo, Foo, Foo>(Foo(), Foo(), Foo()); // { dg-error "not match" }
+template Foo std::tr1::fmax<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::fmin<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::hypot<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template int std::tr1::ilogb<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::lgamma<Foo>(Foo); // { dg-error "not match" }
+template long long std::tr1::llrint<Foo>(Foo); // { dg-error "not match" }
+template long long std::tr1::llround<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::log1p<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::log2<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::logb<Foo>(Foo); // { dg-error "not match" }
+template long std::tr1::lrint<Foo>(Foo); // { dg-error "not match" }
+template long std::tr1::lround<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::nearbyint<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::nextafter<Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::nexttoward<Foo>(Foo, long double); // { dg-error "not match" }
+template Foo std::tr1::remainder<Foo, Foo>(Foo, Foo); // { dg-error "not match" }
+template Foo std::tr1::remquo<Foo>(Foo, Foo, int*); // { dg-error "not match" }
+template Foo std::tr1::rint<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::round<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::scalbln<Foo>(Foo, long); // { dg-error "not match" }
+template Foo std::tr1::scalbn<Foo>(Foo, int); // { dg-error "not match" }
+template Foo std::tr1::tgamma<Foo>(Foo); // { dg-error "not match" }
+template Foo std::tr1::trunc<Foo>(Foo); // { dg-error "not match" }
+
+#endif