From 25d855d2a9a0828826d07bde39d6dfe8c7110da6 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 15 Sep 2024 09:37:51 -0700 Subject: fix Minus wrapping MIN_LONG --- chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'chapter14/src/main/java/com') diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java index 8a2c9406..8ba45d26 100644 --- a/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java +++ b/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java @@ -22,7 +22,9 @@ public class MinusNode extends Node { public Type compute() { if( in(1)._type instanceof TypeInteger i0 ) { if( i0.isHigh() ) return TypeInteger.TOP; - return i0==TypeInteger.BOT ? TypeInteger.BOT : TypeInteger.make(-i0._max,-i0._min); + // Catch overflow wrapping on `-Long.MIN_VALUE` + if( i0 == TypeInteger.BOT || i0._min == Long.MIN_VALUE ) return TypeInteger.BOT; + return TypeInteger.make(-i0._max,-i0._min); } return TypeInteger.TOP.meet(in(1)._type); } -- cgit v1.2.3