diff --git a/src/google/protobuf/repeated_field_reflection_unittest.cc b/src/google/protobuf/repeated_field_reflection_unittest.cc index 5fcfb007b6..6924ae8988 100644 --- a/src/google/protobuf/repeated_field_reflection_unittest.cc +++ b/src/google/protobuf/repeated_field_reflection_unittest.cc @@ -120,7 +120,7 @@ TEST(RepeatedFieldReflectionTest, RegularFields) { EXPECT_EQ(rf_double.Get(i), Func(i, 2)); EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5)); EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6)); - EXPECT_EQ(down_cast(rpf_message.Get(i)).c(), + EXPECT_EQ(down_cast(&rpf_message.Get(i))->c(), Func(i, 6)); // Check gets through mutable objects. @@ -128,7 +128,7 @@ TEST(RepeatedFieldReflectionTest, RegularFields) { EXPECT_EQ(mrf_double->Get(i), Func(i, 2)); EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5)); EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6)); - EXPECT_EQ(down_cast(mrpf_message->Get(i)).c(), + EXPECT_EQ(down_cast(&mrpf_message->Get(i))->c(), Func(i, 6)); // Check sets through mutable objects. diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h index 07ae530773..66b91291f3 100644 --- a/src/google/protobuf/stubs/common.h +++ b/src/google/protobuf/stubs/common.h @@ -341,12 +341,6 @@ inline To down_cast(From* f) { // so we only accept pointers return static_cast(f); } -// Simplified down_cast for reference type. -template -inline To down_cast(From& f) { - return static_cast(f); -} - } // namespace internal // We made these internal so that they would show up as such in the docs, diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc index 1ee3df50de..cabb99ed9c 100644 --- a/src/google/protobuf/text_format.cc +++ b/src/google/protobuf/text_format.cc @@ -434,8 +434,8 @@ class TextFormat::Parser::ParserImpl { // If a parse info tree exists, add the location for the parsed // field. if (parse_info_tree_ != NULL) { - parse_info_tree_->RecordLocation(field, - ParseLocation(start_line, start_column)); + RecordLocation(parse_info_tree_, field, + ParseLocation(start_line, start_column)); } return true; @@ -483,7 +483,7 @@ class TextFormat::Parser::ParserImpl { // for the nested message. ParseInfoTree* parent = parse_info_tree_; if (parent != NULL) { - parse_info_tree_ = parent->CreateNested(field); + parse_info_tree_ = CreateNested(parent, field); } string delimeter; diff --git a/src/google/protobuf/text_format.h b/src/google/protobuf/text_format.h index 0974139708..01f3ffb086 100644 --- a/src/google/protobuf/text_format.h +++ b/src/google/protobuf/text_format.h @@ -339,9 +339,30 @@ class LIBPROTOBUF_EXPORT TextFormat { }; private: + // Hack: ParseInfoTree declares TextFormat as a friend which should extend + // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some + // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide + // helpers for ParserImpl to call methods of ParseInfoTree. + static inline void RecordLocation(ParseInfoTree* info_tree, + const FieldDescriptor* field, + ParseLocation location); + static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree, + const FieldDescriptor* field); + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat); }; +inline void TextFormat::RecordLocation(ParseInfoTree* info_tree, + const FieldDescriptor* field, + ParseLocation location) { + info_tree->RecordLocation(field, location); +} + +inline TextFormat::ParseInfoTree* TextFormat::CreateNested( + ParseInfoTree* info_tree, const FieldDescriptor* field) { + return info_tree->CreateNested(field); +} + } // namespace protobuf } // namespace google