From b50844185991a86bac462346413341b87eda14cd Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 27 Jan 2016 14:49:48 -0700 Subject: [PATCH] fix `%%` prefix operator codegen for simple values closes #93 --- src/codegen.cpp | 3 ++- test/run_tests.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 008ec9b395..78592e4d09 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -916,11 +916,12 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { TypeTableEntry *child_type = expr_type->data.error.child_type; // TODO in debug mode, put a panic here if the error is not 0 if (child_type->size_in_bits > 0) { + add_debug_source_node(g, node); LLVMValueRef child_val_ptr = LLVMBuildStructGEP(g->builder, expr_val, 1, ""); if (handle_is_ptr(child_type)) { return child_val_ptr; } else { - return expr_val; + return LLVMBuildLoad(g->builder, child_val_ptr, ""); } } else { return nullptr; diff --git a/test/run_tests.cpp b/test/run_tests.cpp index f0834e2ba7..2b80832e8b 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1329,6 +1329,21 @@ fn f() -> &void { pub fn main(args: [][]u8) -> %void { const a = f(); return *a; +} + )SOURCE", "OK\n"); + + add_simple_case("unwrap simple value from error", R"SOURCE( +import "std.zig"; +fn do() -> %isize { + 13 +} + +pub fn main(args: [][]u8) -> %void { + const i = %%do(); + if (i != 13) { + %%stdout.printf("BAD\n"); + } + %%stdout.printf("OK\n"); } )SOURCE", "OK\n"); }