structs as errors in fallibles
This commit is contained in:
@@ -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",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user