aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-16 23:08:09 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-16 23:08:09 +0100
commit25ca0c973842be553326d3cd69ea72fd658b0ba6 (patch)
tree73915d5b244b10f3181e6464da6272d6e051632b /src/test/java
parentff769ec6795b7725f0bfb4d523e2762cb8e1f8c8 (diff)
Add explicit return instruction to function bodies
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java3
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java43
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java3
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java6
4 files changed, 53 insertions, 2 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
index 1575c2ad..f7e86765 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
@@ -25,7 +25,8 @@ public class LlvmCompilerDefineFunctionTests {
List.of(),
Set.of(),
List.of(
- Instructions.pushUnit()
+ Instructions.pushUnit(),
+ Instructions.return_()
),
Sources.NULL
);
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java
new file mode 100644
index 00000000..f76383af
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java
@@ -0,0 +1,43 @@
+package org.shedlang.compiler.backends.llvm;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes;
+import org.shedlang.compiler.stackir.instructions.Instructions;
+
+import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class LlvmCompilerReturnTests {
+ @Test
+ public void returnCompilesToReturnInstruction() {
+ var instruction = Instructions.return_();
+ var add = LlvmIr.add(
+ LlvmIr.variableLocal("x"),
+ LlvmTypes.INT_64,
+ LlvmIr.variableLocal("left"),
+ LlvmIr.variableLocal("right")
+ );
+ var context = LlvmCompilerContext.EMPTY
+ .addInstruction(add)
+ .push(LlvmIr.variableLocal("a"))
+ .push(LlvmIr.variableLocal("b"));
+
+ var result = LlvmCompiler.compileInstruction(instruction, context);
+
+ assertThat(result.basicBlocks(), isSequence(
+ isLlvmBasicBlock(
+ isSequence(
+ equalTo(add)
+ ),
+ isLlvmReturn(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("b"))
+ )
+ ));
+ assertThat(result.instructions(), isSequence());
+ assertThat(result.stack(), isSequence(
+ isLlvmVariableLocal("a")
+ ));
+ }
+}
diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java
index 1c90a0a7..05063961 100644
--- a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java
@@ -37,7 +37,8 @@ public class StackCompilerFunctionDefinitionTests {
has("body", x -> x.body(), isSequence(
isPushStringInstruction("hello"),
isDiscardInstruction(),
- isPushUnitInstruction()
+ isPushUnitInstruction(),
+ isReturnInstruction()
))
),
isLocalStoreInstruction("f")
diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
index 7e8a2f4d..8e24e131 100644
--- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
+++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java
@@ -81,4 +81,10 @@ public class InstructionMatchers {
PushUnitInstruction.class
);
}
+
+ public static Matcher<Instruction> isReturnInstruction() {
+ return instanceOf(
+ ReturnInstruction.class
+ );
+ }
}