zig

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

commit 4a5cd0b895d0c6093fa710ed4ecb819726b58c25 (tree)
parent 01fb42103115a58c4b693a600dc5379fedb4ea86
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Fri, 15 Mar 2019 23:52:11 -0400

fix while continue block not checking for ignored expression

closes #957

Diffstat:
Msrc/ir.cpp | 12+++++++++---
Mtest/compile_errors.zig | 22++++++++++++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/ir.cpp b/src/ir.cpp @@ -5462,8 +5462,10 @@ static IrInstruction *ir_gen_while_expr(IrBuilder *irb, Scope *scope, AstNode *n IrInstruction *expr_result = ir_gen_node(irb, continue_expr_node, payload_scope); if (expr_result == irb->codegen->invalid_instruction) return expr_result; - if (!instr_is_unreachable(expr_result)) + if (!instr_is_unreachable(expr_result)) { + ir_mark_gen(ir_build_check_statement_is_void(irb, payload_scope, continue_expr_node, expr_result)); ir_mark_gen(ir_build_br(irb, payload_scope, node, cond_block, is_comptime)); + } } ir_set_cursor_at_end_and_append_block(irb, else_block); @@ -5544,8 +5546,10 @@ static IrInstruction *ir_gen_while_expr(IrBuilder *irb, Scope *scope, AstNode *n IrInstruction *expr_result = ir_gen_node(irb, continue_expr_node, child_scope); if (expr_result == irb->codegen->invalid_instruction) return expr_result; - if (!instr_is_unreachable(expr_result)) + if (!instr_is_unreachable(expr_result)) { + ir_mark_gen(ir_build_check_statement_is_void(irb, child_scope, continue_expr_node, expr_result)); ir_mark_gen(ir_build_br(irb, child_scope, node, cond_block, is_comptime)); + } } IrInstruction *else_result = nullptr; @@ -5609,8 +5613,10 @@ static IrInstruction *ir_gen_while_expr(IrBuilder *irb, Scope *scope, AstNode *n IrInstruction *expr_result = ir_gen_node(irb, continue_expr_node, subexpr_scope); if (expr_result == irb->codegen->invalid_instruction) return expr_result; - if (!instr_is_unreachable(expr_result)) + if (!instr_is_unreachable(expr_result)) { + ir_mark_gen(ir_build_check_statement_is_void(irb, scope, continue_expr_node, expr_result)); ir_mark_gen(ir_build_br(irb, scope, node, cond_block, is_comptime)); + } } IrInstruction *else_result = nullptr; diff --git a/test/compile_errors.zig b/test/compile_errors.zig @@ -3,6 +3,28 @@ const builtin = @import("builtin"); pub fn addCases(cases: *tests.CompileErrorContext) void { cases.add( + "ignored expression in while continuation", + \\export fn a() void { + \\ while (true) : (bad()) {} + \\} + \\export fn b() void { + \\ var x: anyerror!i32 = 1234; + \\ while (x) |_| : (bad()) {} else |_| {} + \\} + \\export fn c() void { + \\ var x: ?i32 = 1234; + \\ while (x) |_| : (bad()) {} + \\} + \\fn bad() anyerror!void { + \\ return error.Bad; + \\} + , + "tmp.zig:2:24: error: expression value is ignored", + "tmp.zig:6:25: error: expression value is ignored", + "tmp.zig:10:25: error: expression value is ignored", + ); + + cases.add( "import outside package path", \\comptime{ \\ _ = @import("../a.zig");