From: Russ Cox Date: Thu, 5 Mar 2009 01:38:37 +0000 (-0800) Subject: reject invalid map key types at compile time X-Git-Tag: weekly.2009-11-06~2108 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=98b34e5bbd6c67cbe20e589d1f74acda8364fb12;p=gostls13.git reject invalid map key types at compile time R=ken OCL=25720 CL=25720 --- diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 8445a9158e..76e440db4b 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 20c981d6c3..fb905292d3 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 7d5890c6bb..bb2c31ebdb 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) {