Merge pull request #641 from sergiud/nullptr

CHECK support for nullptr (fixes #341)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e6784fc..62ebbcc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -241,6 +241,12 @@
 int main() { }
 " HAVE_CXX11_ATOMIC)
 
+check_cxx_source_compiles ("
+#include <cstddef>
+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 @@
   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 d90f859..c1c44fe 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -26,6 +26,7 @@
 Abhishek Parmar <abhishek@orng.net>
 Andrew Schwartzmeyer <andrew@schwartzmeyer.com>
 Andy Ying <andy@trailofbits.com>
+Bret McKee <bretmckee@google.com>
 Brian Silverman <bsilver16384@gmail.com>
 Fumitoshi Ukai <ukai@google.com>
 Guillaume Dumont <dumont.guillaume@gmail.com>
diff --git a/bazel/glog.bzl b/bazel/glog.bzl
index 7429576..40833b4 100644
--- a/bazel/glog.bzl
+++ b/bazel/glog.bzl
@@ -50,6 +50,7 @@
         "-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 @@
     )
 
     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 c4f0136..8a989e4 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 1e80cce..421f1e0 100644
--- a/src/glog/logging.h.in
+++ b/src/glog/logging.h.in
@@ -37,6 +37,7 @@
 #define _LOGGING_H_
 
 #include <cerrno>
+#include <cstddef>
 #include <cstring>
 #include <ctime>
 #include <iosfwd>
@@ -731,6 +732,13 @@
 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 <typename T1, typename T2>
 std::string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprtext)
diff --git a/src/logging.cc b/src/logging.cc
index cfece07..71de91d 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -2547,6 +2547,13 @@
   }
 }
 
+#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);
 }