diff options
| author | gingerBill <bill@gingerbill.org> | 2018-05-12 19:54:16 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-05-12 19:54:16 +0100 |
| commit | 373a60b9ef414f857d454bf7907fe9872e9b077f (patch) | |
| tree | 17bba4a522e510f71d5d5202c01383b86270fbc8 /src/check_expr.cpp | |
| parent | 2ef22e86e0742d6dcf0e8c4796f126134e808086 (diff) | |
`type_info_of` allows `typeid`; `typeid_of` allows `^Type_Info`; Otherwise only allow type
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index a2510f56b..e592597d2 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3421,6 +3421,13 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id add_type_info_type(c, t); + if (is_operand_value(o) && is_type_typeid(t)) { + // Okay + } else if (o.mode != Addressing_Type) { + error(ce->args[0], "Expected a type or typeid for 'type_info_of'"); + return false; + } + operand->mode = Addressing_Value; operand->type = t_type_info_ptr; @@ -3450,6 +3457,16 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id add_type_info_type(c, t); + t = base_type(t); + if (is_operand_value(o) && are_types_identical(t, t_type_info_ptr)) { + add_preload_dependency(c, "__typeid_of"); + } else if (o.mode != Addressing_Type) { + gbString ts = type_to_string(o.type); + error(ce->args[0], "Expected a type or type info for 'typeid_of', got %s", ts); + gb_string_free(ts); + return false; + } + operand->mode = Addressing_Value; operand->type = t_typeid; break; |