]> Cypherpunks repositories - gostls13.git/commitdiff
reject invalid map key types at compile time
authorRuss Cox <rsc@golang.org>
Thu, 5 Mar 2009 01:38:37 +0000 (17:38 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 5 Mar 2009 01:38:37 +0000 (17:38 -0800)
R=ken
OCL=25720
CL=25720

src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c

index 8445a9158e2839dc6df0192c0b20a2a56e98fe3d..76e440db4ba4347de526f350d0a48d934aef2477 100644 (file)
@@ -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*);
index 20c981d6c3b0054cdd34102632368e71ba1cbca5..fb905292d311be09b0dc5b95abd593fba358366b 100644 (file)
@@ -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 '}'
        {
index 7d5890c6bb234c118a8138a7cbe7f8adfd337364..bb2c31ebdb4c2a64bc61adeee19cf839ecf10b26 100644 (file)
@@ -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)
 {