mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
commit
ad0871ea4b
@ -63,7 +63,7 @@ pub const ChildProcess = struct {
|
|||||||
|
|
||||||
/// Windows-only. `cwd` was provided, but the path did not exist when spawning the child process.
|
/// Windows-only. `cwd` was provided, but the path did not exist when spawning the child process.
|
||||||
CurrentWorkingDirectoryUnlinked,
|
CurrentWorkingDirectoryUnlinked,
|
||||||
} || os.ExecveError || os.SetIdError || os.ChangeCurDirError || windows.CreateProcessError;
|
} || os.ExecveError || os.SetIdError || os.ChangeCurDirError || windows.CreateProcessError || windows.WaitForSingleObjectError;
|
||||||
|
|
||||||
pub const Term = union(enum) {
|
pub const Term = union(enum) {
|
||||||
Exited: u32,
|
Exited: u32,
|
||||||
|
|||||||
@ -179,7 +179,7 @@ pub const Coff = struct {
|
|||||||
if (byte != 0 and i == buffer.len)
|
if (byte != 0 and i == buffer.len)
|
||||||
return error.NameTooLong;
|
return error.NameTooLong;
|
||||||
|
|
||||||
return i;
|
return @as(usize, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn loadSections(self: *Coff) !void {
|
pub fn loadSections(self: *Coff) !void {
|
||||||
|
|||||||
@ -7725,7 +7725,7 @@ static void do_code_gen(CodeGen *g) {
|
|||||||
|
|
||||||
char *error = nullptr;
|
char *error = nullptr;
|
||||||
if (LLVMVerifyModule(g->module, LLVMReturnStatusAction, &error)) {
|
if (LLVMVerifyModule(g->module, LLVMReturnStatusAction, &error)) {
|
||||||
zig_panic("broken LLVM module found: %s", error);
|
zig_panic("broken LLVM module found: %s\nThis is a bug in the Zig compiler.", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
src/ir.cpp
20
src/ir.cpp
@ -13535,16 +13535,6 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio
|
|||||||
if (type_is_invalid(operand->value.type))
|
if (type_is_invalid(operand->value.type))
|
||||||
return ir_unreach_error(ira);
|
return ir_unreach_error(ira);
|
||||||
|
|
||||||
if (!instr_is_comptime(operand) && ira->explicit_return_type != nullptr &&
|
|
||||||
handle_is_ptr(ira->explicit_return_type))
|
|
||||||
{
|
|
||||||
// result location mechanism took care of it.
|
|
||||||
IrInstruction *result = ir_build_return(&ira->new_irb, instruction->base.scope,
|
|
||||||
instruction->base.source_node, nullptr);
|
|
||||||
result->value.type = ira->codegen->builtin_types.entry_unreachable;
|
|
||||||
return ir_finish_anal(ira, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
IrInstruction *casted_operand = ir_implicit_cast(ira, operand, ira->explicit_return_type);
|
IrInstruction *casted_operand = ir_implicit_cast(ira, operand, ira->explicit_return_type);
|
||||||
if (type_is_invalid(casted_operand->value.type)) {
|
if (type_is_invalid(casted_operand->value.type)) {
|
||||||
AstNode *source_node = ira->explicit_return_type_source_node;
|
AstNode *source_node = ira->explicit_return_type_source_node;
|
||||||
@ -13556,6 +13546,16 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio
|
|||||||
return ir_unreach_error(ira);
|
return ir_unreach_error(ira);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!instr_is_comptime(operand) && ira->explicit_return_type != nullptr &&
|
||||||
|
handle_is_ptr(ira->explicit_return_type))
|
||||||
|
{
|
||||||
|
// result location mechanism took care of it.
|
||||||
|
IrInstruction *result = ir_build_return(&ira->new_irb, instruction->base.scope,
|
||||||
|
instruction->base.source_node, nullptr);
|
||||||
|
result->value.type = ira->codegen->builtin_types.entry_unreachable;
|
||||||
|
return ir_finish_anal(ira, result);
|
||||||
|
}
|
||||||
|
|
||||||
if (casted_operand->value.special == ConstValSpecialRuntime &&
|
if (casted_operand->value.special == ConstValSpecialRuntime &&
|
||||||
casted_operand->value.type->id == ZigTypeIdPointer &&
|
casted_operand->value.type->id == ZigTypeIdPointer &&
|
||||||
casted_operand->value.data.rh_ptr == RuntimeHintPtrStack)
|
casted_operand->value.data.rh_ptr == RuntimeHintPtrStack)
|
||||||
|
|||||||
@ -12,6 +12,27 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
|
|||||||
"tmp.zig:3:5: error: switch must handle all possibilities",
|
"tmp.zig:3:5: error: switch must handle all possibilities",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
cases.add(
|
||||||
|
"incorrect return type",
|
||||||
|
\\ pub export fn entry() void{
|
||||||
|
\\ _ = foo();
|
||||||
|
\\ }
|
||||||
|
\\ const A = struct {
|
||||||
|
\\ a: u32,
|
||||||
|
\\ };
|
||||||
|
\\ fn foo() A {
|
||||||
|
\\ return bar();
|
||||||
|
\\ }
|
||||||
|
\\ const B = struct {
|
||||||
|
\\ a: u32,
|
||||||
|
\\ };
|
||||||
|
\\ fn bar() B {
|
||||||
|
\\ unreachable;
|
||||||
|
\\ }
|
||||||
|
,
|
||||||
|
"tmp.zig:8:16: error: expected type 'A', found 'B'",
|
||||||
|
);
|
||||||
|
|
||||||
cases.add(
|
cases.add(
|
||||||
"regression test #2980: base type u32 is not type checked properly when assigning a value within a struct",
|
"regression test #2980: base type u32 is not type checked properly when assigning a value within a struct",
|
||||||
\\const Foo = struct {
|
\\const Foo = struct {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user