diff options
author | Russ Cox <rsc@golang.org> | 2009-03-04 17:38:37 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-03-04 17:38:37 -0800 |
commit | 8a8d8919f8509a63f40e875ead29ecc96ef41da8 (patch) | |
tree | f18dcac9d577227a97a8e10403a0ff120049a6c7 /src | |
parent | a8591f6532dec29e732ebe64237dedd43825f809 (diff) | |
download | golang-8a8d8919f8509a63f40e875ead29ecc96ef41da8.tar.gz |
reject invalid map key types at compile time
R=ken
OCL=25720
CL=25720
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/gc/go.h | 1 | ||||
-rw-r--r-- | src/cmd/gc/go.y | 16 | ||||
-rw-r--r-- | src/cmd/gc/subr.c | 19 |
3 files changed, 24 insertions, 12 deletions
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 8445a9158..76e440db4 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -657,6 +657,7 @@ int isslice(Type*); int isinter(Type*); int isnilinter(Type*); int isddd(Type*); +Type* maptype(Type*, Type*); Type* dclmethod(Type*); Type* methtype(Type*); int methconv(Type*); diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 20c981d6c..fb905292d 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -1019,9 +1019,7 @@ convtype: | LMAP '[' type ']' type { // map literal - $$ = typ(TMAP); - $$->down = $3; - $$->type = $5; + $$ = maptype($3, $5); } | structtype | '(' type ')' @@ -1126,9 +1124,7 @@ Aothertype: } | LMAP '[' type ']' Atype { - $$ = typ(TMAP); - $$->down = $3; - $$->type = $5; + $$ = maptype($3, $5); } | '*' Atype { @@ -1160,9 +1156,7 @@ Bothertype: } | LMAP '[' type ']' Btype { - $$ = typ(TMAP); - $$->down = $3; - $$->type = $5; + $$ = maptype($3, $5); } | '*' Btype { @@ -1806,9 +1800,7 @@ hidden_type1: } | LMAP '[' hidden_type ']' hidden_type { - $$ = typ(TMAP); - $$->down = $3; - $$->type = $5; + $$ = maptype($3, $5); } | LSTRUCT '{' ohidden_structdcl_list '}' { diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 7d5890c6b..bb2c31ebd 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -305,6 +305,25 @@ algtype(Type *t) return a; } +Type* +maptype(Type *key, Type *val) +{ + Type *t; + + if(key != nil && key->etype != TANY && algtype(key) == ANOEQ) + yyerror("invalid map key type %T", key); + t = typ(TMAP); + t->down = key; + t->type = val; + return t; +} + +int +iskeytype(Type *t) +{ + return algtype(t) != ANOEQ; +} + Node* list(Node *a, Node *b) { |