diff --git a/CMakeLists.txt b/CMakeLists.txt index e6784fc37..62ebbccb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,6 +241,12 @@ std::atomic i; int main() { } " HAVE_CXX11_ATOMIC) +check_cxx_source_compiles (" +#include +void foo(std::nullptr_t) {} +int main(void) { foo(nullptr); } +" HAVE_CXX11_NULLPTR_T) + if (WITH_TLS) # Cygwin does not support the thread attribute. Don't bother. if (HAVE_GCC_TLS) @@ -382,6 +388,12 @@ else (HAVE_USING_OPERATOR) set (ac_cv_cxx_using_operator 0) endif (HAVE_USING_OPERATOR) +if (HAVE_CXX11_NULLPTR_T) + set (ac_cv_cxx11_nullptr_t 1) +else (HAVE_CXX11_NULLPTR_T) + set (ac_cv_cxx11_nullptr_t 0) +endif (HAVE_CXX11_NULLPTR_T) + if (HAVE_EXECINFO_H) set (HAVE_STACKTRACE 1) endif (HAVE_EXECINFO_H) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d90f85988..c1c44fe51 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -26,6 +26,7 @@ Abhishek Dasgupta Abhishek Parmar Andrew Schwartzmeyer Andy Ying +Bret McKee Brian Silverman Fumitoshi Ukai Guillaume Dumont diff --git a/bazel/glog.bzl b/bazel/glog.bzl index 742957618..40833b461 100644 --- a/bazel/glog.bzl +++ b/bazel/glog.bzl @@ -50,6 +50,7 @@ def glog_library(namespace = "google", with_gflags = 1, **kwargs): "-DGLOG_BAZEL_BUILD", # Inject a C++ namespace. "-DGOOGLE_NAMESPACE='%s'" % namespace, + "-DHAVE_CXX11_NULLPTR_T", "-DHAVE_STDINT_H", "-DHAVE_STRING_H", "-DHAVE_UNWIND_H", @@ -186,6 +187,7 @@ def glog_library(namespace = "google", with_gflags = 1, **kwargs): ) common_config = { + "@ac_cv_cxx11_nullptr_t@": "1", "@ac_cv_cxx_using_operator@": "1", "@ac_cv_have_inttypes_h@": "0", "@ac_cv_have_u_int16_t@": "0", diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index c4f01366d..8a989e4f7 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -195,6 +195,9 @@ /* Check whether C++11 atomic is available */ #cmakedefine HAVE_CXX11_ATOMIC ${HAVE_CXX11_ATOMIC} +/* Check whether C++11 nullptr_t is available */ +#cmakedefine HAVE_CXX11_NULLPTR_T ${HAVE_CXX11_NULLPTR_T} + /* Version number of package */ #cmakedefine VERSION diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in index 1e80cceb3..421f1e026 100644 --- a/src/glog/logging.h.in +++ b/src/glog/logging.h.in @@ -37,6 +37,7 @@ #define _LOGGING_H_ #include +#include #include #include #include @@ -731,6 +732,13 @@ void MakeCheckOpValueString(std::ostream* os, const signed char& v); template <> GOOGLE_GLOG_DLL_DECL void MakeCheckOpValueString(std::ostream* os, const unsigned char& v); +// This is required because nullptr is only present in c++ 11 and later. +#if @ac_cv_cxx11_nullptr_t@ +// Provide printable value for nullptr_t +template <> GOOGLE_GLOG_DLL_DECL +void MakeCheckOpValueString(std::ostream* os, const std::nullptr_t& v); +#endif + // Build the error message string. Specify no inlining for code size. template std::string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprtext) diff --git a/src/logging.cc b/src/logging.cc index cfece07f7..71de91df9 100644 --- a/src/logging.cc +++ b/src/logging.cc @@ -2547,6 +2547,13 @@ void MakeCheckOpValueString(std::ostream* os, const unsigned char& v) { } } +#ifdef HAVE_CXX11_NULLPTR_T +template <> +void MakeCheckOpValueString(std::ostream* os, const std::nullptr_t& v) { + (*os) << "nullptr"; +} +#endif // defined(HAVE_CXX11_NULLPTR_T) + void InitGoogleLogging(const char* argv0) { glog_internal_namespace_::InitGoogleLoggingUtilities(argv0); }