Commit 57bd0da3 authored by Ken Thompson's avatar Ken Thompson

bug126

R=r
OCL=20879
CL=20879
parent 8bce3b56
...@@ -65,7 +65,7 @@ dodcltype(Type *n) ...@@ -65,7 +65,7 @@ dodcltype(Type *n)
// if n has been forward declared, // if n has been forward declared,
// use the Type* created then // use the Type* created then
s = n->sym; s = n->sym;
if(s->tblock == block) { if(s->block == block) {
switch(s->otype->etype) { switch(s->otype->etype) {
case TFORWSTRUCT: case TFORWSTRUCT:
case TFORWINTER: case TFORWINTER:
...@@ -556,8 +556,8 @@ dcopy(Sym *a, Sym *b) ...@@ -556,8 +556,8 @@ dcopy(Sym *a, Sym *b)
a->lexical = b->lexical; a->lexical = b->lexical;
a->undef = b->undef; a->undef = b->undef;
a->vargen = b->vargen; a->vargen = b->vargen;
a->vblock = b->vblock; a->block = b->block;
a->tblock = b->tblock; a->lastlineno = b->lastlineno;
a->local = b->local; a->local = b->local;
a->offset = b->offset; a->offset = b->offset;
} }
...@@ -602,7 +602,7 @@ popdcl(void) ...@@ -602,7 +602,7 @@ popdcl(void)
if(d == S) if(d == S)
fatal("popdcl: no mark"); fatal("popdcl: no mark");
dclstack = d->link; dclstack = d->link;
block = d->vblock; block = d->block;
} }
void void
...@@ -630,7 +630,7 @@ markdcl(void) ...@@ -630,7 +630,7 @@ markdcl(void)
d = push(); d = push();
d->name = nil; // used as a mark in fifo d->name = nil; // used as a mark in fifo
d->vblock = block; d->block = block;
blockgen++; blockgen++;
block = blockgen; block = blockgen;
...@@ -698,6 +698,18 @@ testdclstack(void) ...@@ -698,6 +698,18 @@ testdclstack(void)
} }
} }
static void
redeclare(char *str, Sym *s)
{
if(s->block != block) {
s->block = block;
s->lastlineno = lineno;
return;
}
yyerror("%s %S redeclared in this block %d", str, s, block);
print(" previous declaration at %L\n", s->lastlineno);
}
void void
addvar(Node *n, Type *t, int ctxt) addvar(Node *n, Type *t, int ctxt)
{ {
...@@ -710,15 +722,6 @@ addvar(Node *n, Type *t, int ctxt) ...@@ -710,15 +722,6 @@ addvar(Node *n, Type *t, int ctxt)
s = n->sym; s = n->sym;
if(s->vblock == block) {
if(s->oname != N) {
yyerror("var %S redeclared in this block"
"\n\tprevious declaration at %L",
s, s->oname->lineno);
} else
yyerror("var %S redeclared in this block", s);
}
if(ctxt == PEXTERN) { if(ctxt == PEXTERN) {
r = externdcl; r = externdcl;
gen = 0; gen = 0;
...@@ -729,10 +732,10 @@ addvar(Node *n, Type *t, int ctxt) ...@@ -729,10 +732,10 @@ addvar(Node *n, Type *t, int ctxt)
pushdcl(s); pushdcl(s);
} }
redeclare("variable", s);
s->vargen = gen; s->vargen = gen;
s->oname = n; s->oname = n;
s->offset = 0; s->offset = 0;
s->vblock = block;
s->lexical = LNAME; s->lexical = LNAME;
n->type = t; n->type = t;
...@@ -775,12 +778,9 @@ addtyp(Type *n, int ctxt) ...@@ -775,12 +778,9 @@ addtyp(Type *n, int ctxt)
n->vargen = ++typgen; n->vargen = ++typgen;
} }
if(s->tblock == block) redeclare("type", s);
yyerror("type %S redeclared in this block %d", s, block);
s->otype = n; s->otype = n;
s->lexical = LATYPE; s->lexical = LATYPE;
s->tblock = block;
d = dcl(); d = dcl();
d->dsym = s; d->dsym = s;
...@@ -831,6 +831,7 @@ addconst(Node *n, Node *e, int ctxt) ...@@ -831,6 +831,7 @@ addconst(Node *n, Node *e, int ctxt)
pushdcl(s); pushdcl(s);
} }
redeclare("constant", s);
s->oconst = e; s->oconst = e;
s->lexical = LACONST; s->lexical = LACONST;
......
...@@ -231,8 +231,7 @@ struct Node ...@@ -231,8 +231,7 @@ struct Node
struct Sym struct Sym
{ {
ushort tblock; // blocknumber for type ushort block; // blocknumber to catch redeclaration
ushort vblock; // blocknumber for variable
uchar undef; // a diagnostic has been generated uchar undef; // a diagnostic has been generated
uchar export; // marked as export uchar export; // marked as export
...@@ -252,6 +251,7 @@ struct Sym ...@@ -252,6 +251,7 @@ struct Sym
vlong offset; // stack location if automatic vlong offset; // stack location if automatic
int32 lexical; int32 lexical;
int32 vargen; // unique variable number int32 vargen; // unique variable number
int32 lastlineno; // last declaration for diagnostic
Sym* link; Sym* link;
}; };
#define S ((Sym*)0) #define S ((Sym*)0)
......
...@@ -339,7 +339,7 @@ export const ( ...@@ -339,7 +339,7 @@ export const (
// SYS_NOSYS = 296; // { int nosys(void); } { old load_shared_file } // SYS_NOSYS = 296; // { int nosys(void); } { old load_shared_file }
// SYS_NOSYS = 297; // { int nosys(void); } { old reset_shared_file } // SYS_NOSYS = 297; // { int nosys(void); } { old reset_shared_file }
// SYS_NOSYS = 298; // { int nosys(void); } { old new_system_shared_regions } // SYS_NOSYS = 298; // { int nosys(void); } { old new_system_shared_regions }
SYS_ENOSYS = 299; // { int enosys(void); } { old shared_region_map_file_np } // SYS_ENOSYS = 299; // { int enosys(void); } { old shared_region_map_file_np }
SYS_ENOSYS = 300; // { int enosys(void); } { old shared_region_make_private_np } SYS_ENOSYS = 300; // { int enosys(void); } { old shared_region_make_private_np }
SYS___PTHREAD_MUTEX_DESTROY = 301; // { int __pthread_mutex_destroy(int mutexid); } SYS___PTHREAD_MUTEX_DESTROY = 301; // { int __pthread_mutex_destroy(int mutexid); }
SYS___PTHREAD_MUTEX_INIT = 302; // { int __pthread_mutex_init(user_addr_t mutex, user_addr_t attr); } SYS___PTHREAD_MUTEX_INIT = 302; // { int __pthread_mutex_init(user_addr_t mutex, user_addr_t attr); }
......
...@@ -191,7 +191,7 @@ export const ( ...@@ -191,7 +191,7 @@ export const (
// flags // flags
EV_ONESHOT = 0x0010; EV_ONESHOT = 0x0010;
EV_CLEAR = 0x0020; EV_CLEAR = 0x0020;
EV_RECEIPT = 0x40; // EV_RECEIPT = 0x40;
EV_SYSFLAGS = 0xF000; EV_SYSFLAGS = 0xF000;
EV_FLAG0 = 0x1000; EV_FLAG0 = 0x1000;
EV_FLAG1 = 0x2000; EV_FLAG1 = 0x2000;
......
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