diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-26 15:05:27 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-26 15:05:27 -0700 |
| commit | 1f8e3871ee11c71b7965e8b9e97fa37a8e994d68 (patch) | |
| tree | 130c237a692aad2f42217e221426a64830770ec2 /src/codegen.cpp | |
| parent | 5943f995106f9fc2c7c5b416c8d4a2ebba2b8315 (diff) | |
| download | zig-1f8e3871ee11c71b7965e8b9e97fa37a8e994d68.tar.gz zig-1f8e3871ee11c71b7965e8b9e97fa37a8e994d68.zip | |
parse if maybe expression
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index f7ebe6f9e1..0838b29aec 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -769,18 +769,18 @@ static LLVMValueRef gen_return_expr(CodeGen *g, AstNode *node) { } } -static LLVMValueRef gen_if_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeIfExpr); - assert(node->data.if_expr.condition); - assert(node->data.if_expr.then_block); +static LLVMValueRef gen_if_bool_expr(CodeGen *g, AstNode *node) { + assert(node->type == NodeTypeIfBoolExpr); + assert(node->data.if_bool_expr.condition); + assert(node->data.if_bool_expr.then_block); - LLVMValueRef cond_value = gen_expr(g, node->data.if_expr.condition); + LLVMValueRef cond_value = gen_expr(g, node->data.if_bool_expr.condition); - TypeTableEntry *then_type = get_expr_type(node->data.if_expr.then_block); + TypeTableEntry *then_type = get_expr_type(node->data.if_bool_expr.then_block); bool use_expr_value = (then_type->id != TypeTableEntryIdUnreachable && then_type->id != TypeTableEntryIdVoid); - if (node->data.if_expr.else_node) { + if (node->data.if_bool_expr.else_node) { LLVMBasicBlockRef then_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "Then"); LLVMBasicBlockRef else_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "Else"); LLVMBasicBlockRef endif_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "EndIf"); @@ -788,13 +788,13 @@ static LLVMValueRef gen_if_expr(CodeGen *g, AstNode *node) { LLVMBuildCondBr(g->builder, cond_value, then_block, else_block); LLVMPositionBuilderAtEnd(g->builder, then_block); - LLVMValueRef then_expr_result = gen_expr(g, node->data.if_expr.then_block); - if (get_expr_type(node->data.if_expr.then_block)->id != TypeTableEntryIdUnreachable) + LLVMValueRef then_expr_result = gen_expr(g, node->data.if_bool_expr.then_block); + if (get_expr_type(node->data.if_bool_expr.then_block)->id != TypeTableEntryIdUnreachable) LLVMBuildBr(g->builder, endif_block); LLVMPositionBuilderAtEnd(g->builder, else_block); - LLVMValueRef else_expr_result = gen_expr(g, node->data.if_expr.else_node); - if (get_expr_type(node->data.if_expr.else_node)->id != TypeTableEntryIdUnreachable) + LLVMValueRef else_expr_result = gen_expr(g, node->data.if_bool_expr.else_node); + if (get_expr_type(node->data.if_bool_expr.else_node)->id != TypeTableEntryIdUnreachable) LLVMBuildBr(g->builder, endif_block); LLVMPositionBuilderAtEnd(g->builder, endif_block); @@ -818,14 +818,19 @@ static LLVMValueRef gen_if_expr(CodeGen *g, AstNode *node) { LLVMBuildCondBr(g->builder, cond_value, then_block, endif_block); LLVMPositionBuilderAtEnd(g->builder, then_block); - gen_expr(g, node->data.if_expr.then_block); - if (get_expr_type(node->data.if_expr.then_block)->id != TypeTableEntryIdUnreachable) + gen_expr(g, node->data.if_bool_expr.then_block); + if (get_expr_type(node->data.if_bool_expr.then_block)->id != TypeTableEntryIdUnreachable) LLVMBuildBr(g->builder, endif_block); LLVMPositionBuilderAtEnd(g->builder, endif_block); return nullptr; } +static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { + assert(node->type == NodeTypeIfVarExpr); + zig_panic("TODO gen_if_var_expr"); +} + static LLVMValueRef gen_block(CodeGen *g, AstNode *block_node, TypeTableEntry *implicit_return_type) { assert(block_node->type == NodeTypeBlock); @@ -1112,8 +1117,10 @@ static LLVMValueRef gen_expr_no_cast(CodeGen *g, AstNode *node) { return LLVMConstAllOnes(LLVMInt1Type()); else return LLVMConstNull(LLVMInt1Type()); - case NodeTypeIfExpr: - return gen_if_expr(g, node); + case NodeTypeIfBoolExpr: + return gen_if_bool_expr(g, node); + case NodeTypeIfVarExpr: + return gen_if_var_expr(g, node); case NodeTypeWhileExpr: return gen_while_expr(g, node); case NodeTypeAsmExpr: |
