From deb35868841fc3eb99228fe102a5b8ed1991d51f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 25 Jan 2016 15:45:05 -0700 Subject: implement %% prefix operator See #23 also make undefined constants use llvm undef value --- src/codegen.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/codegen.cpp') diff --git a/src/codegen.cpp b/src/codegen.cpp index b86f3b3b5a..6d26793013 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -833,6 +833,24 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { { zig_panic("TODO codegen PrefixOpError"); } + case PrefixOpUnwrapError: + { + LLVMValueRef expr_val = gen_expr(g, expr_node); + TypeTableEntry *expr_type = get_expr_type(expr_node); + assert(expr_type->id == TypeTableEntryIdErrorUnion); + 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) { + LLVMValueRef child_val_ptr = LLVMBuildStructGEP(g->builder, expr_val, 1, ""); + if (handle_is_ptr(child_type)) { + return child_val_ptr; + } else { + return expr_val; + } + } else { + return nullptr; + } + } } zig_unreachable(); } @@ -2219,7 +2237,7 @@ static LLVMValueRef gen_const_val(CodeGen *g, TypeTableEntry *type_entry, ConstE assert(const_val->ok); if (const_val->undef) { - return LLVMConstNull(type_entry->type_ref); + return LLVMGetUndef(type_entry->type_ref); } if (type_entry->id == TypeTableEntryIdInt) { -- cgit v1.2.3