aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-03-26 18:31:36 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-03-26 18:31:36 +0000
commitf7b8b261e78a327c70188a30778eb1268c91cdec (patch)
tree9e1c9bd06f28c5c0449f56fbed961b272344de40 /gcc/go
parent84b4e061886a5d9b88d278275020d7fca0b8efcb (diff)
downloadgcc-f7b8b261e78a327c70188a30778eb1268c91cdec.zip
gcc-f7b8b261e78a327c70188a30778eb1268c91cdec.tar.gz
gcc-f7b8b261e78a327c70188a30778eb1268c91cdec.tar.bz2
Don't permit embedded field to be pointer to interface.
From-SVN: r171558
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/expressions.cc5
-rw-r--r--gcc/go/gofrontend/types.cc8
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index e3a3ab5..f1a2ec7 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -10135,7 +10135,10 @@ Interface_field_reference_expression::do_check_types(Gogo*)
Interface_type* interface_type = type->interface_type();
if (interface_type == NULL)
- this->report_error(_("expected interface or pointer to interface"));
+ {
+ if (!type->is_error_type())
+ this->report_error(_("expected interface or pointer to interface"));
+ }
else
{
const Typed_identifier* method =
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index 2eecafd..6ca22cb 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -3464,6 +3464,14 @@ Struct_type::do_verify()
p->set_type(Type::make_error_type());
return false;
}
+ if (t->points_to() != NULL
+ && t->points_to()->interface_type() != NULL)
+ {
+ error_at(p->location(),
+ "embedded type may not be pointer to interface");
+ p->set_type(Type::make_error_type());
+ return false;
+ }
}
}
return ret;