structs as errors in fallibles

This commit is contained in:
2026-08-08 22:49:31 +02:00
parent e0f1d2d7cb
commit 729488e702
5 changed files with 80 additions and 5 deletions
+5 -4
View File
@@ -3976,19 +3976,20 @@ validate_declarations :: proc(checker: ^Checker) {
}
if types.is_valid(function.error) && !signature_poisoned {
error_type := type_from_syntax(checker, function.error, function.pkg, function.file)
error_sum := types.is_enum(error_type, &checker.module.types) ||
types.is_tagged_union(error_type, &checker.module.types)
error_channel := types.is_enum(error_type, &checker.module.types) ||
types.is_struct(error_type, &checker.module.types) ||
types.is_tagged_union(error_type, &checker.module.types)
if function.c_abi {
checker.template_diagnostics[function_id] = source.add(
checker.diagnostics,
function.span,
"fallible functions must use 'func', not 'c_func'",
)
} else if !error_sum {
} else if !error_channel {
checker.template_diagnostics[function_id] = source.add(
checker.diagnostics,
function.span,
"fallible function error type must be a native enum or tagged union",
"fallible function error type must be a native enum, struct, or tagged union",
)
}
}
+13
View File
@@ -4487,6 +4487,19 @@ ct_return_value :: proc(state: ^Ct_State, expr_id: ast.Expr_Id, span: source.Spa
if expr.kind == .Enum_Literal && types.sum_has_name(&checker.module.types, error_type, u32(expr.name)) {
error_path = true
expected = error_type
} else if expr.kind == .Struct_Literal {
target_pkg, available := expr_package(checker, expr, state.pkg, state.file, true)
named := types.find_named(
&checker.module.types,
u32(target_pkg),
u32(expr.name),
file=u32(expr_lookup_file(expr, state.file)),
) if available else types.INVALID
named = types.resolve_alias(named, &checker.module.types)
if can_implicitly_convert_type(checker, named, error_type) {
error_path = true
expected = error_type
}
} else if expr.kind == .Name && !symbol.is_valid(expr.qualifier) {
if index, found := ct_find_binding_index(state, expr.name); found {
actual := state.bindings[index].type