aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-05-12 19:54:16 +0100
committergingerBill <bill@gingerbill.org>2018-05-12 19:54:16 +0100
commit373a60b9ef414f857d454bf7907fe9872e9b077f (patch)
tree17bba4a522e510f71d5d5202c01383b86270fbc8 /src/check_expr.cpp
parent2ef22e86e0742d6dcf0e8c4796f126134e808086 (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.cpp17
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;