]> Cypherpunks repositories - gostls13.git/commitdiff
gc: fix method offsets of anonymous interfaces
authorEoghan Sherry <ejsherry@gmail.com>
Tue, 7 Dec 2010 17:56:26 +0000 (12:56 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 7 Dec 2010 17:56:26 +0000 (12:56 -0500)
Fixes #1290.

R=rsc
CC=golang-dev
https://golang.org/cl/3259043

src/cmd/gc/dcl.c
src/cmd/gc/go.y
src/cmd/gc/typecheck.c
test/fixedbugs/bug314.go [new file with mode: 0644]

index a9a17b236d6ed6223f97a65b770331e5cb508364..a71272aa222173f70fa34afd2e08fb80638538d2 100644 (file)
@@ -844,6 +844,8 @@ dostruct(NodeList *l, int et)
                t->broke = 1;
                return t;
        }
+       if(et == TINTER)
+               t = sortinter(t);
        if(!funarg)
                checkwidth(t);
        return t;
index 7960a22640d4172af2676cee79a28513a93b7fe4..917265758b581ad933d33cff82dc66271db08ac1 100644 (file)
@@ -1726,7 +1726,6 @@ hidden_type_misc:
 |      LINTERFACE '{' ohidden_interfacedcl_list '}'
        {
                $$ = dostruct($3, TINTER);
-               $$ = sortinter($$);
        }
 |      '*' hidden_type
        {
index 70464a4b7670e6eefcb60b1a8294429a451ac0cd..5450862213eeb1a0325d757d3fab1c1cc44ee56a 100644 (file)
@@ -263,7 +263,6 @@ reswitch:
                n->type = dostruct(n->list, TINTER);
                if(n->type == T)
                        goto error;
-               n->type = sortinter(n->type);
                break;
 
        case OTFUNC:
diff --git a/test/fixedbugs/bug314.go b/test/fixedbugs/bug314.go
new file mode 100644 (file)
index 0000000..95d81d7
--- /dev/null
@@ -0,0 +1,31 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug314
+
+// Copyright 2010 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.
+
+// Used to call wrong methods; issue 1290.
+
+package main
+
+type S struct {
+}
+func (S) a() int{
+       return 0
+}
+func (S) b() int{
+       return 1
+}
+
+func main() {
+       var i interface {
+               b() int
+               a() int
+       } = S{}
+       if i.a() != 0 {
+               panic("wrong method called")
+       }
+       if i.b() != 1 {
+               panic("wrong method called")
+       }
+}