zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit ad0871ea4bf2dfbed07282ffe14738b5347d5d32 (tree)
parent 94299d16d1443cd8b731e2eba9b4d1e3fb8048bd
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 21 Nov 2019 23:24:58 -0500

Merge branch 'Vexu-missing-cast'

Closes #3336
Closes #3718

Diffstat:
Mlib/std/child_process.zig | 2+-
Mlib/std/coff.zig | 2+-
Msrc/codegen.cpp | 2+-
Msrc/ir.cpp | 20++++++++++----------
Mtest/compile_errors.zig | 21+++++++++++++++++++++
5 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig @@ -63,7 +63,7 @@ pub const ChildProcess = struct { /// Windows-only. `cwd` was provided, but the path did not exist when spawning the child process. CurrentWorkingDirectoryUnlinked, - } || os.ExecveError || os.SetIdError || os.ChangeCurDirError || windows.CreateProcessError; + } || os.ExecveError || os.SetIdError || os.ChangeCurDirError || windows.CreateProcessError || windows.WaitForSingleObjectError; pub const Term = union(enum) { Exited: u32, diff --git a/lib/std/coff.zig b/lib/std/coff.zig @@ -179,7 +179,7 @@ pub const Coff = struct { if (byte != 0 and i == buffer.len) return error.NameTooLong; - return i; + return @as(usize, i); } pub fn loadSections(self: *Coff) !void { diff --git a/src/codegen.cpp b/src/codegen.cpp @@ -7725,7 +7725,7 @@ static void do_code_gen(CodeGen *g) { char *error = nullptr; 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); } } diff --git a/src/ir.cpp b/src/ir.cpp @@ -13535,16 +13535,6 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio if (type_is_invalid(operand->value.type)) 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); if (type_is_invalid(casted_operand->value.type)) { 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); } + 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 && casted_operand->value.type->id == ZigTypeIdPointer && casted_operand->value.data.rh_ptr == RuntimeHintPtrStack) diff --git a/test/compile_errors.zig b/test/compile_errors.zig @@ -13,6 +13,27 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { ); 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( "regression test #2980: base type u32 is not type checked properly when assigning a value within a struct", \\const Foo = struct { \\ ptr: ?*usize,