Don't permit embedded field to be pointer to interface.
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 26 Mar 2011 18:31:36 +0000 (18:31 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 26 Mar 2011 18:31:36 +0000 (18:31 +0000)
From-SVN: r171558

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/types.cc
gcc/testsuite/go.test/test/interface/embed.go

index e3a3ab593ee75e6da7c63378b0656ecc5cf36e74..f1a2ec7cb5537dd7f0af58eb8cb05f64424693a9 100644 (file)
@@ -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 =
index 2eecafd89d6d2e579b21a7f2a1b373ca30ad8ad4..6ca22cb13b0f95224f0ed8e4612a008e565e97b0 100644 (file)
@@ -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;
index 4a702398c67d76b06852d11643fe45e7605b6989..2fddee1905a06394dfa1be4a2c702649923fb907 100644 (file)
@@ -4,7 +4,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Check methods derived from embedded interface and *interface values.
+// Check methods derived from embedded interface values.
 
 package main
 
@@ -19,18 +19,12 @@ func (t T) M() int64 { return int64(t) }
 var t = T(Value)
 var pt = &t
 var ti Inter = t
-var pti = &ti
 
 type S struct { Inter }
 var s = S{ ti }
 var ps = &s
 
-type SP struct { *Inter }
-var sp = SP{ &ti }
-var psp = &sp
-
 var i Inter
-var pi = &i
 
 var ok = true
 
@@ -45,35 +39,20 @@ func main() {
        check("t.M()", t.M())
        check("pt.M()", pt.M())
        check("ti.M()", ti.M())
-       check("pti.M()", pti.M())
        check("s.M()", s.M())
        check("ps.M()", ps.M())
-       check("sp.M()", sp.M())
-       check("psp.M()", psp.M())
 
        i = t
        check("i = t; i.M()", i.M())
-       check("i = t; pi.M()", pi.M())
 
        i = pt
        check("i = pt; i.M()", i.M())
-       check("i = pt; pi.M()", pi.M())
 
        i = s
        check("i = s; i.M()", i.M())
-       check("i = s; pi.M()", pi.M())
 
        i = ps
        check("i = ps; i.M()", i.M())
-       check("i = ps; pi.M()", pi.M())
-
-       i = sp
-       check("i = sp; i.M()", i.M())
-       check("i = sp; pi.M()", pi.M())
-
-       i = psp
-       check("i = psp; i.M()", i.M())
-       check("i = psp; pi.M()", pi.M())
 
        if !ok {
                println("BUG: interface10")