fuzion icon indicating copy to clipboard operation
fuzion copied to clipboard

Null pointer during DFA for `infix =` applied to non-`equatable` type

Open fridis opened this issue 2 years ago • 0 comments

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.

fridis avatar Oct 20 '23 09:10 fridis