aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Van Lenten <thomasvl@google.com>2016-04-26 19:11:14 -0400
committerThomas Van Lenten <thomasvl@google.com>2016-04-26 19:11:14 -0400
commit66f074592dc343d6b4f7ad62fda5c26cccf6bf45 (patch)
treed0c0dd00376f74cf985428719766c6fcf2fdbbb5
parent40574479978f80bd86caf44edae5b0a22d596c79 (diff)
parent18b6a321b5fd8f53e1029c436c2ad5dd2d3122df (diff)
downloadprotobuf-66f074592dc343d6b4f7ad62fda5c26cccf6bf45.tar.gz
protobuf-66f074592dc343d6b4f7ad62fda5c26cccf6bf45.tar.bz2
protobuf-66f074592dc343d6b4f7ad62fda5c26cccf6bf45.zip
Merge pull request #1454 from thomasvl/enum_defaults
Proper checking of enum with non zero default
-rw-r--r--objectivec/Tests/GPBMessageTests.m7
-rw-r--r--objectivec/Tests/unittest_objc.proto10
-rw-r--r--src/google/protobuf/compiler/objectivec/objectivec_helpers.cc9
3 files changed, 22 insertions, 4 deletions
diff --git a/objectivec/Tests/GPBMessageTests.m b/objectivec/Tests/GPBMessageTests.m
index 43546156..0779c5ae 100644
--- a/objectivec/Tests/GPBMessageTests.m
+++ b/objectivec/Tests/GPBMessageTests.m
@@ -1947,4 +1947,11 @@
EnumTestMsg_MyEnum_NegTwo);
}
+- (void)testOneBasedEnumHolder {
+ // Test case for https://github.com/google/protobuf/issues/1453
+ // Message with no explicit defaults, but a non zero default for an enum.
+ MessageWithOneBasedEnum *enumMsg = [MessageWithOneBasedEnum message];
+ XCTAssertEqual(enumMsg.enumField, MessageWithOneBasedEnum_OneBasedEnum_One);
+}
+
@end
diff --git a/objectivec/Tests/unittest_objc.proto b/objectivec/Tests/unittest_objc.proto
index 9483cb1d..6bcfbf70 100644
--- a/objectivec/Tests/unittest_objc.proto
+++ b/objectivec/Tests/unittest_objc.proto
@@ -401,3 +401,13 @@ message EnumTestMsg {
repeated MyEnum mumble = 4;
}
+
+// Test case for https://github.com/google/protobuf/issues/1453
+// Message with no explicit defaults, but a non zero default for an enum.
+message MessageWithOneBasedEnum {
+ enum OneBasedEnum {
+ ONE = 1;
+ TWO = 2;
+ }
+ optional OneBasedEnum enum_field = 1;
+}
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
index fda51807..196b39dd 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
@@ -757,10 +757,11 @@ bool HasNonZeroDefaultValue(const FieldDescriptor* field) {
return false;
}
- if (!field->has_default_value()) {
- // No custom default set in the proto file.
- return false;
- }
+ // As much as checking field->has_default_value() seems useful, it isn't
+ // because of enums. proto2 syntax allows the first item in an enum (the
+ // default) to be non zero. So checking field->has_default_value() would
+ // result in missing this non zero default. See MessageWithOneBasedEnum in
+ // objectivec/Tests/unittest_objc.proto for a test Message to confirm this.
// Some proto file set the default to the zero value, so make sure the value
// isn't the zero case.