Export of internal Abseil changes.
-- eb6cc81ef7e89e10fc9df47418af93e22fd116d2 by Abseil Team <absl-team@google.com>: Workaround clang bug https://bugs.llvm.org/show_bug.cgi?id=38289 PiperOrigin-RevId: 206006290 -- 509e9829295bfc429b82de42f2e073c756ea5709 by Jon Cohen <cohenjon@google.com>: Remove make_unique ambiguity when using gcc 4.9 in C++14 mode. gcc 4.9.4 has __cplusplus at 201300L instead of 201402L when in C++14 mode, I guess indicating incomplete support. Anyways, it causes a problem with this check as in c++14 mode in old gcc we were defining absl::make_unique when std::make_unique was present PiperOrigin-RevId: 205886589 GitOrigin-RevId: eb6cc81ef7e89e10fc9df47418af93e22fd116d2 Change-Id: I9acf3f3d0fd3b0b46ae099821f3bf21b72c28b2b
This commit is contained in:
parent
9e060686d1
commit
c2e00d3419
2 changed files with 13 additions and 2 deletions
|
@ -83,7 +83,11 @@ struct MakeUniqueResult<T[N]> {
|
||||||
|
|
||||||
} // namespace memory_internal
|
} // namespace memory_internal
|
||||||
|
|
||||||
#if __cplusplus >= 201402L || defined(_MSC_VER)
|
// gcc 4.8 has __cplusplus at 201301 but doesn't define make_unique. Other
|
||||||
|
// supported compilers either just define __cplusplus as 201103 but have
|
||||||
|
// make_unique (msvc), or have make_unique whenever __cplusplus > 201103 (clang)
|
||||||
|
#if (__cplusplus > 201103L || defined(_MSC_VER)) && \
|
||||||
|
!(defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 8)
|
||||||
using std::make_unique;
|
using std::make_unique;
|
||||||
#else
|
#else
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -153,7 +153,14 @@ void PrintExponent(int exp, char e, Buffer *out) {
|
||||||
|
|
||||||
template <typename Float, typename Int>
|
template <typename Float, typename Int>
|
||||||
constexpr bool CanFitMantissa() {
|
constexpr bool CanFitMantissa() {
|
||||||
return std::numeric_limits<Float>::digits <= std::numeric_limits<Int>::digits;
|
return
|
||||||
|
#if defined(__clang__) && !defined(__SSE3__)
|
||||||
|
// Workaround for clang bug: https://bugs.llvm.org/show_bug.cgi?id=38289
|
||||||
|
// Casting from long double to uint64_t is miscompiled and drops bits.
|
||||||
|
(!std::is_same<Float, long double>::value ||
|
||||||
|
!std::is_same<Int, uint64_t>::value) &&
|
||||||
|
#endif
|
||||||
|
std::numeric_limits<Float>::digits <= std::numeric_limits<Int>::digits;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Float>
|
template <typename Float>
|
||||||
|
|
Loading…
Reference in a new issue