caller-context comptime preservation

This commit is contained in:
2026-07-22 11:32:28 +02:00
parent 07e89e23e1
commit ec5880e757
2 changed files with 13 additions and 10 deletions
+12 -3
View File
@@ -3491,10 +3491,19 @@ ct_eval_template_call :: proc(
if param.comptime_value { if param.comptime_value {
continue continue
} }
param_type := type_from_syntax(checker, param.type, function.pkg, function.file)
if index >= len(args) { if index >= len(args) {
return INVALID_CT_VALUE, ct_flow(.Normal), false return INVALID_CT_VALUE, ct_flow(.Normal), false
} }
append(&runtime_types, type_from_syntax(checker, param.type, function.pkg, function.file))
append(&runtime_names, param.name)
}
checker.current_comptime_values = previous_comptime
runtime_index := 0
for param, index in function.params {
if param.comptime_value {
continue
}
param_type := runtime_types[runtime_index]
value, flow, ok := ct_eval_expr(state, args[index], param_type, depth+1) value, flow, ok := ct_eval_expr(state, args[index], param_type, depth+1)
if !ok || flow.kind != .Normal { if !ok || flow.kind != .Normal {
return INVALID_CT_VALUE, flow, ok return INVALID_CT_VALUE, flow, ok
@@ -3510,9 +3519,9 @@ ct_eval_template_call :: proc(
) )
} }
append(&runtime_values, value) append(&runtime_values, value)
append(&runtime_types, param_type) runtime_index += 1
append(&runtime_names, param.name)
} }
checker.current_comptime_values = comptime_values
previous_pkg := state.pkg previous_pkg := state.pkg
previous_file := state.file previous_file := state.file
previous_result := state.result previous_result := state.result
+1 -7
View File
@@ -27,13 +27,7 @@ init func($V type, $N usize, $entries [N]Pair(V)) StaticStringMap(V) {
compile_error!("static string map key is too long") compile_error!("static string map key is too long")
} }
for (usize(0))..i |prior| { for (usize(0))..i |prior| {
other :: entries[prior].0 if mem.eql(u8, entry.0, entries[prior].0) {
equal bool = entry.0.len == other.len
byte_index usize = 0
while equal and byte_index < entry.0.len : byte_index += 1 {
equal = entry.0[byte_index] == other[byte_index]
}
if equal {
compile_error!("duplicate static string map key") compile_error!("duplicate static string map key")
} }
} }