error sets: fix peer resolution of error unions
This commit is contained in:
parent
b7bc259093
commit
6940212ecb
@ -1790,7 +1790,8 @@ static LLVMValueRef ir_render_bin_op(CodeGen *g, IrExecutable *executable,
|
|||||||
|
|
||||||
assert(op1->value.type == op2->value.type || op_id == IrBinOpBitShiftLeftLossy ||
|
assert(op1->value.type == op2->value.type || op_id == IrBinOpBitShiftLeftLossy ||
|
||||||
op_id == IrBinOpBitShiftLeftExact || op_id == IrBinOpBitShiftRightLossy ||
|
op_id == IrBinOpBitShiftLeftExact || op_id == IrBinOpBitShiftRightLossy ||
|
||||||
op_id == IrBinOpBitShiftRightExact);
|
op_id == IrBinOpBitShiftRightExact ||
|
||||||
|
(op1->value.type->id == TypeTableEntryIdErrorSet && op2->value.type->id == TypeTableEntryIdErrorSet));
|
||||||
TypeTableEntry *type_entry = op1->value.type;
|
TypeTableEntry *type_entry = op1->value.type;
|
||||||
|
|
||||||
bool want_runtime_safety = bin_op_instruction->safety_check_on &&
|
bool want_runtime_safety = bin_op_instruction->safety_check_on &&
|
||||||
|
17
src/ir.cpp
17
src/ir.cpp
@ -7258,8 +7258,8 @@ static TypeTableEntry *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_nod
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// unset all the errors
|
// unset all the errors
|
||||||
for (uint32_t i = 0; i < prev_err_set_type->data.error_set.err_count; i += 1) {
|
for (uint32_t i = 0; i < err_set_type->data.error_set.err_count; i += 1) {
|
||||||
ErrorTableEntry *error_entry = prev_err_set_type->data.error_set.errors[i];
|
ErrorTableEntry *error_entry = err_set_type->data.error_set.errors[i];
|
||||||
errors[error_entry->value] = nullptr;
|
errors[error_entry->value] = nullptr;
|
||||||
}
|
}
|
||||||
for (uint32_t i = 0; i < cur_err_set_type->data.error_set.err_count; i += 1) {
|
for (uint32_t i = 0; i < cur_err_set_type->data.error_set.err_count; i += 1) {
|
||||||
@ -7320,6 +7320,19 @@ static TypeTableEntry *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_nod
|
|||||||
if (cur_type->id == TypeTableEntryIdErrorUnion &&
|
if (cur_type->id == TypeTableEntryIdErrorUnion &&
|
||||||
types_match_const_cast_only(ira, cur_type->data.error_union.payload_type, prev_type, source_node).id == ConstCastResultIdOk)
|
types_match_const_cast_only(ira, cur_type->data.error_union.payload_type, prev_type, source_node).id == ConstCastResultIdOk)
|
||||||
{
|
{
|
||||||
|
if (err_set_type != nullptr) {
|
||||||
|
TypeTableEntry *cur_err_set_type = cur_type->data.error_union.err_set_type;
|
||||||
|
if (!resolve_inferred_error_set(ira, cur_err_set_type, cur_inst->source_node)) {
|
||||||
|
return ira->codegen->builtin_types.entry_invalid;
|
||||||
|
}
|
||||||
|
if (type_is_global_error_set(cur_err_set_type) || type_is_global_error_set(err_set_type)) {
|
||||||
|
err_set_type = ira->codegen->builtin_types.entry_global_error_set;
|
||||||
|
prev_inst = cur_inst;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
err_set_type = get_error_set_union(ira->codegen, errors, err_set_type, cur_err_set_type);
|
||||||
|
}
|
||||||
prev_inst = cur_inst;
|
prev_inst = cur_inst;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -264,7 +264,7 @@ pub fn openSelfDebugInfo(allocator: &mem.Allocator) !&ElfStackTrace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn printLineFromFile(allocator: &mem.Allocator, out_stream: &io.OutStream, line_info: &const LineInfo) !void {
|
fn printLineFromFile(allocator: &mem.Allocator, out_stream: var, line_info: &const LineInfo) !void {
|
||||||
var f = try io.File.openRead(line_info.file_name, allocator);
|
var f = try io.File.openRead(line_info.file_name, allocator);
|
||||||
defer f.close();
|
defer f.close();
|
||||||
// TODO fstat and make sure that the file has the correct size
|
// TODO fstat and make sure that the file has the correct size
|
||||||
@ -1054,7 +1054,7 @@ fn readULeb128(in_stream: var) !u64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn readILeb128(in_stream: &io.InStream) !i64 {
|
fn readILeb128(in_stream: var) !i64 {
|
||||||
var result: i64 = 0;
|
var result: i64 = 0;
|
||||||
var shift: usize = 0;
|
var shift: usize = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user