| Index: third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc | 
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc | 
| index 1d7434578ce87ad816d3c6e4dbf4068c2d931817..2874de7d39f8201d9ffc797b82aafe4f1094accb 100644 | 
| --- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc | 
| +++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc | 
| @@ -46,20 +46,19 @@ namespace cpp { | 
| namespace { | 
|  | 
| void SetStringVariables(const FieldDescriptor* descriptor, | 
| -                        map<string, string>* variables, | 
| +                        std::map<string, string>* variables, | 
| const Options& options) { | 
| SetCommonFieldVariables(descriptor, variables, options); | 
| (*variables)["default"] = DefaultValue(descriptor); | 
| (*variables)["default_length"] = | 
| SimpleItoa(descriptor->default_value_string().length()); | 
| -  string default_variable_string = | 
| +  string default_variable_string = "_default_" + FieldName(descriptor) + "_"; | 
| +  (*variables)["default_variable_name"] = default_variable_string; | 
| +  (*variables)["default_variable"] = | 
| descriptor->default_value_string().empty() | 
| ? "&::google::protobuf::internal::GetEmptyStringAlreadyInited()" | 
| -          : "_default_" + FieldName(descriptor) + "_"; | 
| -  (*variables)["default_variable"] = default_variable_string; | 
| -  (*variables)["default_value_init"] = | 
| -      descriptor->default_value_string().empty() | 
| -      ? "" : "*" + default_variable_string; | 
| +          : "&" + (*variables)["classname"] + "::" + default_variable_string + | 
| +                ".get()"; | 
| (*variables)["pointer_type"] = | 
| descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char"; | 
| // NOTE: Escaped here to unblock proto1->proto2 migration. | 
| @@ -104,7 +103,9 @@ GeneratePrivateMembers(io::Printer* printer) const { | 
| void StringFieldGenerator:: | 
| GenerateStaticMembers(io::Printer* printer) const { | 
| if (!descriptor_->default_value_string().empty()) { | 
| -    printer->Print(variables_, "static ::std::string* $default_variable$;\n"); | 
| +    printer->Print(variables_, | 
| +                   "static ::google::protobuf::internal::ExplicitlyConstructed< ::std::string>" | 
| +                   " $default_variable_name$;\n"); | 
| } | 
| } | 
|  | 
| @@ -140,7 +141,16 @@ GenerateAccessorDeclarations(io::Printer* printer) const { | 
|  | 
| printer->Print(variables_, | 
| "$deprecated_attr$const ::std::string& $name$() const;\n" | 
| -    "$deprecated_attr$void set_$name$(const ::std::string& value);\n" | 
| +    "$deprecated_attr$void set_$name$(const ::std::string& value);\n"); | 
| + | 
| +  if (!SupportsArenas(descriptor_)) { | 
| +    printer->Print(variables_, | 
| +      "#if LANG_CXX11\n" | 
| +      "$deprecated_attr$void set_$name$(::std::string&& value);\n" | 
| +      "#endif\n"); | 
| +  } | 
| + | 
| +  printer->Print(variables_, | 
| "$deprecated_attr$void set_$name$(const char* value);\n" | 
| "$deprecated_attr$void set_$name$(const $pointer_type$* value, size_t size)" | 
| ";\n" | 
| @@ -165,117 +175,129 @@ GenerateAccessorDeclarations(io::Printer* printer) const { | 
| void StringFieldGenerator:: | 
| GenerateInlineAccessorDefinitions(io::Printer* printer, | 
| bool is_inline) const { | 
| -  map<string, string> variables(variables_); | 
| -  variables["inline"] = is_inline ? "inline" : ""; | 
| +  std::map<string, string> variables(variables_); | 
| +  variables["inline"] = is_inline ? "inline " : ""; | 
| if (SupportsArenas(descriptor_)) { | 
| -    printer->Print(variables, | 
| -      "$inline$ const ::std::string& $classname$::$name$() const {\n" | 
| -      "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| -      "  return $name$_.Get($default_variable$);\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.Set($default_variable$, value, GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const char* value) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.Set($default_variable$, $string_piece$(value),\n" | 
| -      "              GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ " | 
| -      "void $classname$::set_$name$(const $pointer_type$* value,\n" | 
| -      "    size_t size) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.Set($default_variable$, $string_piece$(\n" | 
| -      "      reinterpret_cast<const char*>(value), size), GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::mutable_$name$() {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| -      "  return $name$_.Mutable($default_variable$, GetArenaNoVirtual());\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::$release_name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| -      "  $clear_hasbit$\n" | 
| -      "  return $name$_.Release($default_variable$, GetArenaNoVirtual());\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::unsafe_arena_release_$name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" | 
| -      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| -      "  $clear_hasbit$\n" | 
| -      "  return $name$_.UnsafeArenaRelease($default_variable$,\n" | 
| -      "      GetArenaNoVirtual());\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| -      "  if ($name$ != NULL) {\n" | 
| -      "    $set_hasbit$\n" | 
| -      "  } else {\n" | 
| -      "    $clear_hasbit$\n" | 
| -      "  }\n" | 
| -      "  $name$_.SetAllocated($default_variable$, $name$,\n" | 
| -      "      GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$(\n" | 
| -      "    ::std::string* $name$) {\n" | 
| -      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| -      "  if ($name$ != NULL) {\n" | 
| -      "    $set_hasbit$\n" | 
| -      "  } else {\n" | 
| -      "    $clear_hasbit$\n" | 
| -      "  }\n" | 
| -      "  $name$_.UnsafeArenaSetAllocated($default_variable$,\n" | 
| -      "      $name$, GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" | 
| -      "$full_name$)\n" | 
| -      "}\n"); | 
| +    printer->Print( | 
| +        variables, | 
| +        "$inline$const ::std::string& $classname$::$name$() const {\n" | 
| +        "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| +        "  return $name$_.Get();\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const ::std::string& value) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.Set($default_variable$, value, GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const char* value) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.Set($default_variable$, $string_piece$(value),\n" | 
| +        "              GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$" | 
| +        "void $classname$::set_$name$(const $pointer_type$* value,\n" | 
| +        "    size_t size) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.Set($default_variable$, $string_piece$(\n" | 
| +        "      reinterpret_cast<const char*>(value), size), " | 
| +        "GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::mutable_$name$() {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| +        "  return $name$_.Mutable($default_variable$, GetArenaNoVirtual());\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::$release_name$() {\n" | 
| +        "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| +        "  $clear_hasbit$\n" | 
| +        "  return $name$_.Release($default_variable$, GetArenaNoVirtual());\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::unsafe_arena_release_$name$() {\n" | 
| +        "  // " | 
| +        "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" | 
| +        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| +        "  $clear_hasbit$\n" | 
| +        "  return $name$_.UnsafeArenaRelease($default_variable$,\n" | 
| +        "      GetArenaNoVirtual());\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| +        "  if ($name$ != NULL) {\n" | 
| +        "    $set_hasbit$\n" | 
| +        "  } else {\n" | 
| +        "    $clear_hasbit$\n" | 
| +        "  }\n" | 
| +        "  $name$_.SetAllocated($default_variable$, $name$,\n" | 
| +        "      GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::unsafe_arena_set_allocated_$name$(\n" | 
| +        "    ::std::string* $name$) {\n" | 
| +        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| +        "  if ($name$ != NULL) {\n" | 
| +        "    $set_hasbit$\n" | 
| +        "  } else {\n" | 
| +        "    $clear_hasbit$\n" | 
| +        "  }\n" | 
| +        "  $name$_.UnsafeArenaSetAllocated($default_variable$,\n" | 
| +        "      $name$, GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" | 
| +        "$full_name$)\n" | 
| +        "}\n"); | 
| } else { | 
| // No-arena case. | 
| -    printer->Print(variables, | 
| -      "$inline$ const ::std::string& $classname$::$name$() const {\n" | 
| -      "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| -      "  return $name$_.GetNoArena($default_variable$);\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.SetNoArena($default_variable$, value);\n" | 
| -      "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const char* value) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.SetNoArena($default_variable$, $string_piece$(value));\n" | 
| -      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ " | 
| -      "void $classname$::set_$name$(const $pointer_type$* value, " | 
| -      "size_t size) {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  $name$_.SetNoArena($default_variable$,\n" | 
| -      "      $string_piece$(reinterpret_cast<const char*>(value), size));\n" | 
| -      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::mutable_$name$() {\n" | 
| -      "  $set_hasbit$\n" | 
| -      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| -      "  return $name$_.MutableNoArena($default_variable$);\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::$release_name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| -      "  $clear_hasbit$\n" | 
| -      "  return $name$_.ReleaseNoArena($default_variable$);\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| -      "  if ($name$ != NULL) {\n" | 
| -      "    $set_hasbit$\n" | 
| -      "  } else {\n" | 
| -      "    $clear_hasbit$\n" | 
| -      "  }\n" | 
| -      "  $name$_.SetAllocatedNoArena($default_variable$, $name$);\n" | 
| -      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| -      "}\n"); | 
| +    printer->Print( | 
| +        variables, | 
| +        "$inline$const ::std::string& $classname$::$name$() const {\n" | 
| +        "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| +        "  return $name$_.GetNoArena();\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const ::std::string& value) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.SetNoArena($default_variable$, value);\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "}\n" | 
| +        "#if LANG_CXX11\n" | 
| +        "$inline$void $classname$::set_$name$(::std::string&& value) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.SetNoArena(\n" | 
| +        "    $default_variable$, ::std::move(value));\n" | 
| +        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" | 
| +        "}\n" | 
| +        "#endif\n" | 
| +        "$inline$void $classname$::set_$name$(const char* value) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.SetNoArena($default_variable$, $string_piece$(value));\n" | 
| +        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$" | 
| +        "void $classname$::set_$name$(const $pointer_type$* value, " | 
| +        "size_t size) {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  $name$_.SetNoArena($default_variable$,\n" | 
| +        "      $string_piece$(reinterpret_cast<const char*>(value), size));\n" | 
| +        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::mutable_$name$() {\n" | 
| +        "  $set_hasbit$\n" | 
| +        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| +        "  return $name$_.MutableNoArena($default_variable$);\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::$release_name$() {\n" | 
| +        "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| +        "  $clear_hasbit$\n" | 
| +        "  return $name$_.ReleaseNoArena($default_variable$);\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| +        "  if ($name$ != NULL) {\n" | 
| +        "    $set_hasbit$\n" | 
| +        "  } else {\n" | 
| +        "    $clear_hasbit$\n" | 
| +        "  }\n" | 
| +        "  $name$_.SetAllocatedNoArena($default_variable$, $name$);\n" | 
| +        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| +        "}\n"); | 
| } | 
| } | 
|  | 
| @@ -284,7 +306,8 @@ GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { | 
| if (!descriptor_->default_value_string().empty()) { | 
| // Initialized in GenerateDefaultInstanceAllocator. | 
| printer->Print(variables_, | 
| -      "::std::string* $classname$::$default_variable$ = NULL;\n"); | 
| +                   "::google::protobuf::internal::ExplicitlyConstructed< ::std::string> " | 
| +                   "$classname$::$default_variable_name$;\n"); | 
| } | 
| } | 
|  | 
| @@ -314,6 +337,52 @@ GenerateClearingCode(io::Printer* printer) const { | 
| } | 
|  | 
| void StringFieldGenerator:: | 
| +GenerateMessageClearingCode(io::Printer* printer) const { | 
| +  // Two-dimension specialization here: supporting arenas, field presence, or | 
| +  // not, and default value is the empty string or not. Complexity here ensures | 
| +  // the minimal number of branches / amount of extraneous code at runtime | 
| +  // (given that the below methods are inlined one-liners)! | 
| + | 
| +  // If we have field presence, then the Clear() method of the protocol buffer | 
| +  // will have checked that this field is set.  If so, we can avoid redundant | 
| +  // checks against default_variable. | 
| +  const bool must_be_present = HasFieldPresence(descriptor_->file()); | 
| + | 
| +  if (must_be_present) { | 
| +    printer->Print(variables_, | 
| +      "GOOGLE_DCHECK(!$name$_.IsDefault($default_variable$));\n"); | 
| +  } | 
| + | 
| +  if (SupportsArenas(descriptor_)) { | 
| +    if (descriptor_->default_value_string().empty()) { | 
| +      printer->Print(variables_, | 
| +        "$name$_.ClearToEmpty($default_variable$, GetArenaNoVirtual());\n"); | 
| +    } else { | 
| +      printer->Print(variables_, | 
| +        "$name$_.ClearToDefault($default_variable$, GetArenaNoVirtual());\n"); | 
| +    } | 
| +  } else if (must_be_present) { | 
| +    // When Arenas are disabled and field presence has been checked, we can | 
| +    // safely treat the ArenaStringPtr as a string*. | 
| +    if (descriptor_->default_value_string().empty()) { | 
| +      printer->Print(variables_, | 
| +        "(*$name$_.UnsafeRawStringPointer())->clear();\n"); | 
| +    } else { | 
| +      printer->Print(variables_, | 
| +        "(*$name$_.UnsafeRawStringPointer())->assign(*$default_variable$);\n"); | 
| +    } | 
| +  } else { | 
| +    if (descriptor_->default_value_string().empty()) { | 
| +      printer->Print(variables_, | 
| +        "$name$_.ClearToEmptyNoArena($default_variable$);\n"); | 
| +    } else { | 
| +      printer->Print(variables_, | 
| +        "$name$_.ClearToDefaultNoArena($default_variable$);\n"); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| +void StringFieldGenerator:: | 
| GenerateMergingCode(io::Printer* printer) const { | 
| if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) { | 
| // TODO(gpike): improve this | 
| @@ -337,10 +406,40 @@ GenerateConstructorCode(io::Printer* printer) const { | 
| } | 
|  | 
| void StringFieldGenerator:: | 
| +GenerateCopyConstructorCode(io::Printer* printer) const { | 
| +  GenerateConstructorCode(printer); | 
| + | 
| +  if (HasFieldPresence(descriptor_->file())) { | 
| +    printer->Print(variables_, | 
| +        "if (from.has_$name$()) {\n"); | 
| +  } else { | 
| +    printer->Print(variables_, | 
| +        "if (from.$name$().size() > 0) {\n"); | 
| +  } | 
| + | 
| +  printer->Indent(); | 
| + | 
| +  if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) { | 
| +    // TODO(gpike): improve this | 
| +    printer->Print(variables_, | 
| +      "$name$_.Set($default_variable$, from.$name$(),\n" | 
| +      "  GetArenaNoVirtual());\n"); | 
| +  } else { | 
| +    printer->Print(variables_, | 
| +      "$name$_.AssignWithDefault($default_variable$, from.$name$_);\n"); | 
| +  } | 
| + | 
| +  printer->Outdent(); | 
| +  printer->Print("}\n"); | 
| +} | 
| + | 
| +void StringFieldGenerator:: | 
| GenerateDestructorCode(io::Printer* printer) const { | 
| if (SupportsArenas(descriptor_)) { | 
| +    // The variable |arena| is defined by the enclosing code. | 
| +    // See MessageGenerator::GenerateSharedDestructorCode. | 
| printer->Print(variables_, | 
| -      "$name$_.Destroy($default_variable$, GetArenaNoVirtual());\n"); | 
| +      "$name$_.Destroy($default_variable$, arena);\n"); | 
| } else { | 
| printer->Print(variables_, | 
| "$name$_.DestroyNoArena($default_variable$);\n"); | 
| @@ -351,8 +450,9 @@ void StringFieldGenerator:: | 
| GenerateDefaultInstanceAllocator(io::Printer* printer) const { | 
| if (!descriptor_->default_value_string().empty()) { | 
| printer->Print(variables_, | 
| -      "$classname$::$default_variable$ =\n" | 
| -      "    new ::std::string($default$, $default_length$);\n"); | 
| +                   "$classname$::$default_variable_name$.DefaultConstruct();\n" | 
| +                   "*$classname$::$default_variable_name$.get_mutable() = " | 
| +                   "::std::string($default$, $default_length$);\n"); | 
| } | 
| } | 
|  | 
| @@ -360,7 +460,7 @@ void StringFieldGenerator:: | 
| GenerateShutdownCode(io::Printer* printer) const { | 
| if (!descriptor_->default_value_string().empty()) { | 
| printer->Print(variables_, | 
| -      "delete $classname$::$default_variable$;\n"); | 
| +                   "$classname$::$default_variable_name$.Shutdown();\n"); | 
| } | 
| } | 
|  | 
| @@ -425,185 +525,203 @@ StringOneofFieldGenerator::~StringOneofFieldGenerator() {} | 
| void StringOneofFieldGenerator:: | 
| GenerateInlineAccessorDefinitions(io::Printer* printer, | 
| bool is_inline) const { | 
| -  map<string, string> variables(variables_); | 
| -  variables["inline"] = is_inline ? "inline" : ""; | 
| +  std::map<string, string> variables(variables_); | 
| +  variables["inline"] = is_inline ? "inline " : ""; | 
| if (SupportsArenas(descriptor_)) { | 
| -    printer->Print(variables, | 
| -      "$inline$ const ::std::string& $classname$::$name$() const {\n" | 
| -      "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| -      "  if (has_$name$()) {\n" | 
| -      "    return $oneof_prefix$$name$_.Get($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  return *$default_variable$;\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.Set($default_variable$, value,\n" | 
| -      "      GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const char* value) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.Set($default_variable$,\n" | 
| -      "      $string_piece$(value), GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ " | 
| -      "void $classname$::set_$name$(const $pointer_type$* value,\n" | 
| -      "                             size_t size) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.Set($default_variable$, $string_piece$(\n" | 
| -      "      reinterpret_cast<const char*>(value), size),\n" | 
| -      "      GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::mutable_$name$() {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  return $oneof_prefix$$name$_.Mutable($default_variable$,\n" | 
| -      "      GetArenaNoVirtual());\n" | 
| -      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::$release_name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| -      "  if (has_$name$()) {\n" | 
| -      "    clear_has_$oneof_name$();\n" | 
| -      "    return $oneof_prefix$$name$_.Release($default_variable$,\n" | 
| -      "        GetArenaNoVirtual());\n" | 
| -      "  } else {\n" | 
| -      "    return NULL;\n" | 
| -      "  }\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::unsafe_arena_release_$name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" | 
| -      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| -      "  if (has_$name$()) {\n" | 
| -      "    clear_has_$oneof_name$();\n" | 
| -      "    return $oneof_prefix$$name$_.UnsafeArenaRelease(\n" | 
| -      "        $default_variable$, GetArenaNoVirtual());\n" | 
| -      "  } else {\n" | 
| -      "    return NULL;\n" | 
| -      "  }\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  clear_$oneof_name$();\n" | 
| -      "  if ($name$ != NULL) {\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.SetAllocated($default_variable$, $name$,\n" | 
| -      "        GetArenaNoVirtual());\n" | 
| -      "  }\n" | 
| -      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$(" | 
| -      "::std::string* $name$) {\n" | 
| -      "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  clear_$oneof_name$();\n" | 
| -      "  if ($name$) {\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeArenaSetAllocated($default_variable$, " | 
| -      "$name$, GetArenaNoVirtual());\n" | 
| -      "  }\n" | 
| -      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" | 
| -      "$full_name$)\n" | 
| -      "}\n"); | 
| +    printer->Print( | 
| +        variables, | 
| +        "$inline$const ::std::string& $classname$::$name$() const {\n" | 
| +        "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| +        "  if (has_$name$()) {\n" | 
| +        "    return $oneof_prefix$$name$_.Get();\n" | 
| +        "  }\n" | 
| +        "  return *$default_variable$;\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const ::std::string& value) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.Set($default_variable$, value,\n" | 
| +        "      GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const char* value) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.Set($default_variable$,\n" | 
| +        "      $string_piece$(value), GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$" | 
| +        "void $classname$::set_$name$(const $pointer_type$* value,\n" | 
| +        "                             size_t size) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.Set($default_variable$, $string_piece$(\n" | 
| +        "      reinterpret_cast<const char*>(value), size),\n" | 
| +        "      GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::mutable_$name$() {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  return $oneof_prefix$$name$_.Mutable($default_variable$,\n" | 
| +        "      GetArenaNoVirtual());\n" | 
| +        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::$release_name$() {\n" | 
| +        "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| +        "  if (has_$name$()) {\n" | 
| +        "    clear_has_$oneof_name$();\n" | 
| +        "    return $oneof_prefix$$name$_.Release($default_variable$,\n" | 
| +        "        GetArenaNoVirtual());\n" | 
| +        "  } else {\n" | 
| +        "    return NULL;\n" | 
| +        "  }\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::unsafe_arena_release_$name$() {\n" | 
| +        "  // " | 
| +        "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" | 
| +        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| +        "  if (has_$name$()) {\n" | 
| +        "    clear_has_$oneof_name$();\n" | 
| +        "    return $oneof_prefix$$name$_.UnsafeArenaRelease(\n" | 
| +        "        $default_variable$, GetArenaNoVirtual());\n" | 
| +        "  } else {\n" | 
| +        "    return NULL;\n" | 
| +        "  }\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  clear_$oneof_name$();\n" | 
| +        "  if ($name$ != NULL) {\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.SetAllocated($default_variable$, $name$,\n" | 
| +        "        GetArenaNoVirtual());\n" | 
| +        "  }\n" | 
| +        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::unsafe_arena_set_allocated_$name$(" | 
| +        "::std::string* $name$) {\n" | 
| +        "  GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  clear_$oneof_name$();\n" | 
| +        "  if ($name$) {\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeArenaSetAllocated($default_variable$, " | 
| +        "$name$, GetArenaNoVirtual());\n" | 
| +        "  }\n" | 
| +        "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" | 
| +        "$full_name$)\n" | 
| +        "}\n"); | 
| } else { | 
| // No-arena case. | 
| -    printer->Print(variables, | 
| -      "$inline$ const ::std::string& $classname$::$name$() const {\n" | 
| -      "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| -      "  if (has_$name$()) {\n" | 
| -      "    return $oneof_prefix$$name$_.GetNoArena($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  return *$default_variable$;\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const ::std::string& value) {\n" | 
| -      "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.SetNoArena($default_variable$, value);\n" | 
| -      "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_$name$(const char* value) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.SetNoArena($default_variable$,\n" | 
| -      "      $string_piece$(value));\n" | 
| -      "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ " | 
| -      "void $classname$::set_$name$(const $pointer_type$* value, size_t size) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  $oneof_prefix$$name$_.SetNoArena($default_variable$, $string_piece$(\n" | 
| -      "      reinterpret_cast<const char*>(value), size));\n" | 
| -      "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::mutable_$name$() {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    clear_$oneof_name$();\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| -      "  return $oneof_prefix$$name$_.MutableNoArena($default_variable$);\n" | 
| -      "}\n" | 
| -      "$inline$ ::std::string* $classname$::$release_name$() {\n" | 
| -      "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| -      "  if (has_$name$()) {\n" | 
| -      "    clear_has_$oneof_name$();\n" | 
| -      "    return $oneof_prefix$$name$_.ReleaseNoArena($default_variable$);\n" | 
| -      "  } else {\n" | 
| -      "    return NULL;\n" | 
| -      "  }\n" | 
| -      "}\n" | 
| -      "$inline$ void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| -      "  if (!has_$name$()) {\n" | 
| -      "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| -      "  }\n" | 
| -      "  clear_$oneof_name$();\n" | 
| -      "  if ($name$ != NULL) {\n" | 
| -      "    set_has_$name$();\n" | 
| -      "    $oneof_prefix$$name$_.SetAllocatedNoArena($default_variable$,\n" | 
| -      "        $name$);\n" | 
| -      "  }\n" | 
| -      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| -      "}\n"); | 
| +    printer->Print( | 
| +        variables, | 
| +        "$inline$const ::std::string& $classname$::$name$() const {\n" | 
| +        "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| +        "  if (has_$name$()) {\n" | 
| +        "    return $oneof_prefix$$name$_.GetNoArena();\n" | 
| +        "  }\n" | 
| +        "  return *$default_variable$;\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_$name$(const ::std::string& value) {\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.SetNoArena($default_variable$, value);\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "}\n" | 
| +        "#if LANG_CXX11\n" | 
| +        "$inline$void $classname$::set_$name$(::std::string&& value) {\n" | 
| +        "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.SetNoArena(\n" | 
| +        "    $default_variable$, ::std::move(value));\n" | 
| +        "  // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" | 
| +        "}\n" | 
| +        "#endif\n" | 
| +        "$inline$void $classname$::set_$name$(const char* value) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.SetNoArena($default_variable$,\n" | 
| +        "      $string_piece$(value));\n" | 
| +        "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$" | 
| +        "void $classname$::set_$name$(const $pointer_type$* value, size_t " | 
| +        "size) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  $oneof_prefix$$name$_.SetNoArena($default_variable$, " | 
| +        "$string_piece$(\n" | 
| +        "      reinterpret_cast<const char*>(value), size));\n" | 
| +        "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::mutable_$name$() {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    clear_$oneof_name$();\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| +        "  return $oneof_prefix$$name$_.MutableNoArena($default_variable$);\n" | 
| +        "}\n" | 
| +        "$inline$::std::string* $classname$::$release_name$() {\n" | 
| +        "  // @@protoc_insertion_point(field_release:$full_name$)\n" | 
| +        "  if (has_$name$()) {\n" | 
| +        "    clear_has_$oneof_name$();\n" | 
| +        "    return $oneof_prefix$$name$_.ReleaseNoArena($default_variable$);\n" | 
| +        "  } else {\n" | 
| +        "    return NULL;\n" | 
| +        "  }\n" | 
| +        "}\n" | 
| +        "$inline$void $classname$::set_allocated_$name$(::std::string* $name$) {\n" | 
| +        "  if (!has_$name$()) {\n" | 
| +        "    $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" | 
| +        "  }\n" | 
| +        "  clear_$oneof_name$();\n" | 
| +        "  if ($name$ != NULL) {\n" | 
| +        "    set_has_$name$();\n" | 
| +        "    $oneof_prefix$$name$_.SetAllocatedNoArena($default_variable$,\n" | 
| +        "        $name$);\n" | 
| +        "  }\n" | 
| +        "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" | 
| +        "}\n"); | 
| } | 
| } | 
|  | 
| void StringOneofFieldGenerator:: | 
| GenerateClearingCode(io::Printer* printer) const { | 
| -  map<string, string> variables(variables_); | 
| +  std::map<string, string> variables(variables_); | 
| if (dependent_field_) { | 
| variables["this_message"] = DependentBaseDownCast(); | 
| // This clearing code may be in the dependent base class. If the default | 
| @@ -612,8 +730,9 @@ GenerateClearingCode(io::Printer* printer) const { | 
| // default value's global singleton instance. See SetStringVariables() for | 
| // possible values of default_variable. | 
| if (!descriptor_->default_value_string().empty()) { | 
| -      variables["default_variable"] = | 
| -          DependentBaseDownCast() + variables["default_variable"]; | 
| +      variables["default_variable"] = "&" + DependentBaseDownCast() + | 
| +                                      variables["default_variable_name"] + | 
| +                                      ".get()"; | 
| } | 
| } else { | 
| variables["this_message"] = ""; | 
| @@ -630,15 +749,21 @@ GenerateClearingCode(io::Printer* printer) const { | 
| } | 
|  | 
| void StringOneofFieldGenerator:: | 
| +GenerateMessageClearingCode(io::Printer* printer) const { | 
| +  return GenerateClearingCode(printer); | 
| +} | 
| + | 
| +void StringOneofFieldGenerator:: | 
| GenerateSwappingCode(io::Printer* printer) const { | 
| // Don't print any swapping code. Swapping the union will swap this field. | 
| } | 
|  | 
| void StringOneofFieldGenerator:: | 
| GenerateConstructorCode(io::Printer* printer) const { | 
| -  printer->Print(variables_, | 
| -    "  $classname$_default_oneof_instance_->$name$_.UnsafeSetDefault(" | 
| -    "$default_variable$);\n"); | 
| +  printer->Print( | 
| +      variables_, | 
| +      "$classname$_default_oneof_instance_.$name$_.UnsafeSetDefault(\n" | 
| +      "    $default_variable$);\n"); | 
| } | 
|  | 
| void StringOneofFieldGenerator:: | 
| @@ -731,56 +856,56 @@ GenerateAccessorDeclarations(io::Printer* printer) const { | 
| void RepeatedStringFieldGenerator:: | 
| GenerateInlineAccessorDefinitions(io::Printer* printer, | 
| bool is_inline) const { | 
| -  map<string, string> variables(variables_); | 
| -  variables["inline"] = is_inline ? "inline" : ""; | 
| +  std::map<string, string> variables(variables_); | 
| +  variables["inline"] = is_inline ? "inline " : ""; | 
| printer->Print(variables, | 
| -    "$inline$ const ::std::string& $classname$::$name$(int index) const {\n" | 
| +    "$inline$const ::std::string& $classname$::$name$(int index) const {\n" | 
| "  // @@protoc_insertion_point(field_get:$full_name$)\n" | 
| "  return $name$_.$cppget$(index);\n" | 
| "}\n" | 
| -    "$inline$ ::std::string* $classname$::mutable_$name$(int index) {\n" | 
| +    "$inline$::std::string* $classname$::mutable_$name$(int index) {\n" | 
| "  // @@protoc_insertion_point(field_mutable:$full_name$)\n" | 
| "  return $name$_.Mutable(index);\n" | 
| "}\n" | 
| -    "$inline$ void $classname$::set_$name$(int index, const ::std::string& value) {\n" | 
| +    "$inline$void $classname$::set_$name$(int index, const ::std::string& value) {\n" | 
| "  // @@protoc_insertion_point(field_set:$full_name$)\n" | 
| "  $name$_.Mutable(index)->assign(value);\n" | 
| "}\n" | 
| -    "$inline$ void $classname$::set_$name$(int index, const char* value) {\n" | 
| +    "$inline$void $classname$::set_$name$(int index, const char* value) {\n" | 
| "  $name$_.Mutable(index)->assign(value);\n" | 
| "  // @@protoc_insertion_point(field_set_char:$full_name$)\n" | 
| "}\n" | 
| -    "$inline$ void " | 
| +    "$inline$void " | 
| "$classname$::set_$name$" | 
| "(int index, const $pointer_type$* value, size_t size) {\n" | 
| "  $name$_.Mutable(index)->assign(\n" | 
| "    reinterpret_cast<const char*>(value), size);\n" | 
| "  // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" | 
| "}\n" | 
| -    "$inline$ ::std::string* $classname$::add_$name$() {\n" | 
| +    "$inline$::std::string* $classname$::add_$name$() {\n" | 
| "  // @@protoc_insertion_point(field_add_mutable:$full_name$)\n" | 
| "  return $name$_.Add();\n" | 
| "}\n" | 
| -    "$inline$ void $classname$::add_$name$(const ::std::string& value) {\n" | 
| +    "$inline$void $classname$::add_$name$(const ::std::string& value) {\n" | 
| "  $name$_.Add()->assign(value);\n" | 
| "  // @@protoc_insertion_point(field_add:$full_name$)\n" | 
| "}\n" | 
| -    "$inline$ void $classname$::add_$name$(const char* value) {\n" | 
| +    "$inline$void $classname$::add_$name$(const char* value) {\n" | 
| "  $name$_.Add()->assign(value);\n" | 
| "  // @@protoc_insertion_point(field_add_char:$full_name$)\n" | 
| "}\n" | 
| -    "$inline$ void " | 
| +    "$inline$void " | 
| "$classname$::add_$name$(const $pointer_type$* value, size_t size) {\n" | 
| "  $name$_.Add()->assign(reinterpret_cast<const char*>(value), size);\n" | 
| "  // @@protoc_insertion_point(field_add_pointer:$full_name$)\n" | 
| "}\n"); | 
| printer->Print(variables, | 
| -    "$inline$ const ::google::protobuf::RepeatedPtrField< ::std::string>&\n" | 
| +    "$inline$const ::google::protobuf::RepeatedPtrField< ::std::string>&\n" | 
| "$classname$::$name$() const {\n" | 
| "  // @@protoc_insertion_point(field_list:$full_name$)\n" | 
| "  return $name$_;\n" | 
| "}\n" | 
| -    "$inline$ ::google::protobuf::RepeatedPtrField< ::std::string>*\n" | 
| +    "$inline$::google::protobuf::RepeatedPtrField< ::std::string>*\n" | 
| "$classname$::mutable_$name$() {\n" | 
| "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" | 
| "  return &$name$_;\n" | 
| @@ -808,6 +933,11 @@ GenerateConstructorCode(io::Printer* printer) const { | 
| } | 
|  | 
| void RepeatedStringFieldGenerator:: | 
| +GenerateCopyConstructorCode(io::Printer* printer) const { | 
| +  printer->Print(variables_, "$name$_.CopyFrom(from.$name$_);"); | 
| +} | 
| + | 
| +void RepeatedStringFieldGenerator:: | 
| GenerateMergeFromCodedStream(io::Printer* printer) const { | 
| printer->Print(variables_, | 
| "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" | 
| @@ -858,7 +988,8 @@ GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { | 
| void RepeatedStringFieldGenerator:: | 
| GenerateByteSize(io::Printer* printer) const { | 
| printer->Print(variables_, | 
| -    "total_size += $tag_size$ * this->$name$_size();\n" | 
| +    "total_size += $tag_size$ *\n" | 
| +    "    ::google::protobuf::internal::FromIntSize(this->$name$_size());\n" | 
| "for (int i = 0; i < this->$name$_size(); i++) {\n" | 
| "  total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" | 
| "    this->$name$(i));\n" | 
|  |