mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-24 00:17:54 +00:00
type_info_of allows typeid; typeid_of allows ^Type_Info; Otherwise only allow type
This commit is contained in:
@@ -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;
|
||||
|
||||
+21
-4
@@ -4209,13 +4209,30 @@ irValue *ir_build_builtin_proc(irProcedure *proc, AstNode *expr, TypeAndValue tv
|
||||
}
|
||||
|
||||
case BuiltinProc_type_info_of: {
|
||||
Type *t = default_type(type_of_expr(proc->module->info, ce->args[0]));
|
||||
return ir_type_info(proc, t);
|
||||
AstNode *arg = ce->args[0];
|
||||
TypeAndValue tav = type_and_value_of_expr(proc->module->info, arg);
|
||||
if (tav.mode == Addressing_Type) {
|
||||
Type *t = default_type(type_of_expr(proc->module->info, arg));
|
||||
return ir_type_info(proc, t);
|
||||
}
|
||||
GB_ASSERT(is_type_typeid(tav.type));
|
||||
irValue *id = ir_emit_bitcast(proc, ir_build_expr(proc, arg), t_uintptr);
|
||||
return ir_emit_array_ep(proc, ir_global_type_info_data, id);
|
||||
}
|
||||
|
||||
case BuiltinProc_typeid_of: {
|
||||
Type *t = default_type(type_of_expr(proc->module->info, ce->args[0]));
|
||||
return ir_typeid(proc, t);
|
||||
AstNode *arg = ce->args[0];
|
||||
TypeAndValue tav = type_and_value_of_expr(proc->module->info, arg);
|
||||
if (tav.mode == Addressing_Type) {
|
||||
Type *t = default_type(type_of_expr(proc->module->info, arg));
|
||||
return ir_typeid(proc, t);
|
||||
}
|
||||
Type *t = base_type(tav.type);
|
||||
GB_ASSERT(are_types_identical(t, t_type_info_ptr));
|
||||
|
||||
auto args = array_make<irValue *>(proc->module->allocator, 1);
|
||||
args[0] = ir_emit_conv(proc, ir_build_expr(proc, arg), t_type_info_ptr);
|
||||
return ir_emit_global_call(proc, "__typeid_of", args);
|
||||
}
|
||||
|
||||
case BuiltinProc_len: {
|
||||
|
||||
Reference in New Issue
Block a user