mirror of
https://github.com/golang/go
synced 2024-11-22 06:54:39 -07:00
6g bug fixes:
* bug211 * embedded interfaces with lowercase methods * var _ = f() at top level R=ken OCL=35898 CL=35898
This commit is contained in:
parent
8fffa1d698
commit
4c3a85d73a
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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'
|
|||||||
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
|
|||||||
|
|
||||||
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) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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");
|
||||||
|
45
test/interface/embed1.go
Normal file
45
test/interface/embed1.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// $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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user