fuzion
fuzion copied to clipboard
None disjoint generic via subtype leads to crash in middle end
"hallo" is a Const_String. Const_String inherits String and array u8. Hence it is unclear if "hallo" should be choice 1 or choice 2.
ex is
a : choice (Sequence u8) String is
c a := "hallo"
match c
sequence Sequence u8 => say "a"
string String => say "b"
error 1: java.lang.Error: check-condition failed: dev.flang.air.Clazz:getChoiceTag:1798
at dev.flang.util.ANY.check(ANY.java:383)
at dev.flang.air.Clazz.getChoiceTag(Clazz.java:1798)
at dev.flang.fuir.FUIR.clazzChoiceTag(FUIR.java:670)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:632)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:446)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:412)
at dev.flang.fuir.analysis.dfa.DFA.analyze(DFA.java:906)
at dev.flang.fuir.analysis.dfa.DFA.analyzeNewCall(DFA.java:1638)
at dev.flang.fuir.analysis.dfa.DFA.newCall(DFA.java:1571)
at dev.flang.fuir.analysis.dfa.DFA.dfa(DFA.java:809)
at dev.flang.fuir.analysis.dfa.DFA.new_fuir(DFA.java:751)
at dev.flang.be.c.C.<init>(C.java:499)
at dev.flang.tools.Fuzion$Backend$2.process(Fuzion.java:148)
at dev.flang.tools.Fuzion$Backend.processFrontEnd(Fuzion.java:406)
at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$3(Fuzion.java:870)
at dev.flang.tools.Tool.lambda$run$0(Tool.java:154)
at dev.flang.util.Errors.runAndExit(Errors.java:748)
at dev.flang.tools.Tool.run(Tool.java:154)
at dev.flang.tools.Fuzion.main(Fuzion.java:519)
*** fatal errors encountered, stopping.
second example:
ex is
a : choice (Sequence u8) String is
b : String, array u8 (fuzion.sys.internal_array_init u8 -1) unit unit unit is
redef as_string String is
"b"
redef is_empty bool is
false
c a := b
match c
sequence Sequence u8 => say "a"
string String => say "b"
error 1: java.lang.Error: require-condition3 failed: dev.flang.ast.Tag:<init>:83
at dev.flang.util.ANY.require(ANY.java:113)
at dev.flang.ast.Tag.<init>(Tag.java:83)
at dev.flang.ast.Expr.tag(Expr.java:445)
at dev.flang.ast.Expr.box(Expr.java:414)
at dev.flang.ast.AbstractAssign.box(AbstractAssign.java:222)
at dev.flang.ast.Feature$6.action(Feature.java:1695)
at dev.flang.ast.AbstractAssign.visit(AbstractAssign.java:126)
at dev.flang.ast.Feature$9.visit(Feature.java:1919)
at dev.flang.ast.Feature$9.visit(Feature.java:1897)
at dev.flang.ast.Block.visit(Block.java:226)
at dev.flang.ast.Block.visit(Block.java:40)
at dev.flang.ast.Block.visit(Block.java:226)
at dev.flang.ast.Block.visit(Block.java:40)
at dev.flang.ast.Impl.visit(Impl.java:341)
at dev.flang.ast.Feature.visit(Feature.java:1011)
at dev.flang.ast.Feature.box(Feature.java:1694)
at dev.flang.ast.Resolution.resolveOne(Resolution.java:390)
at dev.flang.ast.Resolution.resolve(Resolution.java:338)
at dev.flang.fe.SourceModule.createASTandResolve(SourceModule.java:259)
at dev.flang.fe.FrontEnd.<init>(FrontEnd.java:181)
at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$3(Fuzion.java:868)
at dev.flang.tools.Tool.lambda$run$0(Tool.java:154)
at dev.flang.util.Errors.runAndExit(Errors.java:748)
at dev.flang.tools.Tool.run(Tool.java:154)
at dev.flang.tools.Fuzion.main(Fuzion.java:519)
*** fatal errors encountered, stopping.
The problem is not restricted to string constants, here is an example using a user defined feature Obj:
test_choice is
Obj.
first(A, B type, a A, b B) A | B is
a
second(A, B type, a A, b B) A | B is
b
pick(A, B type, a A, b B, fst bool) =>
v := fst ? first A B a b : second A B a b
match v
aa A => say "a: $aa"
bb B => say "b: $bb"
o := Obj
pick Obj Obj o o true
pick Obj Obj o o false
that causes the same crash
> PRECONDITIONS=true POSTCONDITIONS=true ./build//bin/fz -c test_choice.fz
error 1: java.lang.Error: check-condition failed: dev.flang.air.Clazz:getChoiceTag:1798
at dev.flang.util.ANY.check(ANY.java:383)
at dev.flang.air.Clazz.getChoiceTag(Clazz.java:1798)
at dev.flang.fuir.FUIR.clazzChoiceTag(FUIR.java:685)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:666)
...
*** fatal errors encountered, stopping.
The problem is that the choice tags during the front end phase are different than those duing the FUIR phase. The solution would be to use the front end tags in FUIR as well. Only the back end may decide to optimize these tags away when they are redundant (e.g., disjoint ref types).
see also comments in: #1640