aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2026-01-26 18:23:29 +0000
committergingerBill <gingerBill@users.noreply.github.com>2026-01-26 18:23:29 +0000
commit3586bda6ae80b1dca1984ae54b023d5fec69067e (patch)
treed1b8bba874b42fae91e12f095f10ad017bef9b34 /src
parent467954bc7baed8061348b6dc5ddda1a742ea69f4 (diff)
Use `context.assertion_failure_proc` with type assertions when the `context` is available, otherwise use a trivial trap.
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp16
-rw-r--r--src/llvm_backend_expr.cpp27
-rw-r--r--src/llvm_backend_utility.cpp13
3 files changed, 47 insertions, 9 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 42a398597..7d2240fdf 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -11064,8 +11064,20 @@ gb_internal ExprKind check_type_assertion(CheckerContext *c, Operand *o, Ast *no
end:;
if ((c->state_flags & StateFlag_no_type_assert) == 0) {
- add_package_dependency(c, "runtime", "type_assertion_check");
- add_package_dependency(c, "runtime", "type_assertion_check2");
+ bool has_context = true;
+ if (c->proc_name.len == 0 && c->curr_proc_sig == nullptr) {
+ has_context = false;
+ } else if ((c->scope->flags & ScopeFlag_ContextDefined) == 0) {
+ has_context = false;
+ }
+
+ if (has_context) {
+ add_package_dependency(c, "runtime", "type_assertion_check_with_context");
+ add_package_dependency(c, "runtime", "type_assertion_check2_with_context");
+ } else {
+ add_package_dependency(c, "runtime", "type_assertion_check_contextless");
+ add_package_dependency(c, "runtime", "type_assertion_check2_contextless");
+ }
}
return kind;
}
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 3c7092a32..aba196af8 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -3865,7 +3865,12 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
args[4] = lb_typeid(p->module, src_type);
args[5] = lb_typeid(p->module, dst_type);
}
- lb_emit_runtime_call(p, "type_assertion_check", args);
+
+ char const *name = "type_assertion_check_contextless";
+ if (p->context_stack.count > 0) {
+ name = "type_assertion_check_with_context";
+ }
+ lb_emit_runtime_call(p, name, args);
}
lbValue data_ptr = v;
@@ -3881,16 +3886,28 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
lbValue any_id = lb_emit_struct_ev(p, v, 1);
+ isize arg_count = 6;
+ if (build_context.no_rtti) {
+ arg_count = 4;
+ }
+
lbValue id = lb_typeid(p->module, type);
lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id);
- auto args = array_make<lbValue>(permanent_allocator(), 6);
+ auto args = array_make<lbValue>(permanent_allocator(), arg_count);
args[0] = ok;
lb_set_file_line_col(p, array_slice(args, 1, args.count), pos);
- args[4] = any_id;
- args[5] = id;
- lb_emit_runtime_call(p, "type_assertion_check", args);
+ if (!build_context.no_rtti) {
+ args[4] = any_id;
+ args[5] = id;
+ }
+
+ char const *name = "type_assertion_check_contextless";
+ if (p->context_stack.count > 0) {
+ name = "type_assertion_check_with_context";
+ }
+ lb_emit_runtime_call(p, name, args);
}
return lb_emit_conv(p, data_ptr, tv.type);
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 43cac70c1..929239486 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -803,7 +803,12 @@ gb_internal lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type
args[5] = lb_typeid(m, dst_type);
args[6] = lb_emit_conv(p, value_, t_rawptr);
}
- lb_emit_runtime_call(p, "type_assertion_check2", args);
+
+ char const *name = "type_assertion_check2_contextless";
+ if (p->context_stack.count > 0) {
+ name = "type_assertion_check2_with_context";
+ }
+ lb_emit_runtime_call(p, name, args);
}
return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0));
@@ -877,7 +882,11 @@ gb_internal lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *ty
args[5] = dst_typeid;
args[6] = lb_emit_struct_ev(p, value, 0);
}
- lb_emit_runtime_call(p, "type_assertion_check2", args);
+ char const *name = "type_assertion_check2_contextless";
+ if (p->context_stack.count > 0) {
+ name = "type_assertion_check2_with_context";
+ }
+ lb_emit_runtime_call(p, name, args);
}
return lb_addr(lb_emit_struct_ep(p, v.addr, 0));