Commit 4c3a85d7 authored by Russ Cox's avatar Russ Cox

6g bug fixes:

 * bug211
 * embedded interfaces with lowercase methods
 * var _ = f() at top level

R=ken
OCL=35898
CL=35898
parent 8fffa1d6
...@@ -762,15 +762,20 @@ ok: ...@@ -762,15 +762,20 @@ ok:
Type** Type**
stotype(NodeList *l, int et, Type **t) stotype(NodeList *l, int et, Type **t)
{ {
Type *f, *t1, **t0; Type *f, *t1, *t2, **t0;
Strlit *note; Strlit *note;
int lno; int lno;
NodeList *init; NodeList *init;
Node *n; Node *n;
char *what;
t0 = t; t0 = t;
init = nil; init = nil;
lno = lineno; lno = lineno;
what = "field";
if(et == TINTER)
what = "method";
for(; l; l=l->next) { for(; l; l=l->next) {
n = l->n; n = l->n;
lineno = n->lineno; lineno = n->lineno;
...@@ -827,14 +832,17 @@ stotype(NodeList *l, int et, Type **t) ...@@ -827,14 +832,17 @@ stotype(NodeList *l, int et, Type **t)
continue; continue;
} }
for(t1=n->type->type; t1!=T; t1=t1->down) { for(t1=n->type->type; t1!=T; t1=t1->down) {
// TODO(rsc): Is this really an error?
if(strcmp(t1->sym->package, package) != 0)
yyerror("embedded interface contains unexported method %S", t1->sym);
f = typ(TFIELD); f = typ(TFIELD);
f->type = t1->type; f->type = t1->type;
f->width = BADWIDTH; f->width = BADWIDTH;
f->nname = newname(t1->sym); f->nname = newname(t1->sym);
f->sym = t1->sym; f->sym = t1->sym;
for(t2=*t0; t2!=T; t2=t2->down) {
if(t2->sym == f->sym) {
yyerror("duplicate method %s", t2->sym->name);
break;
}
}
*t = f; *t = f;
t = &f->down; t = &f->down;
} }
...@@ -855,7 +863,7 @@ stotype(NodeList *l, int et, Type **t) ...@@ -855,7 +863,7 @@ stotype(NodeList *l, int et, Type **t)
if(f->sym && !isblank(f->nname)) { if(f->sym && !isblank(f->nname)) {
for(t1=*t0; t1!=T; t1=t1->down) { for(t1=*t0; t1!=T; t1=t1->down) {
if(t1->sym == f->sym) { if(t1->sym == f->sym) {
yyerror("duplicate field %s", t1->sym->name); yyerror("duplicate %s %s", what, t1->sym->name);
break; break;
} }
} }
......
...@@ -27,6 +27,8 @@ init1(Node *n, NodeList **out) ...@@ -27,6 +27,8 @@ init1(Node *n, NodeList **out)
case PFUNC: case PFUNC:
break; break;
default: default:
if(isblank(n))
*out = list(*out, n->defn);
return; return;
} }
......
...@@ -52,7 +52,11 @@ func i() int { ...@@ -52,7 +52,11 @@ func i() int {
return 23; return 23;
} }
var _ = i();
func main() { func main() {
if call != "i" {panic("init did not run")}
call = "";
_, _ = f(); _, _ = f();
a, _ := f(); a, _ := f();
if a != 1 {panic(a)} if a != 1 {panic(a)}
......
...@@ -157,6 +157,3 @@ BUG: errchk: bugs/bug193.go:14: missing expected error: 'shift' ...@@ -157,6 +157,3 @@ BUG: errchk: bugs/bug193.go:14: missing expected error: 'shift'
too many calls: 5 too many calls: 5
panic PC=xxx panic PC=xxx
BUG: bug196 BUG: bug196
=========== bugs/bug211.go
BUG: errchk: command succeeded unexpectedly
...@@ -34,7 +34,7 @@ var pi = &i ...@@ -34,7 +34,7 @@ var pi = &i
var ok = true var ok = true
func check(v int64, s string) { func check(s string, v int64) {
if v != Value { if v != Value {
println(s, v); println(s, v);
ok = false; ok = false;
...@@ -42,38 +42,38 @@ func check(v int64, s string) { ...@@ -42,38 +42,38 @@ func check(v int64, s string) {
} }
func main() { func main() {
check(t.M(), "t.M"); check("t.M()", t.M());
check(pt.M(), "pt.M"); check("pt.M()", pt.M());
check(ti.M(), "ti.M"); check("ti.M()", ti.M());
check(pti.M(), "pti.M"); check("pti.M()", pti.M());
check(s.M(), "s.M"); check("s.M()", s.M());
check(ps.M(), "ps.M"); check("ps.M()", ps.M());
check(sp.M(), "sp.M"); check("sp.M()", sp.M());
check(psp.M(), "psp.M"); check("psp.M()", psp.M());
i = t; i = t;
check(i.M(), "i.M - i = t"); check("i = t; i.M()", i.M());
check(pi.M(), "pi.M - i = t"); check("i = t; pi.M()", pi.M());
i = pt; i = pt;
check(i.M(), "i.M - i = pt"); check("i = pt; i.M()", i.M());
check(pi.M(), "pi.M - i = pt"); check("i = pt; pi.M()", pi.M());
i = s; i = s;
check(i.M(), "i.M - i = s"); check("i = s; i.M()", i.M());
check(pi.M(), "pi.M - i = s"); check("i = s; pi.M()", pi.M());
i = ps; i = ps;
check(i.M(), "i.M - i = ps"); check("i = ps; i.M()", i.M());
check(pi.M(), "pi.M - i = ps"); check("i = ps; pi.M()", pi.M());
i = sp; i = sp;
check(i.M(), "i.M - i = sp"); check("i = sp; i.M()", i.M());
check(pi.M(), "pi.M - i = sp"); check("i = sp; pi.M()", pi.M());
i = psp; i = psp;
check(i.M(), "i.M - i = psp"); check("i = psp; i.M()", i.M());
check(pi.M(), "pi.M - i = psp"); check("i = psp; pi.M()", pi.M());
if !ok { if !ok {
println("BUG: interface10"); println("BUG: interface10");
......
// $G $D/embed0.go && $G $D/$F.go && $L embed0.$A $F.$A && ./$A.out
// Copyright 2009 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.
// Check that embedded interface types can have local methods.
package main
import "./embed0"
type T int
func (t T) m() {}
type I interface { m() }
type J interface { I; }
type PI interface { p.I; }
type PJ interface { p.J; }
func main() {
var i I;
var j J;
var t T;
i = t;
j = t;
_ = i;
_ = j;
i = j;
_ = i;
j = i;
_ = j;
var pi PI;
var pj PJ;
var pt p.T;
pi = pt;
pj = pt;
_ = pi;
_ = pj;
pi = pj;
_ = pi;
pj = pi;
_ = pj;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment