diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-16 23:08:09 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-16 23:08:09 +0100 |
| commit | 25ca0c973842be553326d3cd69ea72fd658b0ba6 (patch) | |
| tree | 73915d5b244b10f3181e6464da6272d6e051632b /src/test/java | |
| parent | ff769ec6795b7725f0bfb4d523e2762cb8e1f8c8 (diff) | |
Add explicit return instruction to function bodies
Diffstat (limited to 'src/test/java')
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 + ); + } } |
