From 8a8d8919f8509a63f40e875ead29ecc96ef41da8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 4 Mar 2009 17:38:37 -0800 Subject: reject invalid map key types at compile time R=ken OCL=25720 CL=25720 --- src/cmd/gc/go.h | 1 + src/cmd/gc/go.y | 16 ++++------------ src/cmd/gc/subr.c | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 12 deletions(-) (limited to 'src') 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) { -- cgit v1.2.3