]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/gc: fix method values whose receiver is an unnamed interface.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 29 Aug 2013 08:00:58 +0000 (10:00 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 29 Aug 2013 08:00:58 +0000 (10:00 +0200)
Fixes #6140.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/13083043

src/cmd/gc/closure.c
test/fixedbugs/issue6140.go [new file with mode: 0644]
test/method2.go

index 8c40cb8d95353daa095351b03cbbf224c5256bef..5a84dfb1bedff54b18d8304851e3eae67376f470 100644 (file)
@@ -285,6 +285,8 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
        NodeList *body, *l, *callargs, *retargs;
        char *p;
        Sym *sym;
+       Pkg *spkg;
+       static Pkg* gopkg;
        int i, ddd;
 
        // TODO: names are not right
@@ -296,10 +298,18 @@ makepartialcall(Node *fn, Type *t0, Node *meth)
        basetype = rcvrtype;
        if(isptr[rcvrtype->etype])
                basetype = basetype->type;
-       if(basetype->sym == S)
+       if(basetype->etype != TINTER && basetype->sym == S)
                fatal("missing base type for %T", rcvrtype);
 
-       sym = pkglookup(p, basetype->sym->pkg);
+       spkg = nil;
+       if(basetype->sym != S)
+               spkg = basetype->sym->pkg;
+       if(spkg == nil) {
+               if(gopkg == nil)
+                       gopkg = mkpkg(strlit("go"));
+               spkg = gopkg;
+       }
+       sym = pkglookup(p, spkg);
        free(p);
        if(sym->flags & SymUniq)
                return sym->def;
diff --git a/test/fixedbugs/issue6140.go b/test/fixedbugs/issue6140.go
new file mode 100644 (file)
index 0000000..d494933
--- /dev/null
@@ -0,0 +1,31 @@
+// compile
+
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 6140: compiler incorrectly rejects method values
+// whose receiver has an unnamed interface type.
+
+package p
+
+type T *interface {
+       m() int
+}
+
+var x T
+
+var _ = (*x).m
+
+var y interface {
+       m() int
+}
+
+var _ = y.m
+
+type I interface {
+       String() string
+}
+
+var z *struct{ I }
+var _ = z.String
index b63da10dc691d45a6e665965927130c23fad3972..aaa850e7191c96171eaa173a44dd4033b7b43883 100644 (file)
@@ -21,7 +21,7 @@ func (p *P1) val() int { return 1 } // ERROR "receiver.* pointer|invalid pointer
 type I interface{}
 type I1 interface{}
 
-func (p I) val() int { return 1 } // ERROR "receiver.*interface|invalid pointer or interface receiver"
+func (p I) val() int   { return 1 } // ERROR "receiver.*interface|invalid pointer or interface receiver"
 func (p *I1) val() int { return 1 } // ERROR "receiver.*interface|invalid pointer or interface receiver"
 
 type Val interface {
@@ -33,4 +33,5 @@ var _ = (*Val).val // ERROR "method"
 var v Val
 var pv = &v
 
-var _ = pv.val()       // ERROR "method"
+var _ = pv.val() // ERROR "method"
+var _ = pv.val   // ERROR "method"