aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-31 21:32:05 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-31 21:32:05 -0700
commit675de74412e6006ee270fdd2a3b3e20727328af0 (patch)
treea906213304c373619b413b040eb09513efd741e9 /src/codegen.cpp
parenta4e19f94f10445273b977e21e721d236a37c5cf4 (diff)
downloadzig-675de74412e6006ee270fdd2a3b3e20727328af0.tar.gz
zig-675de74412e6006ee270fdd2a3b3e20727328af0.zip
codegen: fix negation for floats
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp15
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);