comptime-state propagation through generated struct field resolution

This commit is contained in:
2026-07-20 08:33:59 +02:00
parent 59bbb197e0
commit 10abba54a5
3 changed files with 49 additions and 24 deletions
+13 -3
View File
@@ -1150,7 +1150,7 @@ ct_eval_expr :: proc(
resolved := type_from_syntax(checker, expr.type, state.pkg, state.file)
return ct_add_value(state, Ct_Value{kind=.Type, type=types.INVALID, index=u64(resolved)}), ct_flow(.Normal), types.is_valid(resolved)
case .Anonymous_Struct_Type:
resolved := resolve_generated_struct_type(checker, expr_id, state.pkg, state.file)
resolved := resolve_generated_struct_type(checker, expr_id, state.pkg, state.file, state)
return ct_add_value(state, Ct_Value{kind=.Type, type=types.INVALID, index=u64(resolved)}), ct_flow(.Normal), types.is_valid(resolved)
case .Enum_Literal:
return ct_eval_enum_literal(state, expr, expected, depth+1)
@@ -4451,7 +4451,17 @@ eval_integer_constant_in_context :: proc(
}
state := ct_state_make(checker, pkg, file, types.INVALID, values, diagnose=false)
defer ct_state_destroy(&state)
value, flow, ok := ct_eval_expr(&state, expr_id, types.INVALID, depth)
return eval_integer_constant_in_state(&state, expr_id, depth)
}
eval_integer_constant_in_state :: proc(state: ^Ct_State, expr_id: ast.Expr_Id, depth := 0) -> Constant {
if depth > 64 || expr_id == ast.INVALID_EXPR || int(expr_id) >= len(state.checker.ast_module.exprs) {
return Constant{kind=.Not_Constant}
}
previous_silent := state.silent
state.silent = true
defer state.silent = previous_silent
value, flow, ok := ct_eval_expr(state, expr_id, types.INVALID, depth)
if !ok || flow.kind != .Normal {
#partial switch state.error {
case .Overflow:
@@ -4465,7 +4475,7 @@ eval_integer_constant_in_context :: proc(
}
return Constant{kind=.Not_Constant}
}
integer, integer_ok := ct_integer_value(&state, value)
integer, integer_ok := ct_integer_value(state, value)
if !integer_ok {
return Constant{kind=.Not_Constant}
}