aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-02-06 22:19:32 +0000
committerGinger Bill <bill@gingerbill.org>2017-02-06 22:19:32 +0000
commit8cfae17535518cd10ebe26eb5d4539805ce81295 (patch)
tree53da6cb276bdec3f9b5ccb88eaa7d49d5388ba1b /src/check_expr.c
parentdf78b8ad3ebd263849eee6736fd78efe017522a4 (diff)
`map` literals
Diffstat (limited to 'src/check_expr.c')
-rw-r--r--src/check_expr.c31
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);