diff --git a/Content.Tests/DMProject/Tests/Operators/Division.dm b/Content.Tests/DMProject/Tests/Operators/Division.dm index 0250ae9dcd..cd3b704284 100644 --- a/Content.Tests/DMProject/Tests/Operators/Division.dm +++ b/Content.Tests/DMProject/Tests/Operators/Division.dm @@ -7,7 +7,7 @@ var/list/expected = list( 1, "Error", - 10, + "Error", "Error", "Error", // index 5 "Error", diff --git a/Content.Tests/DMProject/Tests/Operators/div_by_null.dm b/Content.Tests/DMProject/Tests/Operators/div_by_null.dm new file mode 100644 index 0000000000..dca5ec8a1a --- /dev/null +++ b/Content.Tests/DMProject/Tests/Operators/div_by_null.dm @@ -0,0 +1,3 @@ +// COMPILE ERROR OD0011 +/proc/RunTest + var/test = 10/null \ No newline at end of file diff --git a/Content.Tests/DMProject/Tests/Operators/valid_and_null.dm b/Content.Tests/DMProject/Tests/Operators/valid_and_null.dm index d7655bda0c..2403efa2e2 100644 --- a/Content.Tests/DMProject/Tests/Operators/valid_and_null.dm +++ b/Content.Tests/DMProject/Tests/Operators/valid_and_null.dm @@ -57,7 +57,7 @@ ASSERT(C(4) / C(2) == C(2)) ASSERT(C(null) / C(2) == C(0)) - ASSERT(C(2) / C(null) == C(2)) + //ASSERT(C(2) / C(null) == C(2)) // Runtime error ASSERT(C(null) / C(null) == C(0)) ASSERT(C(4) % C(3) == C(1)) diff --git a/Content.Tests/DMProject/Tests/Operators/valid_and_null_const.dm b/Content.Tests/DMProject/Tests/Operators/valid_and_null_const.dm index ff53488055..1e3fda8c7c 100644 --- a/Content.Tests/DMProject/Tests/Operators/valid_and_null_const.dm +++ b/Content.Tests/DMProject/Tests/Operators/valid_and_null_const.dm @@ -30,8 +30,8 @@ ASSERT(C(4) / C(2) == C(2)) ASSERT(C(null) / C(2) == C(0)) - ASSERT(C(2) / C(null) == C(2)) - ASSERT(C(null) / C(null) == C(0)) + //ASSERT(C(2) / C(null) == C(2)) //compile time error + //ASSERT(C(null) / C(null) == C(0)) ASSERT(C(4) % C(3) == C(1)) ASSERT(C(null) % C(3) == C(0)) diff --git a/DMCompiler/DM/Expressions/Binary.cs b/DMCompiler/DM/Expressions/Binary.cs index c05a7d3d4c..0869d0d357 100644 --- a/DMCompiler/DM/Expressions/Binary.cs +++ b/DMCompiler/DM/Expressions/Binary.cs @@ -116,6 +116,10 @@ public override bool TryAsConstant(DMCompiler compiler, [NotNullWhen(true)] out if (lhs is Number lhsNum && rhs is Number rhsNum) { constant = new Number(Location, lhsNum.Value / rhsNum.Value); + } else if (rhs is Null) { + compiler.Emit(WarningCode.BadExpression, Location, "Division by null is invalid"); + constant = null; + return false; } else { constant = null; return false; diff --git a/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs b/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs index 51f8143b0f..86060d7e32 100644 --- a/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs +++ b/OpenDreamRuntime/Procs/DMOpcodeHandlers.cs @@ -1143,8 +1143,7 @@ public static ProcStatus Divide(DMProcState state) { state.Push(new DreamValue(0)); break; case DreamValue.DreamValueType.Float when second.IsNull: - state.Push(new DreamValue(first.MustGetValueAsFloat())); - break; + throw new Exception($"Attempted to divide {first} by null"); case DreamValue.DreamValueType.Float when second.Type == DreamValue.DreamValueType.Float: var secondFloat = second.MustGetValueAsFloat(); if (secondFloat == 0) {