mirror of
https://github.com/golang/go
synced 2024-11-25 04:37:56 -07:00
bug165
R=ken OCL=30783 CL=30783
This commit is contained in:
parent
a0bcaf4c00
commit
480f51243c
@ -93,6 +93,7 @@ updatetype(Type *n, Type *t)
|
||||
{
|
||||
Sym *s;
|
||||
int local;
|
||||
int maplineno, lno;
|
||||
|
||||
s = n->sym;
|
||||
if(s == S || s->def == N || s->def->op != OTYPE || s->def->type != n)
|
||||
@ -124,6 +125,7 @@ updatetype(Type *n, Type *t)
|
||||
// type n t;
|
||||
// copy t, but then zero out state associated with t
|
||||
// that is no longer associated with n.
|
||||
maplineno = n->maplineno;
|
||||
local = n->local;
|
||||
*n = *t;
|
||||
n->sym = s;
|
||||
@ -133,6 +135,7 @@ updatetype(Type *n, Type *t)
|
||||
n->method = nil;
|
||||
n->vargen = 0;
|
||||
n->nod = N;
|
||||
|
||||
// catch declaration of incomplete type
|
||||
switch(n->etype) {
|
||||
case TFORWSTRUCT:
|
||||
@ -141,6 +144,14 @@ updatetype(Type *n, Type *t)
|
||||
default:
|
||||
checkwidth(n);
|
||||
}
|
||||
|
||||
// double-check use of type as map key
|
||||
if(maplineno) {
|
||||
lno = lineno;
|
||||
lineno = maplineno;
|
||||
maptype(n, types[TBOOL]);
|
||||
lineno = lno;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -171,6 +171,8 @@ struct Type
|
||||
|
||||
// TARRAY
|
||||
int32 bound; // negative is dynamic array
|
||||
|
||||
int32 maplineno; // first use of TFORW as map key
|
||||
};
|
||||
#define T ((Type*)0)
|
||||
|
||||
|
@ -345,8 +345,19 @@ maptype(Type *key, Type *val)
|
||||
{
|
||||
Type *t;
|
||||
|
||||
if(key != nil && key->etype != TANY && algtype(key) == ANOEQ)
|
||||
yyerror("invalid map key type %T", key);
|
||||
if(key != nil && key->etype != TANY && algtype(key) == ANOEQ) {
|
||||
if(key->etype == TFORW) {
|
||||
// map[key] used during definition of key.
|
||||
// postpone check until key is fully defined.
|
||||
// if there are multiple uses of map[key]
|
||||
// before key is fully defined, the error
|
||||
// will only be printed for the first one.
|
||||
// good enough.
|
||||
if(key->maplineno == 0)
|
||||
key->maplineno = lineno;
|
||||
} else
|
||||
yyerror("invalid map key type %T", key);
|
||||
}
|
||||
t = typ(TMAP);
|
||||
t->down = key;
|
||||
t->type = val;
|
||||
|
@ -7,5 +7,9 @@
|
||||
package main
|
||||
|
||||
type I interface {
|
||||
m(map[I] bool)
|
||||
m(map[I] bool); // ok
|
||||
}
|
||||
|
||||
type S struct {
|
||||
m map[S] bool; // ERROR "map key type"
|
||||
}
|
@ -111,10 +111,6 @@ BUG: should not compile
|
||||
=========== bugs/bug164.go
|
||||
BUG: should not compile
|
||||
|
||||
=========== bugs/bug165.go
|
||||
bugs/bug165.go:6: invalid map key type I
|
||||
BUG: should compile
|
||||
|
||||
=========== fixedbugs/bug016.go
|
||||
fixedbugs/bug016.go:7: constant -3 overflows uint
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user