diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-02-06 22:19:32 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-02-06 22:19:32 +0000 |
| commit | 8cfae17535518cd10ebe26eb5d4539805ce81295 (patch) | |
| tree | 53da6cb276bdec3f9b5ccb88eaa7d49d5388ba1b /src/check_expr.c | |
| parent | df78b8ad3ebd263849eee6736fd78efe017522a4 (diff) | |
`map` literals
Diffstat (limited to 'src/check_expr.c')
| -rw-r--r-- | src/check_expr.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/check_expr.c b/src/check_expr.c index b271a62f9..13f66d060 100644 --- a/src/check_expr.c +++ b/src/check_expr.c @@ -2885,14 +2885,14 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id Type *type = operand->type; if (!is_type_pointer(type)) { gbString str = type_to_string(type); - error_node(operand->expr, "Expected a pointer to a dynamic array, got `%s`", str); + error_node(operand->expr, "Expected a pointer, got `%s`", str); gb_string_free(str); return false; } type = type_deref(type); - if (!is_type_dynamic_array(type)) { + if (!is_type_dynamic_array(type) && !is_type_map(type)) { gbString str = type_to_string(type); - error_node(operand->expr, "Expected a pointer to a dynamic array, got `%s`", str); + error_node(operand->expr, "Expected a pointer to a map or dynamic array, got `%s`", str); gb_string_free(str); return false; } @@ -4750,6 +4750,31 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint } } break; + case Type_Map: { + if (cl->elems.count == 0) { + break; + } + is_constant = false; + { // Checker values + for_array(i, cl->elems) { + AstNode *elem = cl->elems.e[i]; + if (elem->kind != AstNode_FieldValue) { + error_node(elem, "Only `field = value` elements are allowed in a map literal"); + continue; + } + ast_node(fv, FieldValue, elem); + check_expr_with_type_hint(c, o, fv->field, t->Map.key); + check_assignment(c, o, t->Map.key, str_lit("map literal")); + if (o->mode == Addressing_Invalid) { + continue; + } + + check_expr_with_type_hint(c, o, fv->value, t->Map.value); + check_assignment(c, o, t->Map.value, str_lit("map literal")); + } + } + } break; + default: { gbString str = type_to_string(type); error_node(node, "Invalid compound literal type `%s`", str); |