R=ken
OCL=23532
CL=23532
This commit is contained in:
Russ Cox 2009-01-26 17:06:20 -08:00
parent 4efad58d0a
commit f1fe21a08f
3 changed files with 25 additions and 7 deletions

View file

@ -313,9 +313,9 @@ addmethod(Node *n, Type *t, int local)
}
if(d == T)
stotype(n, &pa->method);
stotype(n, 0, &pa->method);
else
stotype(n, &d->down);
stotype(n, 0, &d->down);
if(dflag())
print("method %S of type %T\n", sf, pa);
@ -472,36 +472,43 @@ funcbody(Node *n)
* turn a parsed struct into a type
*/
Type**
stotype(Node *n, Type **t)
stotype(Node *n, int et, Type **t)
{
Type *f;
Iter save;
String *note;
int lno;
lno = lineno;
n = listfirst(&save, &n);
loop:
note = nil;
if(n == N) {
*t = T;
lineno = lno;
return t;
}
lineno = n->lineno;
if(n->op == OLIST) {
// recursive because it can be lists of lists
t = stotype(n, t);
t = stotype(n, et, t);
goto next;
}
if(n->op != ODCLFIELD || n->type == T)
fatal("stotype: oops %N\n", n);
if(et == TSTRUCT && n->type->etype == TFUNC)
yyerror("bad structure field type: %T", n->type);
switch(n->val.ctype) {
case CTSTR:
note = n->val.u.sval;
break;
default:
yyerror("structure field annotation must be string");
yyerror("field annotation must be string");
case CTxxx:
note = nil;
break;
@ -546,7 +553,7 @@ dostruct(Node *n, int et)
}
t = typ(et);
t->funarg = funarg;
stotype(n, &t->type);
stotype(n, et, &t->type);
if(!funarg)
checkwidth(t);
return t;

View file

@ -707,7 +707,7 @@ void funchdr(Node*);
void funcargs(Type*);
void funcbody(Node*);
Type* dostruct(Node*, int);
Type** stotype(Node*, Type**);
Type** stotype(Node*, int, Type**);
Type* sortinter(Type*);
void markdcl(void);
void popdcl(void);

11
test/fixedbugs/bug134.go Normal file
View file

@ -0,0 +1,11 @@
// 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.
// errchk $G $D/$F.go
package main
type T struct {
v (); // ERROR "field type"
}