| Index: third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc | 
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc | 
| index 5d82946d6145328900070004eec68f9da6c1757a..686c70a98ea0d7bc13ab537efea9600c8e7ad5d4 100644 | 
| --- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc | 
| +++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc | 
| @@ -53,6 +53,7 @@ | 
| #include <vector> | 
|  | 
| #include <google/protobuf/unittest.pb.h> | 
| +#include <google/protobuf/unittest_no_arena.pb.h> | 
| #include <google/protobuf/unittest_optimize_for.pb.h> | 
| #include <google/protobuf/unittest_embed_optimize_for.pb.h> | 
| #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) | 
| @@ -67,6 +68,7 @@ | 
| #include <google/protobuf/compiler/importer.h> | 
| #include <google/protobuf/io/coded_stream.h> | 
| #include <google/protobuf/io/zero_copy_stream_impl.h> | 
| +#include <google/protobuf/arena.h> | 
| #include <google/protobuf/descriptor.h> | 
| #include <google/protobuf/descriptor.pb.h> | 
| #include <google/protobuf/dynamic_message.h> | 
| @@ -129,12 +131,12 @@ TEST(GeneratedDescriptorTest, IdenticalDescriptors) { | 
|  | 
| // Test that descriptors are generated correctly by converting them to | 
| // FileDescriptorProtos and comparing. | 
| -  FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto; | 
| -  generated_descriptor->CopyTo(&generated_decsriptor_proto); | 
| +  FileDescriptorProto generated_descriptor_proto, parsed_descriptor_proto; | 
| +  generated_descriptor->CopyTo(&generated_descriptor_proto); | 
| parsed_descriptor->CopyTo(&parsed_descriptor_proto); | 
|  | 
| EXPECT_EQ(parsed_descriptor_proto.DebugString(), | 
| -            generated_decsriptor_proto.DebugString()); | 
| +            generated_descriptor_proto.DebugString()); | 
| } | 
|  | 
| #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) | 
| @@ -199,14 +201,14 @@ TEST(GeneratedMessageTest, FloatingPointDefaults) { | 
| EXPECT_EQ(-1.5f, extreme_default.negative_float()); | 
| EXPECT_EQ(2.0e8f, extreme_default.large_float()); | 
| EXPECT_EQ(-8e-28f, extreme_default.small_negative_float()); | 
| -  EXPECT_EQ(numeric_limits<double>::infinity(), | 
| +  EXPECT_EQ(std::numeric_limits<double>::infinity(), | 
| extreme_default.inf_double()); | 
| -  EXPECT_EQ(-numeric_limits<double>::infinity(), | 
| +  EXPECT_EQ(-std::numeric_limits<double>::infinity(), | 
| extreme_default.neg_inf_double()); | 
| EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double()); | 
| -  EXPECT_EQ(numeric_limits<float>::infinity(), | 
| +  EXPECT_EQ(std::numeric_limits<float>::infinity(), | 
| extreme_default.inf_float()); | 
| -  EXPECT_EQ(-numeric_limits<float>::infinity(), | 
| +  EXPECT_EQ(-std::numeric_limits<float>::infinity(), | 
| extreme_default.neg_inf_float()); | 
| EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float()); | 
| } | 
| @@ -419,6 +421,51 @@ TEST(GeneratedMessageTest, StringCharStarLength) { | 
| EXPECT_EQ("wx", message.repeated_string(0)); | 
| } | 
|  | 
| +#if LANG_CXX11 | 
| +TEST(GeneratedMessageTest, StringMove) { | 
| +  // Verify that we trigger the move behavior on a scalar setter. | 
| +  protobuf_unittest_no_arena::TestAllTypes message; | 
| +  { | 
| +    string tmp(32, 'a'); | 
| + | 
| +    const char* old_data = tmp.data(); | 
| +    message.set_optional_string(std::move(tmp)); | 
| +    const char* new_data = message.optional_string().data(); | 
| + | 
| +    EXPECT_EQ(old_data, new_data); | 
| +    EXPECT_EQ(string(32, 'a'), message.optional_string()); | 
| + | 
| +    string tmp2(32, 'b'); | 
| +    old_data = tmp2.data(); | 
| +    message.set_optional_string(std::move(tmp2)); | 
| +    new_data = message.optional_string().data(); | 
| + | 
| +    EXPECT_EQ(old_data, new_data); | 
| +    EXPECT_EQ(string(32, 'b'), message.optional_string()); | 
| +  } | 
| + | 
| +  // Verify that we trigger the move behavior on a oneof setter. | 
| +  { | 
| +    string tmp(32, 'a'); | 
| + | 
| +    const char* old_data = tmp.data(); | 
| +    message.set_oneof_string(std::move(tmp)); | 
| +    const char* new_data = message.oneof_string().data(); | 
| + | 
| +    EXPECT_EQ(old_data, new_data); | 
| +    EXPECT_EQ(string(32, 'a'), message.oneof_string()); | 
| + | 
| +    string tmp2(32, 'b'); | 
| +    old_data = tmp2.data(); | 
| +    message.set_oneof_string(std::move(tmp2)); | 
| +    new_data = message.oneof_string().data(); | 
| + | 
| +    EXPECT_EQ(old_data, new_data); | 
| +    EXPECT_EQ(string(32, 'b'), message.oneof_string()); | 
| +  } | 
| +} | 
| +#endif | 
| + | 
|  | 
| TEST(GeneratedMessageTest, CopyFrom) { | 
| unittest::TestAllTypes message1, message2; | 
| @@ -518,6 +565,26 @@ TEST(GeneratedMessageTest, CopyConstructor) { | 
| TestUtil::ExpectAllFieldsSet(message2); | 
| } | 
|  | 
| +TEST(GeneratedMessageTest, CopyConstructorWithArenas) { | 
| +  Arena arena; | 
| +  unittest::TestAllTypes* message1 = | 
| +      Arena::CreateMessage<unittest::TestAllTypes>(&arena); | 
| +  TestUtil::SetAllFields(message1); | 
| + | 
| +  unittest::TestAllTypes message2_stack(*message1); | 
| +  TestUtil::ExpectAllFieldsSet(message2_stack); | 
| + | 
| +  google::protobuf::scoped_ptr<unittest::TestAllTypes> message2_heap( | 
| +      new unittest::TestAllTypes(*message1)); | 
| +  TestUtil::ExpectAllFieldsSet(*message2_heap); | 
| + | 
| +  arena.Reset(); | 
| + | 
| +  // Verify that the copies are still intact. | 
| +  TestUtil::ExpectAllFieldsSet(message2_stack); | 
| +  TestUtil::ExpectAllFieldsSet(*message2_heap); | 
| +} | 
| + | 
| TEST(GeneratedMessageTest, CopyAssignmentOperator) { | 
| unittest::TestAllTypes message1; | 
| TestUtil::SetAllFields(&message1); | 
| @@ -600,14 +667,16 @@ TEST(GeneratedMessageTest, NonEmptyMergeFrom) { | 
| #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ | 
| !defined(GOOGLE_PROTOBUF_NO_RTTI) | 
| #ifdef PROTOBUF_HAS_DEATH_TEST | 
| +#ifndef NDEBUG | 
|  | 
| TEST(GeneratedMessageTest, MergeFromSelf) { | 
| unittest::TestAllTypes message; | 
| -  EXPECT_DEATH(message.MergeFrom(message), "Check failed:.*pb[.]cc"); | 
| +  EXPECT_DEATH(message.MergeFrom(message), "pb[.]cc.*Check failed:"); | 
| EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)), | 
| -               "Check failed:.*pb[.]cc"); | 
| +               "pb[.]cc.*Check failed:"); | 
| } | 
|  | 
| +#endif  // NDEBUG | 
| #endif  // PROTOBUF_HAS_DEATH_TEST | 
| #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS || !GOOGLE_PROTOBUF_NO_RTTI | 
|  | 
| @@ -1252,7 +1321,7 @@ class GeneratedServiceTest : public testing::Test { | 
| foo_(descriptor_->FindMethodByName("Foo")), | 
| bar_(descriptor_->FindMethodByName("Bar")), | 
| stub_(&mock_channel_), | 
| -      done_(::google::protobuf::internal::NewPermanentCallback(&DoNothing)) {} | 
| +      done_(NewPermanentCallback(&DoNothing)) {} | 
|  | 
| virtual void SetUp() { | 
| ASSERT_TRUE(foo_ != NULL); | 
|  |