mirror of git://gcc.gnu.org/git/gcc.git
compiler: Fix backend representation for interface methods.
From-SVN: r184348
This commit is contained in:
parent
7a6cb708b1
commit
5a815b930a
|
@ -6886,10 +6886,37 @@ get_backend_interface_fields(Gogo* gogo, Interface_type* type,
|
|||
p != type->methods()->end();
|
||||
++p, ++i)
|
||||
{
|
||||
// The type of the method in Go only includes the parameters.
|
||||
// The actual method also has a receiver, which is always a
|
||||
// pointer. We need to add that pointer type here in order to
|
||||
// generate the correct type for the backend.
|
||||
Function_type* ft = p->type()->function_type();
|
||||
go_assert(ft->receiver() == NULL);
|
||||
|
||||
const Typed_identifier_list* params = ft->parameters();
|
||||
Typed_identifier_list* mparams = new Typed_identifier_list();
|
||||
if (params != NULL)
|
||||
mparams->reserve(params->size() + 1);
|
||||
Type* vt = Type::make_pointer_type(Type::make_void_type());
|
||||
mparams->push_back(Typed_identifier("", vt, ft->location()));
|
||||
if (params != NULL)
|
||||
{
|
||||
for (Typed_identifier_list::const_iterator pp = params->begin();
|
||||
pp != params->end();
|
||||
++pp)
|
||||
mparams->push_back(*pp);
|
||||
}
|
||||
|
||||
Typed_identifier_list* mresults = (ft->results() == NULL
|
||||
? NULL
|
||||
: ft->results()->copy());
|
||||
Function_type* mft = Type::make_function_type(NULL, mparams, mresults,
|
||||
ft->location());
|
||||
|
||||
mfields[i].name = Gogo::unpack_hidden_name(p->name());
|
||||
mfields[i].btype = (use_placeholder
|
||||
? p->type()->get_backend_placeholder(gogo)
|
||||
: p->type()->get_backend(gogo));
|
||||
? mft->get_backend_placeholder(gogo)
|
||||
: mft->get_backend(gogo));
|
||||
mfields[i].location = loc;
|
||||
// Sanity check: the names should be sorted.
|
||||
go_assert(p->name() > last_name);
|
||||
|
|
Loading…
Reference in New Issue