diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-01-31 21:32:05 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-01-31 21:32:05 -0700 |
| commit | 675de74412e6006ee270fdd2a3b3e20727328af0 (patch) | |
| tree | a906213304c373619b413b040eb09513efd741e9 | |
| parent | a4e19f94f10445273b977e21e721d236a37c5cf4 (diff) | |
| download | zig-675de74412e6006ee270fdd2a3b3e20727328af0.tar.gz zig-675de74412e6006ee270fdd2a3b3e20727328af0.zip | |
codegen: fix negation for floats
| -rw-r--r-- | src/codegen.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index 9af8555d49..a5374eb2de 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -928,6 +928,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { assert(node->data.prefix_op_expr.primary_expr); AstNode *expr_node = node->data.prefix_op_expr.primary_expr; + TypeTableEntry *expr_type = get_expr_type(expr_node); switch (node->data.prefix_op_expr.prefix_op) { case PrefixOpInvalid: @@ -935,8 +936,15 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { case PrefixOpNegation: { LLVMValueRef expr = gen_expr(g, expr_node); - add_debug_source_node(g, node); - return LLVMBuildNeg(g->builder, expr, ""); + if (expr_type->id == TypeTableEntryIdInt) { + add_debug_source_node(g, node); + return LLVMBuildNeg(g->builder, expr, ""); + } else if (expr_type->id == TypeTableEntryIdFloat) { + add_debug_source_node(g, node); + return LLVMBuildFNeg(g->builder, expr, ""); + } else { + zig_unreachable(); + } } case PrefixOpBoolNot: { @@ -961,8 +969,7 @@ static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { case PrefixOpDereference: { LLVMValueRef expr = gen_expr(g, expr_node); - TypeTableEntry *type_entry = get_expr_type(expr_node); - if (type_entry->size_in_bits == 0) { + if (expr_type->size_in_bits == 0) { return nullptr; } else { add_debug_source_node(g, node); |
