Browse Source

Fix compile issues under GCC 3.4.6

xiaofeng@google.com 13 years ago
parent
commit
9c1c31ff16

+ 2 - 2
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(rf_double.Get(i), Func(i, 2));
     EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5));
     EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5));
     EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6));
     EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6));
-    EXPECT_EQ(down_cast<const ForeignMessage&>(rpf_message.Get(i)).c(),
+    EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(i))->c(),
               Func(i, 6));
               Func(i, 6));
 
 
     // Check gets through mutable objects.
     // Check gets through mutable objects.
@@ -128,7 +128,7 @@ TEST(RepeatedFieldReflectionTest, RegularFields) {
     EXPECT_EQ(mrf_double->Get(i), Func(i, 2));
     EXPECT_EQ(mrf_double->Get(i), Func(i, 2));
     EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5));
     EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5));
     EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6));
     EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6));
-    EXPECT_EQ(down_cast<const ForeignMessage&>(mrpf_message->Get(i)).c(),
+    EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(i))->c(),
               Func(i, 6));
               Func(i, 6));
 
 
     // Check sets through mutable objects.
     // Check sets through mutable objects.

+ 0 - 6
src/google/protobuf/stubs/common.h

@@ -341,12 +341,6 @@ inline To down_cast(From* f) {                   // so we only accept pointers
   return static_cast<To>(f);
   return static_cast<To>(f);
 }
 }
 
 
-// Simplified down_cast for reference type.
-template<typename To, typename From>
-inline To down_cast(From& f) {
-  return static_cast<To>(f);
-}
-
 }  // namespace internal
 }  // namespace internal
 
 
 // We made these internal so that they would show up as such in the docs,
 // We made these internal so that they would show up as such in the docs,

+ 3 - 3
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
     // If a parse info tree exists, add the location for the parsed
     // field.
     // field.
     if (parse_info_tree_ != NULL) {
     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;
     return true;
@@ -483,7 +483,7 @@ class TextFormat::Parser::ParserImpl {
     // for the nested message.
     // for the nested message.
     ParseInfoTree* parent = parse_info_tree_;
     ParseInfoTree* parent = parse_info_tree_;
     if (parent != NULL) {
     if (parent != NULL) {
-      parse_info_tree_ = parent->CreateNested(field);
+      parse_info_tree_ = CreateNested(parent, field);
     }
     }
 
 
     string delimeter;
     string delimeter;

+ 21 - 0
src/google/protobuf/text_format.h

@@ -339,9 +339,30 @@ class LIBPROTOBUF_EXPORT TextFormat {
   };
   };
 
 
  private:
  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);
   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 protobuf
 
 
 }  // namespace google
 }  // namespace google