Commit 91218afc authored by kenton@google.com's avatar kenton@google.com

Fix Cygwin build.

parent 5e744ff9
...@@ -146,6 +146,8 @@ class CommandLineInterfaceTest : public testing::Test { ...@@ -146,6 +146,8 @@ class CommandLineInterfaceTest : public testing::Test {
const string& proto_name, const string& proto_name,
const string& message_name); const string& message_name);
void ExpectNullCodeGeneratorCalled(const string& parameter);
void ReadDescriptorSet(const string& filename, void ReadDescriptorSet(const string& filename,
FileDescriptorSet* descriptor_set); FileDescriptorSet* descriptor_set);
...@@ -170,6 +172,8 @@ class CommandLineInterfaceTest : public testing::Test { ...@@ -170,6 +172,8 @@ class CommandLineInterfaceTest : public testing::Test {
// Pointers which need to be deleted later. // Pointers which need to be deleted later.
vector<CodeGenerator*> mock_generators_to_delete_; vector<CodeGenerator*> mock_generators_to_delete_;
NullCodeGenerator* null_generator_;
}; };
class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator {
...@@ -220,7 +224,7 @@ void CommandLineInterfaceTest::SetUp() { ...@@ -220,7 +224,7 @@ void CommandLineInterfaceTest::SetUp() {
mock_generators_to_delete_.push_back(generator); mock_generators_to_delete_.push_back(generator);
cli_.RegisterGenerator("--alt_out", generator, "Alt output."); cli_.RegisterGenerator("--alt_out", generator, "Alt output.");
generator = new NullCodeGenerator(); generator = null_generator_ = new NullCodeGenerator();
mock_generators_to_delete_.push_back(generator); mock_generators_to_delete_.push_back(generator);
cli_.RegisterGenerator("--null_out", generator, "Null output."); cli_.RegisterGenerator("--null_out", generator, "Null output.");
...@@ -338,6 +342,12 @@ void CommandLineInterfaceTest::ExpectGeneratedWithInsertions( ...@@ -338,6 +342,12 @@ void CommandLineInterfaceTest::ExpectGeneratedWithInsertions(
temp_directory_); temp_directory_);
} }
void CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled(
const string& parameter) {
EXPECT_TRUE(null_generator_->called_);
EXPECT_EQ(parameter, null_generator_->parameter_);
}
void CommandLineInterfaceTest::ReadDescriptorSet( void CommandLineInterfaceTest::ReadDescriptorSet(
const string& filename, FileDescriptorSet* descriptor_set) { const string& filename, FileDescriptorSet* descriptor_set) {
string path = temp_directory_ + "/" + filename; string path = temp_directory_ + "/" + filename;
...@@ -481,8 +491,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPath) { ...@@ -481,8 +491,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPath) {
"--proto_path=$tmpdir foo.proto"); "--proto_path=$tmpdir foo.proto");
ExpectNoErrors(); ExpectNoErrors();
EXPECT_TRUE(generator->called_); ExpectNullCodeGeneratorCalled("");
EXPECT_EQ("", generator->parameter_);
} }
TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) { TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
...@@ -495,8 +504,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) { ...@@ -495,8 +504,7 @@ TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
"--proto_path=$tmpdir foo.proto"); "--proto_path=$tmpdir foo.proto");
ExpectNoErrors(); ExpectNoErrors();
EXPECT_TRUE(generator->called_); ExpectNullCodeGeneratorCalled("bar");
EXPECT_EQ("bar", generator->parameter_);
} }
TEST_F(CommandLineInterfaceTest, TrailingBackslash) { TEST_F(CommandLineInterfaceTest, TrailingBackslash) {
......
...@@ -115,8 +115,11 @@ bool Subprocess::Communicate(const Message& input, Message* output, ...@@ -115,8 +115,11 @@ bool Subprocess::Communicate(const Message& input, Message* output,
GOOGLE_CHECK_NE(child_stdin_, -1) << "Must call Start() first."; 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. // 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 input_data = input.SerializeAsString();
string output_data; string output_data;
......
...@@ -120,7 +120,14 @@ void ExtensionSet::RegisterExtension(const MessageLite* containing_type, ...@@ -120,7 +120,14 @@ void ExtensionSet::RegisterExtension(const MessageLite* containing_type,
} }
static bool CallNoArgValidityFunc(const void* arg, int number) { 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, void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
...@@ -130,7 +137,8 @@ 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); GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);
ExtensionInfo info(type, is_repeated, is_packed); ExtensionInfo info(type, is_repeated, is_packed);
info.enum_is_valid = CallNoArgValidityFunc; 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); Register(containing_type, number, info);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment