@@ -84,6 +84,8 @@ public final class CelVerifierZ3ImplTest {
8484 .addMessageTypes (TestAllTypes .getDescriptor (), TestAllTypes .NestedMessage .getDescriptor ())
8585 .addVar ("x" , SimpleType .INT )
8686 .addVar ("u" , SimpleType .UINT )
87+ .addVar ("u1" , SimpleType .UINT )
88+ .addVar ("u2" , SimpleType .UINT )
8789 .addVar ("d" , SimpleType .DOUBLE )
8890 .addVar ("by" , SimpleType .BYTES )
8991 .addVar ("y" , SimpleType .INT )
@@ -705,6 +707,10 @@ private enum IsAlwaysTrueTestCase {
705707 DYNAMIC_NUMERIC_EQUALITY_CROSS_TYPE_DYN_DOUBLE (
706708 "type(dyn_var) == double && dyn_var == 5.0 && dyn_var2 == 5.0 && type(dyn_var2) == double ?"
707709 + " dyn_var == dyn_var2 : true" ),
710+ INT64_BOUNDS_ALWAYS_TRUE ("x <= 9223372036854775807 && x >= -9223372036854775808" ),
711+ UINT64_BOUNDS_ALWAYS_TRUE ("u <= 18446744073709551615u && u >= 0u" ),
712+ MODULO_INT64_MIN_INT_BY_NEG_ONE_ALWAYS_ZERO (
713+ "x == -9223372036854775808 && y == -1 ? x % y == 0 : true" ),
708714 ;
709715
710716 final String expr ;
@@ -1203,7 +1209,44 @@ private enum IsAlwaysTrueViolationTestCase {
12031209 "type(dyn_var) == int ? (dyn_var ? true : false) == (dyn_var ? true : false) : true" ,
12041210 "Condition is not always true\\ ." ,
12051211 "Counterexample input:" ,
1206- "dyn_var = int\\ {\\ }" );
1212+ "dyn_var = int\\ {\\ }" ),
1213+ ADD_INT64_OVERFLOW_FAILS_WITH_ERRORS (
1214+ "x > 0 && y > 0 ? x + y > x : true" ,
1215+ "Condition is not always true\\ ." ,
1216+ "Counterexample input:" ,
1217+ "x = (1|9223372036854775807)" ,
1218+ "y = (1|9223372036854775807)" ),
1219+ ADD_UINT64_OVERFLOW_FAILS_WITH_ERRORS (
1220+ "u1 > 0u && u2 > 0u ? u1 + u2 >= u1 : true" ,
1221+ "Condition is not always true\\ ." ,
1222+ "Counterexample input:" ,
1223+ "u1 = (1u|18446744073709551615u)" ,
1224+ "u2 = (1u|18446744073709551615u)" ),
1225+ SUBTRACT_INT64_UNDERFLOW_FAILS_WITH_ERRORS (
1226+ "x < 0 && y > 0 ? x - y < x : true" ,
1227+ "Condition is not always true\\ ." ,
1228+ "Counterexample input:" ,
1229+ "x = (-2|9223372036854775807)" ,
1230+ "y = (-2|9223372036854775807)" ),
1231+ MULTIPLY_INT64_OVERFLOW_FAILS_WITH_ERRORS (
1232+ "x > 1000000000 && y > 1000000000 ? x * y > 0 : true" ,
1233+ "Condition is not always true\\ ." ,
1234+ "Counterexample input:" ,
1235+ "x = [0-9]+" ,
1236+ "y = [0-9]+" ),
1237+ MULTIPLY_UINT64_OVERFLOW_FAILS_WITH_ERRORS (
1238+ "u1 > 1000000000u && u2 > 1000000000u ? u1 * u2 > 0u : true" ,
1239+ "Condition is not always true\\ ." ,
1240+ "Counterexample input:" ,
1241+ "u1 = [0-9]+u" ,
1242+ "u2 = [0-9]+u" ),
1243+ DIVIDE_INT64_OVERFLOW_MIN_INT_BY_NEG_ONE_FAILS_WITH_ERRORS (
1244+ "x == -9223372036854775808 && y == -1 ? x / y == -x : true" ,
1245+ "Condition is not always true\\ ." ,
1246+ "Counterexample input:" ,
1247+ "x = -9223372036854775808" ,
1248+ "y = -1" ),
1249+ ;
12071250
12081251 final String expr ;
12091252 final ImmutableList <String > expectedFragments ;
0 commit comments