Commit Michael Poole's patch for explicitly constructing all class fields in
generated code.

diff --git a/CHANGES.txt b/CHANGES.txt
index 35ddd53..5020b78 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -22,6 +22,8 @@
   * GzipInputStream and GzipOutputStream support reading/writing gzip- or
     zlib-compressed streams if zlib is available.
     (google/protobuf/io/gzip_stream.h)
+  * Generated constructors explicitly initialize all fields (to avoid warnings
+    with certain compiler settings).
 
   Java
   * Fixed bug where Message.mergeFrom(Message) failed to merge extensions.
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index 01c8033..5c6d9d2 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -59,3 +59,6 @@
     * MS Visual Studio error format option.
   Brian Olson <brianolson@google.com>
     * gzip/zlib I/O support.
+  Michael Poole <mdpoole@troilus.org>
+    * Fixed warnings about generated constructors not explicitly initializing
+      all fields (only present with certain compiler settings).
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum_field.cc b/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
index 19779a8..a78bf88 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_enum_field.cc
@@ -218,7 +218,11 @@
 
 void RepeatedEnumFieldGenerator::
 GenerateInitializer(io::Printer* printer) const {
-  // Not needed for repeated fields.
+  printer->Print(variables_, ",\n$name$_()");
+  if (descriptor_->options().packed() &&
+      descriptor_->file()->options().optimize_for() == FileOptions::SPEED) {
+    printer->Print(variables_, ",\n_$name$_cached_byte_size_()");
+  }
 }
 
 void RepeatedEnumFieldGenerator::
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc
index c6843e9..d2f7680 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message.cc
@@ -753,6 +753,7 @@
   }
 
   printer->Print(
+    "_unknown_fields_(),\n"
     "_cached_size_(0)");
 
   // Write the initializers for each field.
diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
index 7d57a6d..e2d2370 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
@@ -213,7 +213,7 @@
 
 void RepeatedMessageFieldGenerator::
 GenerateInitializer(io::Printer* printer) const {
-  // Not needed for repeated fields.
+  printer->Print(variables_, ",\n$name$_()");
 }
 
 void RepeatedMessageFieldGenerator::
diff --git a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
index 768d30c..57244c5 100644
--- a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
@@ -283,7 +283,11 @@
 
 void RepeatedPrimitiveFieldGenerator::
 GenerateInitializer(io::Printer* printer) const {
-  // Not needed for repeated fields.
+  printer->Print(variables_, ",\n$name$_()");
+  if (descriptor_->options().packed() &&
+      descriptor_->file()->options().optimize_for() == FileOptions::SPEED) {
+    printer->Print(variables_, ",\n_$name$_cached_byte_size_()");
+  }
 }
 
 void RepeatedPrimitiveFieldGenerator::
diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
index 200e3d6..51c5c6f 100644
--- a/src/google/protobuf/compiler/cpp/cpp_string_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
@@ -361,7 +361,7 @@
 
 void RepeatedStringFieldGenerator::
 GenerateInitializer(io::Printer* printer) const {
-  // Not needed for repeated fields.
+  printer->Print(variables_, ",\n$name$_()");
 }
 
 void RepeatedStringFieldGenerator::
diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc
index 0df3f3b..16b4442 100644
--- a/src/google/protobuf/descriptor.pb.cc
+++ b/src/google/protobuf/descriptor.pb.cc
@@ -560,7 +560,9 @@
 
 FileDescriptorSet::FileDescriptorSet()
   : ::google::protobuf::Message(),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    file_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -568,7 +570,9 @@
 
 FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from)
   : ::google::protobuf::Message(),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    file_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -740,9 +744,15 @@
 
 FileDescriptorProto::FileDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     package_(const_cast< ::std::string*>(&_default_package_)),
+    dependency_(),
+    message_type_(),
+    enum_type_(),
+    service_(),
+    extension_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
@@ -752,9 +762,15 @@
 
 FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     package_(const_cast< ::std::string*>(&_default_package_)),
