fuzion icon indicating copy to clipboard operation
fuzion copied to clipboard

None disjoint generic via subtype leads to crash in middle end

Open michaellilltokiwa opened this issue 2 years ago • 3 comments

"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.

michaellilltokiwa avatar Jun 23 '23 08:06 michaellilltokiwa

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.

michaellilltokiwa avatar Jun 23 '23 08:06 michaellilltokiwa

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).

fridis avatar Jul 03 '23 10:07 fridis

see also comments in: #1640

michaellilltokiwa avatar May 27 '24 07:05 michaellilltokiwa