Merge pull request #3493 from pherl/cmath

Fix cmath/math.h include with non C++11 libstdc++
This commit is contained in:
Jisi Liu 2017-08-15 13:21:44 -07:00 committed by GitHub
commit f6196219f7

View File

@ -43,18 +43,23 @@
#ifndef UTIL_MATH_MATHLIMITS_H__ #ifndef UTIL_MATH_MATHLIMITS_H__
#define UTIL_MATH_MATHLIMITS_H__ #define UTIL_MATH_MATHLIMITS_H__
// GCC 4.9 has a bug that makes it impossible to use isinf and isnan when both
// <math.h> and <cmath> get pulled into the same translation unit.
// Unfortunately it is difficult to prevent this from happening, so to work
// around the problem we use std::isinf and std::isnan from <cmath> for C++11
// builds and otherwise use the plain isinf and isnan functions from <math.h>.
// Note that for Windows we do something different because it does not support // Note that for Windows we do something different because it does not support
// the plain isinf and isnan. // the plain isinf and isnan.
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
// GCC 4.9 has a bug that makes isinf and isnan ambigious when both <math.h>
// and <cmath> get pulled into the same translation unit. We use the ones in
// std:: namespace explicitly for C++11
#include <cmath> #include <cmath>
#define GOOGLE_PROTOBUF_USE_STD_CMATH
#elif _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
// libstdc++ <cmath> header undefines the global macros and put functions in
// std:: namespace even before C++11. Use the ones in std:: instead too.
#include <cmath>
#define GOOGLE_PROTOBUF_USE_STD_CMATH
#else #else
#include <math.h> #include <math.h>
#endif #endif
#include <string.h> #include <string.h>
#include <cfloat> #include <cfloat>
@ -229,7 +234,7 @@ DECL_UNSIGNED_INT_LIMITS(unsigned long long int)
// For non-Windows builds we use the std:: versions of isinf and isnan if they // For non-Windows builds we use the std:: versions of isinf and isnan if they
// are available; see the comment about <cmath> at the top of this file for the // are available; see the comment about <cmath> at the top of this file for the
// details on why we need to do this. // details on why we need to do this.
#if __cplusplus >= 201103L #ifdef GOOGLE_PROTOBUF_USE_STD_CMATH
#define ISINF std::isinf #define ISINF std::isinf
#define ISNAN std::isnan #define ISNAN std::isnan
#else #else