fuzion
fuzion copied to clipboard
AoC Issue: Missing implementation of `lteq` in type feature results in crash
This example does is missing an implementation of test.x.type.lteq:
test is
a is
h x := x
type.q(a test.a.this) => a.h <= a.h
x : property.orderable is
p := a.type.q a
Which is not reported as an error but results in a crash:
> $FUZION/bin/fz part1_crash2.fz
error 1: Found error clazz in set of clazzes in the IR even though no earlier errors were reported. This can only be the result of a severe bug.
warning 1: code for intrinsic lteq.T is missing
error 2: java.lang.IndexOutOfBoundsException: Index -268435457 out of bounds for length 105
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at dev.flang.util.Map2Int.get(Map2Int.java:148)
at dev.flang.fuir.FUIR.clazz(FUIR.java:244)
at dev.flang.fuir.FUIR.clazzContract(FUIR.java:1036)
at dev.flang.fuir.FUIR.hasPrecondition(FUIR.java:2414)
at dev.flang.fuir.cfg.CFG.createCallGraphForExpr(CFG.java:561)
at dev.flang.fuir.cfg.CFG.createCallGraphForBlock(CFG.java:534)
at dev.flang.fuir.cfg.CFG.createCallGraphForRoutine(CFG.java:179)
at dev.flang.fuir.cfg.CFG.createCallGraph(CFG.java:149)
at dev.flang.fuir.cfg.CFG.addToCallGraph(CFG.java:670)
at dev.flang.fuir.cfg.CFG.call(CFG.java:641)
at dev.flang.fuir.cfg.CFG.access(CFG.java:623)
at dev.flang.fuir.cfg.CFG.createCallGraphForExpr(CFG.java:567)
at dev.flang.fuir.cfg.CFG.createCallGraphForBlock(CFG.java:534)
at dev.flang.fuir.cfg.CFG.createCallGraphForRoutine(CFG.java:179)
at dev.flang.fuir.cfg.CFG.createCallGraph(CFG.java:149)
at dev.flang.fuir.cfg.CFG.addToCallGraph(CFG.java:670)
at dev.flang.fuir.cfg.CFG.call(CFG.java:641)
at dev.flang.fuir.cfg.CFG.access(CFG.java:623)
at dev.flang.fuir.cfg.CFG.createCallGraphForExpr(CFG.java:567)
at dev.flang.fuir.cfg.CFG.createCallGraphForBlock(CFG.java:534)
at dev.flang.fuir.cfg.CFG.createCallGraphForRoutine(CFG.java:179)
at dev.flang.fuir.cfg.CFG.createCallGraph(CFG.java:149)
at dev.flang.fuir.cfg.CFG.addToCallGraph(CFG.java:670)
at dev.flang.fuir.cfg.CFG.call(CFG.java:641)
at dev.flang.fuir.cfg.CFG.access(CFG.java:623)
at dev.flang.fuir.cfg.CFG.createCallGraphForExpr(CFG.java:567)
at dev.flang.fuir.cfg.CFG.createCallGraphForBlock(CFG.java:534)
at dev.flang.fuir.cfg.CFG.createCallGraphForRoutine(CFG.java:179)
at dev.flang.fuir.cfg.CFG.createCallGraph(CFG.java:149)
at dev.flang.fuir.cfg.CFG.createCallGraph(CFG.java:132)
at dev.flang.be.effects.Effects.<init>(Effects.java:73)
at dev.flang.tools.Fuzion$Backend.processFrontEnd(Fuzion.java:443)
at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$3(Fuzion.java:908)
at dev.flang.tools.Tool.lambda$run$0(Tool.java:145)
at dev.flang.util.Errors.runAndExit(Errors.java:790)
at dev.flang.tools.Tool.run(Tool.java:145)
at dev.flang.tools.Fuzion.main(Fuzion.java:557)
*** fatal errors encountered, stopping.
the example from #4093
ex =>
My_Fun ref : Function i32 i32 is
a (b My_Fun) is
a n->n
also causes this error
❯ fz /tmp/4093.fz
/tmp/4093.fz:7:5: error 1: Wrong number of arguments in lambda expression
a n->n
Lambda expression has one argument while the target type expects -1 arguments.
Arguments of lambda expression: 'n'
Expected function type: ex.this.My_Fun
To solve this, remove 2 arguments from the list 'n' before the '->' of the lambda expression.
error 2: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
at java.base/java.util.Objects.checkIndex(Objects.java:385)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at dev.flang.ast.Function.propagateTypeAndInferResult(Function.java:300)
at dev.flang.ast.Function.propagateExpectedType(Function.java:188)
at dev.flang.ast.Call.lambda$propagateExpectedType$25(Call.java:2524)
at dev.flang.ast.Call.applyToActualsAndFormalTypes(Call.java:2633)
at dev.flang.ast.Call.propagateExpectedType(Call.java:2524)
at dev.flang.ast.Feature$4.action(Feature.java:1919)
at dev.flang.ast.Feature$4.action(Feature.java:1917)
at dev.flang.ast.Call.visit(Call.java:1112)
at dev.flang.ast.Block.visit(Block.java:212)
at dev.flang.ast.Block.visit(Block.java:42)
at dev.flang.ast.Impl.visit(Impl.java:301)
at dev.flang.ast.Feature.visit(Feature.java:1192)
at dev.flang.ast.Feature.typeInference(Feature.java:1917)
at dev.flang.ast.Feature.typeInference(Feature.java:1881)
at dev.flang.ast.Feature.typeInference(Feature.java:1881)
at dev.flang.ast.Resolution.resolveOne(Resolution.java:448)
at dev.flang.ast.Resolution.resolve(Resolution.java:392)
at dev.flang.fe.SourceModule.createASTandResolve(SourceModule.java:261)
at dev.flang.fe.FrontEnd.<init>(FrontEnd.java:166)
at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$4(Fuzion.java:1119)
at dev.flang.tools.Tool.lambda$run$0(Tool.java:142)
at dev.flang.util.Errors.runAndExit(Errors.java:903)
at dev.flang.tools.Tool.run(Tool.java:142)
at dev.flang.tools.Fuzion.main(Fuzion.java:672)
*** fatal errors encountered, stopping.
2 errors.
idiom87 causes a similar error on the interpreter backend
❯ fz -interpreter -e 'ex87 is exit 0'
error 1: *** java.lang.IndexOutOfBoundsException: Index -268435457 out of bounds for length 99
Call stack:
exit.type.install_default: {base.fum}/exit.fz:58:7:
(exit default_exit_handler unit unit).default
exit0: {base.fum}/exit.fz:101:3:
exit.install_default
exit#1: {base.fum}/exit.fz:108:30:
public exit(code u8) void => exit0.exit code
ex87: {main.fum}/command line:1:9:
ex87 is exit 0
error 2: java.lang.IndexOutOfBoundsException: Index -268435457 out of bounds for length 99
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
at java.base/java.util.Objects.checkIndex(Objects.java:385)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at dev.flang.fuir.GeneratingFUIR.id2clazz(GeneratingFUIR.java:444)
at dev.flang.fuir.GeneratingFUIR.clazzIsRef(GeneratingFUIR.java:1317)
at dev.flang.be.interpreter.Interpreter.loadField(Interpreter.java:354)
at dev.flang.be.interpreter.Interpreter.getField(Interpreter.java:253)
at dev.flang.be.interpreter.Executor.call(Executor.java:274)
at dev.flang.be.interpreter.Executor.call(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:601)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.fuir.analysis.AbstractInterpreter.processClazz(AbstractInterpreter.java:488)
at dev.flang.be.interpreter.Executor.callOnNewInstance(Executor.java:624)
at dev.flang.be.interpreter.Executor.call(Executor.java:258)
at dev.flang.be.interpreter.Executor.call(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:601)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.be.interpreter.Executor.match(Executor.java:529)
at dev.flang.be.interpreter.Executor.match(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:645)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.fuir.analysis.AbstractInterpreter.processClazz(AbstractInterpreter.java:488)
at dev.flang.be.interpreter.Executor.callOnNewInstance(Executor.java:624)
at dev.flang.be.interpreter.Executor.call(Executor.java:258)
at dev.flang.be.interpreter.Executor.call(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:601)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.fuir.analysis.AbstractInterpreter.processClazz(AbstractInterpreter.java:488)
at dev.flang.be.interpreter.Executor.callOnNewInstance(Executor.java:624)
at dev.flang.be.interpreter.Executor.call(Executor.java:258)
at dev.flang.be.interpreter.Executor.call(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:601)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.fuir.analysis.AbstractInterpreter.processClazz(AbstractInterpreter.java:488)
at dev.flang.be.interpreter.Executor.callOnNewInstance(Executor.java:624)
at dev.flang.be.interpreter.Executor.call(Executor.java:258)
at dev.flang.be.interpreter.Executor.call(Executor.java:58)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:601)
at dev.flang.fuir.analysis.AbstractInterpreter.processCode(AbstractInterpreter.java:512)
at dev.flang.fuir.analysis.AbstractInterpreter.processClazz(AbstractInterpreter.java:488)
at dev.flang.be.interpreter.Interpreter.run(Interpreter.java:75)
at dev.flang.tools.Fuzion$Backend$1.process(Fuzion.java:114)
at dev.flang.tools.Fuzion$Backend.processFrontEnd(Fuzion.java:557)
at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$4(Fuzion.java:1138)
at dev.flang.tools.Tool.lambda$run$0(Tool.java:142)
at dev.flang.util.Errors.runAndExit(Errors.java:912)
at dev.flang.tools.Tool.run(Tool.java:142)
at dev.flang.tools.Fuzion.main(Fuzion.java:688)
*** fatal errors encountered, stopping.
2 errors.
On JVM it works
❯ fz -e 'ex87 is exit 0'
meanwhile fixed: #reg_issue5330