fuzion
fuzion copied to clipboard
Null pointer during DFA for `infix =` applied to non-`equatable` type
This small example
switch : choice unit is
type.equality(a, b switch.this) => true
a switch := unit
_ := (concur.atomic a).read = a
should produce an error since infix = requires its type parameter to be property.equatable, which is not the case here. Instead, we see a crash in DFA:
> ./build/bin/fz -c test_atomic_fuir_crash.fz
error 1: java.lang.NullPointerException: Cannot read field "_idInFUIR" because "<parameter1>" is null
at dev.flang.fuir.FUIR.id(FUIR.java:253)
at dev.flang.fuir.FUIR.boxValueClazz(FUIR.java:1387)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:633)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:515)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:478)
at dev.flang.fuir.analysis.dfa.DFA.analyze(DFA.java:1080)
at dev.flang.fuir.analysis.dfa.DFA.analyzeNewCall(DFA.java:2040)
at dev.flang.fuir.analysis.dfa.DFA.newCall(DFA.java:2002)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call0(DFA.java:391)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.access0(DFA.java:337)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.lambda$access$1(DFA.java:298)
at dev.flang.fuir.analysis.dfa.Value.forAll(Value.java:352)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.access(DFA.java:290)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call(DFA.java:256)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call(DFA.java:83)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:654)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:515)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:478)
at dev.flang.fuir.analysis.dfa.DFA.analyze(DFA.java:1080)
at dev.flang.fuir.analysis.dfa.DFA.analyzeNewCall(DFA.java:2040)
at dev.flang.fuir.analysis.dfa.DFA.newCall(DFA.java:2002)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call0(DFA.java:391)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.access0(DFA.java:337)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.lambda$access$1(DFA.java:298)
at dev.flang.fuir.analysis.dfa.Value.forAll(Value.java:352)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.access(DFA.java:290)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call(DFA.java:256)
at dev.flang.fuir.analysis.dfa.DFA$Analyze.call(DFA.java:83)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:654)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:515)
at dev.flang.fuir.analysis.AbstractInterpreter.process(AbstractInterpreter.java:478)
at dev.flang.fuir.analysis.dfa.DFA.analyze(DFA.java:1080)
at dev.flang.fuir.analysis.dfa.DFA.analyzeNewCall(DFA.java:2040)
at dev.flang.fuir.analysis.dfa.DFA.newCall(DFA.java:2002)
at dev.flang.fuir.analysis.dfa.DFA.dfa(DFA.java:983)
at dev.flang.fuir.analysis.dfa.DFA.new_fuir(DFA.java:842)
at dev.flang.be.c.C.<init>(C.java:509)
at dev.flang.tools.Fuzion$Backend$2.process(Fuzion.java:139)
at dev.flang.tools.Fuzion$Backend.processFrontEnd(Fuzion.java:444)
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:762)
at dev.flang.tools.Tool.run(Tool.java:145)
at dev.flang.tools.Fuzion.main(Fuzion.java:557)
*** fatal errors encountered, stopping.
or at runtime in the interpreter
> ./build/bin/fz test_atomic_fuir_crash.fz
error 1: *** java.lang.NullPointerException: Cannot invoke "dev.flang.air.Clazz.isRef()" because "<local18>" is null
Call stack:
infix = switch: $FUZION/lib/equals.fz:39:56:
public infix =(T type : property.equatable, a, b T) => equals T a b
-------------------------------------------------------^
universe#0: /home/fridi/fuzion/work/test_atomic_fuir_crash.fz:4:29:
_ := (concur.atomic a).read = a
----------------------------^
error 2: java.lang.NullPointerException: Cannot invoke "dev.flang.air.Clazz.isRef()" because "<local18>" is null
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:522)
at dev.flang.be.interpreter.Interpreter.executeArgs(Interpreter.java:682)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:295)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:341)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:396)
at dev.flang.be.interpreter.Interpreter.callOnInstance(Interpreter.java:961)
at dev.flang.be.interpreter.Interpreter.lambda$callable$5(Interpreter.java:837)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:330)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:341)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:396)
at dev.flang.be.interpreter.Interpreter.callOnInstance(Interpreter.java:961)
at dev.flang.be.interpreter.Interpreter.lambda$callable$5(Interpreter.java:837)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:330)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:341)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:396)
at dev.flang.be.interpreter.Interpreter.execute(Interpreter.java:396)
at dev.flang.be.interpreter.Interpreter.callOnInstance(Interpreter.java:961)
at dev.flang.be.interpreter.Interpreter.lambda$callable$4(Interpreter.java:833)
at dev.flang.be.interpreter.Interpreter.run(Interpreter.java:226)
at dev.flang.tools.Fuzion$Backend$1.process(Fuzion.java:97)
at dev.flang.tools.Fuzion$Backend.processFrontEnd(Fuzion.java:444)
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:762)
at dev.flang.tools.Tool.run(Tool.java:145)
at dev.flang.tools.Fuzion.main(Fuzion.java:557)
*** fatal errors encountered, stopping.