diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-08-27 20:27:49 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-08-27 20:27:49 +0100 |
| commit | 623c8a2542cf071b59aebe4811d7d61c762db774 (patch) | |
| tree | c2b425688cdcd663b3bbc9f6384a4f0bca962695 /src/main/java/org | |
| parent | 96de72e5f761eb4bf07536f4dfe282e2e10a2081 (diff) | |
Check while loop body does not yield value
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 10 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java | 10 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 651a4f79..5302ee6c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -900,6 +900,16 @@ public class TypeChecker { var typedBody = typedBodyResult.value(); context = typedBodyResult.context(); + switch (typedBody.behaviour()) { + case TypedFunctionStatementBehaviour.BlockReturn blockReturn -> { + throw new LoopBodyCannotYieldValueError(untyped.body().source()); + } + case TypedFunctionStatementBehaviour.Continue continue_ -> { + } + case TypedFunctionStatementBehaviour.Terminate terminate -> { + } + } + return context.toResult(new TypedWhileNode( typedCondition, typedBody, diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java new file mode 100644 index 00000000..2c80338e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class LoopBodyCannotYieldValueError extends SourceError { + public LoopBodyCannotYieldValueError(Source source) { + super("Loop body cannot yield value", source); + } +} |
