[fixincludes, v3] Don't define libstdc++-internal macros in Solaris 10+ <math.h>
Rainer Orth
ro@CeBiTec.Uni-Bielefeld.DE
Thu Nov 3 14:11:00 GMT 2016
As I've noticed some time ago, recent versions of Solaris <math.h>
include this little gem:
#if __cplusplus >= 201103L
#undef _GLIBCXX_USE_C99_MATH
#undef _GLIBCXX_USE_C99_MATH_TR1
#endif
This renders a couple of perfectly good libstdc++ tests as UNSUPPORTED
and is completely unsustainable. Agreement has now been reached with
the Solaris libm maintainers that this wasn't a good idea and the plan
is to do away with it at least in future Solaris 11.3 SRUs and Solaris 12.
Some digging discovered that we have 3 levels of support in <math.h> and
<iso/math_c99.h:
1) No C++11 math support at all.
2) Overloads for C++11 math functions, already handled by
[v3] Handle C++11 <math.h> overloads on Solaris 12
https://gcc.gnu.org/ml/gcc-patches/2015-11/msg02075.html
and the 4.9 backport
[v3, 4.9] Handle C++11 <math.h> overloads on Solaris 11, 12
https://gcc.gnu.org/ml/gcc-patches/2016-02/msg01477.html
They were introduced in Solaris 10 Patch 11996[67]-02, Solaris 11.3
SRU 3.6, and Solaris 12 Build 86.
3) Full C++11 math support, including the templates present in libstdc++
<cmath>, and the #undef's above.
Introduced in the same Solaris 10 Patch, Solaris 11.3 SRU 5.6, and
Solaris 12 Build 90.
To check for potential fallout, I've added a fixincludes fix to remove
the #undefs. As expected, there was quite a bit, e.g.
+FAIL: 25_algorithms/pop_heap/complexity.cc (test for excess errors)
+WARNING: 25_algorithms/pop_heap/complexity.cc compilation failed to produce executable
/vol/gcc/src/hg/trunk/local/libstdc++-v3/testsuite/25_algorithms/pop_heap/complexity.cc:48: error: call of overloaded 'log2(const size_t&)' is ambiguous
In file included from /var/gcc/regression/trunk/12-gcc/build/gcc/include-fixed/math.h:25,
from /var/gcc/regression/trunk/12-gcc/build/i386-pc-solaris2.12/libstdc++-v3/include/cmath:45,
from /vol/gcc/src/hg/trunk/local/libstdc++-v3/include/precompiled/stdc++.h:41:
/usr/include/iso/math_c99.h:474: note: candidate: double std::log2(double)
In file included from /var/gcc/regression/trunk/12-gcc/build/gcc/include-fixed/math.h:25,
from /var/gcc/regression/trunk/12-gcc/build/i386-pc-solaris2.12/libstdc++-v3/include/cmath:45,
from /vol/gcc/src/hg/trunk/local/libstdc++-v3/include/precompiled/stdc++.h:41:
/usr/include/iso/math_c99.h:763: note: candidate: float std::log2(float)
/usr/include/iso/math_c99.h:805: note: candidate: long double std::log2(long double)
/usr/include/iso/math_c99.h:946: note: candidate: typename std::__math_impl::__enable_if<std::__math_impl::__is_integral< <template-parameter-1-1> >::__value, double>::__type std::log2(_Tp) [with _Tp = unsigned int; typename std::__math_impl::__enable_if<std::__math_impl::__is_integral< <template-parameter-1-1> >::__value, double>::__type = double]
In file included from /vol/gcc/src/hg/trunk/local/libstdc++-v3/include/precompiled/stdc++.h:41:
/var/gcc/regression/trunk/12-gcc/build/i386-pc-solaris2.12/libstdc++-v3/include/cmath:1530: note: candidate: constexpr typename __gnu_cxx::__enable_if<std::__is_integer<_Tp>::__value, double>::__type std::log2(_Tp) [with _Tp = unsigned int; typename __gnu_cxx::__enable_if<std::__is_integer<_Tp>::__value, double>::__type = double]
due to duplicate log2 templates in <iso/math_c99.h> and c_global/cmath,
and many more of the same kind.
Fortunately, this is all easily fixed by wrapping the affected templates
in a new macro. That's what this patch does. The new libstdc++
acinclude.m4 test may well need wording changes in comments etc. and can
perhaps be shortened a bit, bit it worked for me.
The fixincludes part passes make check.
The patch has been regtested (C++ only) on
* Solaris 11.2 SRU 13.6 (i.e. without both overloads and templates in
<iso/math_c99.h>),
* Solaris 11.3 SRU 3.6 (i.e. with overloads only), and
* Solaris 12 Build 110 (i.e. with both overloads and templates, and the
_GLIBCXX_USE_C99_MATH #undef's)
* Linux/x86_64
I've checked that __CORRECT_ISO_CPP11_MATH_H_PROTO[12] were defined in
config.h as expected, and there were no testsuite regressions. On the
contrary, a couple of tests that before showed up as UNSUPPORTED due to
the _GLIBCXX_USE_C99_MATH* #undef's now PASS as they should.
Ok for mainline now, and for backports to the gcc-6 and gcc-5 branches
after some soak time?
Thanks.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
2016-10-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
libstdc++-v3:
* acinclude.m4 (GLIBCXX_CHECK_MATH11_PROTO): Update comments.
(__CORRECT_ISO_CPP11_MATH_H_PROTO): Rename to ...
(__CORRECT_ISO_CPP11_MATH_H_PROTO1): ... this.
Add test for C++11 <math.h> templates.
* configure: Regenerate.
* config.h.in: Regenerate.
* include/c_global/cmath [__cplusplus >= 201103L]: Reflect
__CORRECT_ISO_CPP11_MATH_H_PROTO to
__CORRECT_ISO_CPP11_MATH_H_PROTO1 rename.
* include/c_global/cmath [_GLIBCXX_USE_C99_MATH &&
!_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC && __cplusplus >= 201103L]
(std::fpclassify): Wrap in !__CORRECT_ISO_CPP11_MATH_H_PROTO2.
(std::isfinite): Likewise.
(std::isinf): Likewise.
(std::isnan): Likewise.
(std::isnormal): Likewise.
(std::signbit): Likewise.
(std::isgreater): Likewise.
(std::isgreaterequal): Likewise.
(std::isless): Likewise.
(std::islessequal): Likewise.
(std::islessgreater): Likewise.
(std::isunordered): Likewise.
[__cplusplus >= 201103L && _GLIBCXX_USE_C99_MATH_TR1]
(std::acosh): Likewise.
(std::asinh): Likewise.
(std::atanh): Likewise.
(std::cbrt): Likewise.
(std::copysign): Likewise.
(std::erf): Likewise.
(std::erfc): Likewise.
(std::exp2): Likewise.
(std::expm1): Likewise.
(std::fdim): Likewise.
(std::fma): Likewise.
(std::fmax): Likewise.
(std::fmin): Likewise.
(std::hypot): Likewise.
(std::ilogb): Likewise.
(std::lgamma): Likewise.
(std::llrint): Likewise.
(std::llround): Likewise.
(std::log1p): Likewise.
(std::log2): Likewise.
(std::logb): Likewise.
(std::lrint): Likewise.
(std::lround): Likewise.
(std::nearbyint): Likewise.
(std::nextafter): Likewise.
(std::nexttoward): Likewise.
(std::remainder): Likewise.
(std::remquo): Likewise.
(std::rint): Likewise.
(std::round): Likewise.
(std::scalbln): Likewise.
(std::scalbn): Likewise.
(std::tgamma): Likewise.
(std::trunc): Likewise.
* include/tr1/cmath [_GLIBCXX_USE_C99_MATH_TR1 && __cplusplus >=
201103L]: Reflect __CORRECT_ISO_CPP11_MATH_H_PROTO to
__CORRECT_ISO_CPP11_MATH_H_PROTO1 rename.
fixincludes:
* inclhack.def (solaris_math_12): New fix.
* fixincl.x: Regenerate.
* tests/base/math.h [SOLARIS_MATH_12_CHECK]: New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sol2-math-glibcxx.patch
Type: text/x-patch
Size: 42361 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20161103/4aec01a7/attachment.bin>
More information about the Libstdc++
mailing list