Merge branch 'master' into release-0-4-0
diff --git a/README.md b/README.md
index d525f30..965766c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 [![Build Status](https://img.shields.io/travis/google/glog/master.svg?label=Travis)](https://travis-ci.org/google/glog/builds)
-[![Grunt status](https://img.shields.io/appveyor/ci/google/glog/master.svg?label=Appveyor)](https://ci.appveyor.com/project/google/glog/history)
+[![Grunt status](https://img.shields.io/appveyor/ci/google-admin/glog/master.svg?label=Appveyor)](https://ci.appveyor.com/project/google-admin/glog/history)
 
 This repository contains a C++ implementation of the Google logging
 module.  Documentation for the implementation is in doc/.
diff --git a/src/glog/raw_logging.h.in b/src/glog/raw_logging.h.in
index fa17057..3eac56a 100644
--- a/src/glog/raw_logging.h.in
+++ b/src/glog/raw_logging.h.in
@@ -175,11 +175,6 @@
                                    const char* format, ...)
    @ac_cv___attribute___printf_4_5@;
 
-// Hack to propagate time information into this module so that
-// this module does not have to directly call localtime_r(),
-// which could allocate memory.
-GOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs);
-
 @ac_google_end_namespace@
 
 #endif  // BASE_RAW_LOGGING_H_
diff --git a/src/logging.cc b/src/logging.cc
index 18a8ec6..0c86cf6 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -1266,7 +1266,6 @@
   data_->timestamp_ = static_cast<time_t>(now);
   localtime_r(&data_->timestamp_, &data_->tm_time_);
   int usecs = static_cast<int>((now - data_->timestamp_) * 1000000);
-  RawLog__SetLastTime(data_->tm_time_, usecs);
 
   data_->num_chars_to_log_ = 0;
   data_->num_chars_to_syslog_ = 0;
diff --git a/src/logging_unittest.cc b/src/logging_unittest.cc
index 8770d52..762c752 100644
--- a/src/logging_unittest.cc
+++ b/src/logging_unittest.cc
@@ -572,9 +572,10 @@
   DCHECK_GT(2, 1);
   DCHECK_LT(1, 2);
 
-  auto_ptr<int64> sptr(new int64);
-  int64* ptr = DCHECK_NOTNULL(sptr.get());
-  CHECK_EQ(ptr, sptr.get());
+  int64* orig_ptr = new int64;
+  int64* ptr = DCHECK_NOTNULL(orig_ptr);
+  CHECK_EQ(ptr, orig_ptr);
+  delete orig_ptr;
 }
 
 void TestSTREQ() {
diff --git a/src/raw_logging.cc b/src/raw_logging.cc
index 7a7409b..3bbfda3 100644
--- a/src/raw_logging.cc
+++ b/src/raw_logging.cc
@@ -68,17 +68,6 @@
 
 _START_GOOGLE_NAMESPACE_
 
-// Data for RawLog__ below. We simply pick up the latest
-// time data created by a normal log message to avoid calling
-// localtime_r which can allocate memory.
-static struct ::tm last_tm_time_for_raw_log;
-static int last_usecs_for_raw_log;
-
-void RawLog__SetLastTime(const struct ::tm& t, int usecs) {
-  memcpy(&last_tm_time_for_raw_log, &t, sizeof(last_tm_time_for_raw_log));
-  last_usecs_for_raw_log = usecs;
-}
-
 // CAVEAT: vsnprintf called from *DoRawLog below has some (exotic) code paths
 // that invoke malloc() and getenv() that might acquire some locks.
 // If this becomes a problem we should reimplement a subset of vsnprintf
@@ -120,16 +109,13 @@
     return;  // this stderr log message is suppressed
   }
   // can't call localtime_r here: it can allocate
-  struct ::tm& t = last_tm_time_for_raw_log;
   char buffer[kLogBufSize];
   char* buf = buffer;
   int size = sizeof(buffer);
 
   // NOTE: this format should match the specification in base/logging.h
-  DoRawLog(&buf, &size, "%c%02d%02d %02d:%02d:%02d.%06d %5u %s:%d] RAW: ",
+  DoRawLog(&buf, &size, "%c0000 00:00:00.000000 %5u %s:%d] RAW: ",
            LogSeverityNames[severity][0],
-           1 + t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
-           last_usecs_for_raw_log,
            static_cast<unsigned int>(GetTID()),
            const_basename(const_cast<char *>(file)), line);
 
diff --git a/src/stacktrace_unittest.cc b/src/stacktrace_unittest.cc
index c6ab638..77d3429 100644
--- a/src/stacktrace_unittest.cc
+++ b/src/stacktrace_unittest.cc
@@ -180,6 +180,15 @@
     CheckStackTrace2(j);
   DECLARE_ADDRESS_LABEL(end);
 }
+#ifndef __GNUC__
+// On non-GNU environment, we use the address of `CheckStackTrace` to
+// guess the address range of this function. This guess is wrong for
+// non-static function on Windows. This is probably because
+// `&CheckStackTrace` returns the address of a trampoline like PLT,
+// not the actual address of `CheckStackTrace`.
+// See https://github.com/google/glog/issues/421 for the detail.
+static
+#endif
 void ATTRIBUTE_NOINLINE CheckStackTrace(int i) {
   INIT_ADDRESS_RANGE(CheckStackTrace, start, end, &expected_range[5]);
   DECLARE_ADDRESS_LABEL(start);
diff --git a/src/windows/glog/raw_logging.h b/src/windows/glog/raw_logging.h
index 4757a71..e0e6d6f 100755
--- a/src/windows/glog/raw_logging.h
+++ b/src/windows/glog/raw_logging.h
@@ -179,11 +179,6 @@
                                    const char* format, ...)
    ;
 
-// Hack to propagate time information into this module so that
-// this module does not have to directly call localtime_r(),
-// which could allocate memory.
-GOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs);
-
 }
 
 #endif  // BASE_RAW_LOGGING_H_