From c7920246a594451eafd6c58311f88ceb3f370f88 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 28 Sep 2019 17:58:17 -0300 Subject: [PATCH] codegen: add emitting of unary exprs --- examples/hello.ry | 2 +- src/analysis.zig | 2 +- src/codegen.zig | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/hello.ry b/examples/hello.ry index 26d5cda..fc0e890 100644 --- a/examples/hello.ry +++ b/examples/hello.ry @@ -37,7 +37,7 @@ fn func_refer_param(b: i32) i32 { fn multwo(num: i32, double_flag: bool) i32 { if (!double_flag) { - var value = false; + var value = 32; return value; } diff --git a/src/analysis.zig b/src/analysis.zig index 8a6a90d..acb9b6d 100644 --- a/src/analysis.zig +++ b/src/analysis.zig @@ -214,9 +214,9 @@ pub const TypeSolver = struct { }; }, - // for now, unary operators only have .Not .Unary => |unary| { var right_type = try self.resolveExprType(ctx, unary.right); + return switch (unary.op) { .Negate => right_type, .Not => right_type, diff --git a/src/codegen.zig b/src/codegen.zig index e71517e..592a79b 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -132,6 +132,15 @@ pub const Codegen = struct { }; }, + .Unary => |unary| { + var right = try self.emitExpr(builder, unary.right); + + return switch (unary.op) { + .Negate => llvm.LLVMBuildNeg(builder, right, c"neg_tmp"), + .Not => llvm.LLVMBuildNot(builder, right, c"neg_tmp"), + }; + }, + .Binary => |binary| { var left = try self.emitExpr(builder, binary.left); var right = try self.emitExpr(builder, binary.right);