From 133be3dc1f1eb3f3c6252b950e89895469f1193c Mon Sep 17 00:00:00 2001 From: Brian Silverman Date: Tue, 8 Sep 2015 18:56:58 -0400 Subject: [PATCH 1/2] Use TEST_TMPDIR for writing temporary files if it's set. Bazel expects all tests to do this. --- src/google/protobuf/testing/googletest.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/google/protobuf/testing/googletest.cc b/src/google/protobuf/testing/googletest.cc index b8bd790b..2b9cddef 100644 --- a/src/google/protobuf/testing/googletest.cc +++ b/src/google/protobuf/testing/googletest.cc @@ -94,6 +94,13 @@ string TestSourceDir() { namespace { string GetTemporaryDirectoryName() { + // Tests run under Bazel "should not" use /tmp. Bazel sets this environment + // variable for tests to use instead. + char *from_environment = getenv("TEST_TMPDIR"); + if (from_environment != NULL && from_environment[0] != '\0') { + return string(from_environment) + "/protobuf_tmpdir"; + } + // tmpnam() is generally not considered safe but we're only using it for // testing. We cannot use tmpfile() or mkstemp() since we're creating a // directory. From 21f3d3777a921eee1cc3fed2eead0cade51eb0f1 Mon Sep 17 00:00:00 2001 From: Brian Silverman Date: Tue, 8 Sep 2015 18:57:04 -0400 Subject: [PATCH 2/2] Don't assume char is signed. It isn't always, which causes problems when trying to put negative values into the array with C++11. --- src/google/protobuf/compiler/cpp/cpp_file.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/google/protobuf/compiler/cpp/cpp_file.cc b/src/google/protobuf/compiler/cpp/cpp_file.cc index 5dae4cdd..8e8bd8b7 100644 --- a/src/google/protobuf/compiler/cpp/cpp_file.cc +++ b/src/google/protobuf/compiler/cpp/cpp_file.cc @@ -598,8 +598,13 @@ void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) { // bytes in length". Declare a static array of characters rather than use a // string literal. if (breakdown_large_file && file_data.size() > 65535) { + // This has to be explicitly marked as a signed char because the generated + // code puts negative values in the array, and sometimes plain char is + // unsigned. That implicit narrowing conversion is not allowed in C++11. + // + // has details on why. printer->Print( - "static const char descriptor[] = {\n"); + "static const signed char descriptor[] = {\n"); printer->Indent(); // Only write 25 bytes per line.