aboutsummaryrefslogtreecommitdiff
path: root/src/checker/expr.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-11-20 01:34:43 +0000
committerGinger Bill <bill@gingerbill.org>2016-11-20 01:34:43 +0000
commit24347ced45aabd3ce4f4a261b8140a976cadff2e (patch)
tree32ba1cd9ec5ce7503dd0a86ad8e417cc73324cc1 /src/checker/expr.cpp
parent24ca1065214f51cfbeb9c0eff98002c7d33139a2 (diff)
Support `any` in `match type`
Diffstat (limited to 'src/checker/expr.cpp')
-rw-r--r--src/checker/expr.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/checker/expr.cpp b/src/checker/expr.cpp
index 1d9cad048..4afef5385 100644
--- a/src/checker/expr.cpp
+++ b/src/checker/expr.cpp
@@ -1543,22 +1543,32 @@ void check_comparison(Checker *c, Operand *x, Operand *y, Token op) {
if (check_is_assignable_to(c, x, y->type) ||
check_is_assignable_to(c, y, x->type)) {
+ Type *err_type = x->type;
b32 defined = false;
switch (op.kind) {
case Token_CmpEq:
case Token_NotEq:
- defined = is_type_comparable(get_enum_base_type(base_type(x->type)));
+ defined = is_type_comparable(x->type);
break;
case Token_Lt:
case Token_Gt:
case Token_LtEq:
case Token_GtEq: {
- defined = is_type_ordered(get_enum_base_type(base_type(x->type)));
+ defined = is_type_ordered(x->type);
} break;
}
+ // CLEANUP(bill) NOTE(bill): there is an auto assignment to `any` which needs to be checked
+ if (is_type_any(x->type) && !is_type_any(y->type)) {
+ err_type = x->type;
+ defined = false;
+ } else if (is_type_any(y->type) && !is_type_any(x->type)) {
+ err_type = y->type;
+ defined = false;
+ }
+
if (!defined) {
- gbString type_string = type_to_string(x->type);
+ gbString type_string = type_to_string(err_type);
defer (gb_string_free(type_string));
err_str = gb_string_make(c->tmp_allocator,
gb_bprintf("operator `%.*s` not defined for type `%s`", LIT(op.string), type_string));