OSDN Git Service

Fix inheriting hidden methods with arguments of hidden type.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Sep 2011 18:24:45 +0000 (18:24 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Sep 2011 18:24:45 +0000 (18:24 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178827 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/expressions.h
gcc/go/gofrontend/statements.h
gcc/go/gofrontend/types.cc

index 5529e6c..b0be483 100644 (file)
@@ -9239,7 +9239,13 @@ Call_expression::check_argument_type(int i, const Type* parameter_type,
                                     bool issued_error)
 {
   std::string reason;
-  if (!Type::are_assignable(parameter_type, argument_type, &reason))
+  bool ok;
+  if (this->are_hidden_fields_ok_)
+    ok = Type::are_assignable_hidden_ok(parameter_type, argument_type,
+                                       &reason);
+  else
+    ok = Type::are_assignable(parameter_type, argument_type, &reason);
+  if (!ok)
     {
       if (!issued_error)
        {
index bb4f23e..c6ae12c 100644 (file)
@@ -1198,8 +1198,9 @@ class Call_expression : public Expression
                  source_location location)
     : Expression(EXPRESSION_CALL, location),
       fn_(fn), args_(args), type_(NULL), results_(NULL), tree_(NULL),
-      is_varargs_(is_varargs), varargs_are_lowered_(false),
-      types_are_determined_(false), is_deferred_(false), issued_error_(false)
+      is_varargs_(is_varargs), are_hidden_fields_ok_(false),
+      varargs_are_lowered_(false), types_are_determined_(false),
+      is_deferred_(false), issued_error_(false)
   { }
 
   // The function to call.
@@ -1249,6 +1250,12 @@ class Call_expression : public Expression
   set_varargs_are_lowered()
   { this->varargs_are_lowered_ = true; }
 
+  // Note that it is OK for this call to set hidden fields when
+  // passing arguments.
+  void
+  set_hidden_fields_are_ok()
+  { this->are_hidden_fields_ok_ = true; }
+
   // Whether this call is being deferred.
   bool
   is_deferred() const
@@ -1350,6 +1357,9 @@ class Call_expression : public Expression
   tree tree_;
   // True if the last argument is a varargs argument (f(a...)).
   bool is_varargs_;
+  // True if this statement may pass hidden fields in the arguments.
+  // This is used for generated method stubs.
+  bool are_hidden_fields_ok_;
   // True if varargs have already been lowered.
   bool varargs_are_lowered_;
   // True if types have been determined.
index 8206a08..a22090a 100644 (file)
@@ -490,8 +490,7 @@ class Temporary_statement : public Statement
   Type*
   type() const;
 
-  // Note that it is OK for this return statement to set hidden
-  // fields.
+  // Note that it is OK for this statement to set hidden fields.
   void
   set_hidden_fields_are_ok()
   { this->are_hidden_fields_ok_ = true; }
@@ -533,8 +532,8 @@ class Temporary_statement : public Statement
   Expression* init_;
   // The backend representation of the temporary variable.
   Bvariable* bvariable_;
-  // True if this statement may pass hidden fields in the return
-  // value.  This is used for generated method stubs.
+  // True if this statement may set hidden fields when assigning the
+  // value to the temporary.  This is used for generated method stubs.
   bool are_hidden_fields_ok_;
   // True if something takes the address of this temporary variable.
   bool is_address_taken_;
index 6e87056..453e741 100644 (file)
@@ -7401,6 +7401,7 @@ Type::build_one_stub_method(Gogo* gogo, Method* method,
   go_assert(func != NULL);
   Call_expression* call = Expression::make_call(func, arguments, is_varargs,
                                                location);
+  call->set_hidden_fields_are_ok();
   size_t count = call->result_count();
   if (count == 0)
     gogo->add_statement(Statement::make_statement(call));