+    dependency_(),
+    message_type_(),
+    enum_type_(),
+    service_(),
+    extension_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
@@ -1160,6 +1176,7 @@
 
 DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     start_(0),
     end_(0) {
@@ -1170,6 +1187,7 @@
 
 DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     start_(0),
     end_(0) {
@@ -1377,8 +1395,14 @@
 
 DescriptorProto::DescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    field_(),
+    extension_(),
+    nested_type_(),
+    enum_type_(),
+    extension_range_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
@@ -1388,8 +1412,14 @@
 
 DescriptorProto::DescriptorProto(const DescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    field_(),
+    extension_(),
+    nested_type_(),
+    enum_type_(),
+    extension_range_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
@@ -1841,6 +1871,7 @@
 
 FieldDescriptorProto::FieldDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     number_(0),
@@ -1858,6 +1889,7 @@
 
 FieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     number_(0),
@@ -2280,8 +2312,10 @@
 
 EnumDescriptorProto::EnumDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    value_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
@@ -2291,8 +2325,10 @@
 
 EnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    value_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
@@ -2536,6 +2572,7 @@
 
 EnumValueDescriptorProto::EnumValueDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     number_(0),
@@ -2548,6 +2585,7 @@
 
 EnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     number_(0),
@@ -2792,8 +2830,10 @@
 
 ServiceDescriptorProto::ServiceDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    method_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
@@ -2803,8 +2843,10 @@
 
 ServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
+    method_(),
     options_(NULL) {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
@@ -3049,6 +3091,7 @@
 
 MethodDescriptorProto::MethodDescriptorProto()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     input_type_(const_cast< ::std::string*>(&_default_input_type_)),
@@ -3062,6 +3105,7 @@
 
 MethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_(const_cast< ::std::string*>(&_default_name_)),
     input_type_(const_cast< ::std::string*>(&_default_input_type_)),
@@ -3371,11 +3415,13 @@
     _extensions_(&FileOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
     java_package_(const_cast< ::std::string*>(&_default_java_package_)),
     java_outer_classname_(const_cast< ::std::string*>(&_default_java_outer_classname_)),
     java_multiple_files_(false),
-    optimize_for_(2) {
+    optimize_for_(2),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -3386,11 +3432,13 @@
     _extensions_(&FileOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
     java_package_(const_cast< ::std::string*>(&_default_java_package_)),
     java_outer_classname_(const_cast< ::std::string*>(&_default_java_outer_classname_)),
     java_multiple_files_(false),
-    optimize_for_(2) {
+    optimize_for_(2),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -3711,8 +3759,10 @@
     _extensions_(&MessageOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
-    message_set_wire_format_(false) {
+    message_set_wire_format_(false),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -3723,8 +3773,10 @@
     _extensions_(&MessageOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
-    message_set_wire_format_(false) {
+    message_set_wire_format_(false),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -3963,10 +4015,12 @@
     _extensions_(&FieldOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
     ctype_(1),
     packed_(false),
-    experimental_map_key_(const_cast< ::std::string*>(&_default_experimental_map_key_)) {
+    experimental_map_key_(const_cast< ::std::string*>(&_default_experimental_map_key_)),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -3977,10 +4031,12 @@
     _extensions_(&FieldOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
+    _unknown_fields_(),
     _cached_size_(0),
     ctype_(1),
     packed_(false),
-    experimental_map_key_(const_cast< ::std::string*>(&_default_experimental_map_key_)) {
+    experimental_map_key_(const_cast< ::std::string*>(&_default_experimental_map_key_)),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -4265,7 +4321,9 @@
     _extensions_(&EnumOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -4276,7 +4334,9 @@
     _extensions_(&EnumOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -4458,7 +4518,9 @@
     _extensions_(&EnumValueOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -4469,7 +4531,9 @@
     _extensions_(&EnumValueOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -4651,7 +4715,9 @@
     _extensions_(&ServiceOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -4662,7 +4728,9 @@
     _extensions_(&ServiceOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -4844,7 +4912,9 @@
     _extensions_(&MethodOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
 
@@ -4855,7 +4925,9 @@
     _extensions_(&MethodOptions_descriptor_,
                  ::google::protobuf::DescriptorPool::generated_pool(),
                  ::google::protobuf::MessageFactory::generated_factory()),
-    _cached_size_(0) {
+    _unknown_fields_(),
+    _cached_size_(0),
+    uninterpreted_option_() {
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
   MergeFrom(from);
 }
@@ -5035,6 +5107,7 @@
 
 UninterpretedOption_NamePart::UninterpretedOption_NamePart()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_part_(const_cast< ::std::string*>(&_default_name_part_)),
     is_extension_(false) {
@@ -5045,6 +5118,7 @@
 
 UninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
     name_part_(const_cast< ::std::string*>(&_default_name_part_)),
     is_extension_(false) {
@@ -5254,7 +5328,9 @@
 const ::std::string UninterpretedOption::_default_string_value_;
 UninterpretedOption::UninterpretedOption()
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
+    name_(),
     identifier_value_(const_cast< ::std::string*>(&_default_identifier_value_)),
     positive_int_value_(GOOGLE_ULONGLONG(0)),
     negative_int_value_(GOOGLE_LONGLONG(0)),
@@ -5267,7 +5343,9 @@
 
 UninterpretedOption::UninterpretedOption(const UninterpretedOption& from)
   : ::google::protobuf::Message(),
+    _unknown_fields_(),
     _cached_size_(0),
+    name_(),
     identifier_value_(const_cast< ::std::string*>(&_default_identifier_value_)),
     positive_int_value_(GOOGLE_ULONGLONG(0)),
     negative_int_value_(GOOGLE_LONGLONG(0)),