int isinter(Type*);
int isnilinter(Type*);
int isddd(Type*);
+Type* maptype(Type*, Type*);
Type* dclmethod(Type*);
Type* methtype(Type*);
int methconv(Type*);
| LMAP '[' type ']' type
{
// map literal
- $$ = typ(TMAP);
- $$->down = $3;
- $$->type = $5;
+ $$ = maptype($3, $5);
}
| structtype
| '(' type ')'
}
| LMAP '[' type ']' Atype
{
- $$ = typ(TMAP);
- $$->down = $3;
- $$->type = $5;
+ $$ = maptype($3, $5);
}
| '*' Atype
{
}
| LMAP '[' type ']' Btype
{
- $$ = typ(TMAP);
- $$->down = $3;
- $$->type = $5;
+ $$ = maptype($3, $5);
}
| '*' Btype
{
}
| LMAP '[' hidden_type ']' hidden_type
{
- $$ = typ(TMAP);
- $$->down = $3;
- $$->type = $5;
+ $$ = maptype($3, $5);
}
| LSTRUCT '{' ohidden_structdcl_list '}'
{
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)
{