aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf
diff options
context:
space:
mode:
authorGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-18 07:20:43 +0000
committerGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-18 07:20:43 +0000
commit91218afc67773ebf85e37d91c80cb3a7d423b0ba (patch)
treea2f5a73a5a136924ae07064f366c22deefddf4a2 /src/google/protobuf
parent5e744ff9612da1add0dd0f893242703246c00d0c (diff)
Fix Cygwin build.
Diffstat (limited to 'src/google/protobuf')
-rw-r--r--src/google/protobuf/compiler/command_line_interface_unittest.cc18
-rw-r--r--src/google/protobuf/compiler/subprocess.cc5
-rw-r--r--src/google/protobuf/extension_set.cc12
3 files changed, 27 insertions, 8 deletions
diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc
index 83850cf9..b43f781c 100644
--- a/src/google/protobuf/compiler/command_line_interface_unittest.cc
+++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc
@@ -146,6 +146,8 @@ class CommandLineInterfaceTest : public testing::Test {
const string& proto_name,
const string& message_name);
+ void ExpectNullCodeGeneratorCalled(const string& parameter);
+
void ReadDescriptorSet(const string& filename,
FileDescriptorSet* descriptor_set);
@@ -170,6 +172,8 @@ class CommandLineInterfaceTest : public testing::Test {
// Pointers which need to be deleted later.
vector<CodeGenerator*> mock_generators_to_delete_;
+
+ NullCodeGenerator* null_generator_;
};
class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator {
@@ -220,7 +224,7 @@ void CommandLineInterfaceTest::SetUp() {
mock_generators_to_delete_.push_back(generator);
cli_.RegisterGenerator("--alt_out", generator, "Alt output.");
- generator = new NullCodeGenerator();
+ generator = null_generator_ = new NullCodeGenerator();
mock_generators_to_delete_.push_back(generator);
cli_.RegisterGenerator("--null_out", generator, "Null output.");
@@ -338,6 +342,12 @@ void CommandLineInterfaceTest::ExpectGeneratedWithInsertions(
temp_directory_);
}
+void CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled(
+ const string& parameter) {
+ EXPECT_TRUE(null_generator_->called_);
+ EXPECT_EQ(parameter, null_generator_->parameter_);
+}
+
void CommandLineInterfaceTest::ReadDescriptorSet(
const string& filename, FileDescriptorSet* descriptor_set) {
string path = temp_directory_ + "/" + filename;
@@ -481,8 +491,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPath) {
"--proto_path=$tmpdir foo.proto");
ExpectNoErrors();
- EXPECT_TRUE(generator->called_);
- EXPECT_EQ("", generator->parameter_);
+ ExpectNullCodeGeneratorCalled("");
}
TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
@@ -495,8 +504,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
"--proto_path=$tmpdir foo.proto");
ExpectNoErrors();
- EXPECT_TRUE(generator->called_);
- EXPECT_EQ("bar", generator->parameter_);
+ ExpectNullCodeGeneratorCalled("bar");
}
TEST_F(CommandLineInterfaceTest, TrailingBackslash) {
diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc
index 4f3cfa16..33f5bd6b 100644
--- a/src/google/protobuf/compiler/subprocess.cc
+++ b/src/google/protobuf/compiler/subprocess.cc
@@ -115,8 +115,11 @@ bool Subprocess::Communicate(const Message& input, Message* output,
GOOGLE_CHECK_NE(child_stdin_, -1) << "Must call Start() first.";
+ // The "sighandler_t" typedef is GNU-specific, so define our own.
+ typedef void SignalHandler(int);
+
// Make sure SIGPIPE is disabled so that if the child dies it doesn't kill us.
- sighandler_t old_pipe_handler = signal(SIGPIPE, SIG_IGN);
+ SignalHandler* old_pipe_handler = signal(SIGPIPE, SIG_IGN);
string input_data = input.SerializeAsString();
string output_data;
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index b1ffb0f5..615f33c7 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -120,7 +120,14 @@ void ExtensionSet::RegisterExtension(const MessageLite* containing_type,
}
static bool CallNoArgValidityFunc(const void* arg, int number) {
- return reinterpret_cast<const EnumValidityFunc*>(arg)(number);
+ // Note: Must use C-style cast here rather than reinterpret_cast because
+ // the C++ standard at one point did not allow casts between function and
+ // data pointers and some compilers enforce this for C++-style casts. No
+ // compiler enforces it for C-style casts since lots of C-style code has
+ // relied on these kinds of casts for a long time, despite being
+ // technically undefined. See:
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
+ return ((const EnumValidityFunc*)arg)(number);
}
void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
@@ -130,7 +137,8 @@ void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);
ExtensionInfo info(type, is_repeated, is_packed);
info.enum_is_valid = CallNoArgValidityFunc;
- info.enum_is_valid_arg = reinterpret_cast<void*>(is_valid);
+ // See comment in CallNoArgValidityFunc() about why we use a c-style cast.
+ info.enum_is_valid_arg = (void*)is_valid;
Register(containing_type, number, info);
}