@@ -45,11 +45,11 @@ final class TypeConversionAxioms {
4545 .addUnaryOverloadTranslator (
4646 Conversions .DOUBLE_TO_INT64 .celOverloadDecl (),
4747 createUninterpretedConversion (Conversions .DOUBLE_TO_INT64 ),
48- true )
48+ /* isApproximated= */ true )
4949 .addUnaryOverloadTranslator (
5050 Conversions .STRING_TO_INT64 .celOverloadDecl (),
5151 createUninterpretedConversion (Conversions .STRING_TO_INT64 ),
52- true )
52+ /* isApproximated= */ true )
5353 .addUnaryOverloadTranslator (
5454 Conversions .TIMESTAMP_TO_INT64 .celOverloadDecl (),
5555 (ctx , typeSystem , sink , arg ) ->
@@ -72,11 +72,11 @@ final class TypeConversionAxioms {
7272 .addUnaryOverloadTranslator (
7373 Conversions .DOUBLE_TO_UINT64 .celOverloadDecl (),
7474 createUninterpretedConversion (Conversions .DOUBLE_TO_UINT64 ),
75- true )
75+ /* isApproximated= */ true )
7676 .addUnaryOverloadTranslator (
7777 Conversions .STRING_TO_UINT64 .celOverloadDecl (),
7878 createUninterpretedConversion (Conversions .STRING_TO_UINT64 ),
79- true )
79+ /* isApproximated= */ true )
8080 .build ();
8181
8282 private static final CelZ3FunctionAxiom DOUBLE_AXIOM =
@@ -87,14 +87,15 @@ final class TypeConversionAxioms {
8787 .addUnaryOverloadTranslator (
8888 Conversions .INT64_TO_DOUBLE .celOverloadDecl (),
8989 createUninterpretedConversion (Conversions .INT64_TO_DOUBLE ),
90- true )
90+ /* isApproximated= */ true )
9191 .addUnaryOverloadTranslator (
9292 Conversions .UINT64_TO_DOUBLE .celOverloadDecl (),
9393 createUninterpretedConversion (Conversions .UINT64_TO_DOUBLE ),
94- true )
94+ /* isApproximated= */ true )
9595 .addUnaryOverloadTranslator (
9696 Conversions .STRING_TO_DOUBLE .celOverloadDecl (),
97- createUninterpretedConversion (Conversions .STRING_TO_DOUBLE ))
97+ createUninterpretedConversion (Conversions .STRING_TO_DOUBLE ),
98+ /* isApproximated= */ true )
9899 .build ();
99100
100101 private static final CelZ3FunctionAxiom STRING_AXIOM =
@@ -105,31 +106,31 @@ final class TypeConversionAxioms {
105106 .addUnaryOverloadTranslator (
106107 Conversions .INT64_TO_STRING .celOverloadDecl (),
107108 createUninterpretedConversion (Conversions .INT64_TO_STRING ),
108- true )
109+ /* isApproximated= */ true )
109110 .addUnaryOverloadTranslator (
110111 Conversions .UINT64_TO_STRING .celOverloadDecl (),
111112 createUninterpretedConversion (Conversions .UINT64_TO_STRING ),
112- true )
113+ /* isApproximated= */ true )
113114 .addUnaryOverloadTranslator (
114115 Conversions .DOUBLE_TO_STRING .celOverloadDecl (),
115116 createUninterpretedConversion (Conversions .DOUBLE_TO_STRING ),
116- true )
117+ /* isApproximated= */ true )
117118 .addUnaryOverloadTranslator (
118119 Conversions .BOOL_TO_STRING .celOverloadDecl (),
119120 createUninterpretedConversion (Conversions .BOOL_TO_STRING ),
120- true )
121+ /* isApproximated= */ true )
121122 .addUnaryOverloadTranslator (
122123 Conversions .BYTES_TO_STRING .celOverloadDecl (),
123124 createUninterpretedConversion (Conversions .BYTES_TO_STRING ),
124- true )
125+ /* isApproximated= */ true )
125126 .addUnaryOverloadTranslator (
126127 Conversions .TIMESTAMP_TO_STRING .celOverloadDecl (),
127128 createUninterpretedConversion (Conversions .TIMESTAMP_TO_STRING ),
128- true )
129+ /* isApproximated= */ true )
129130 .addUnaryOverloadTranslator (
130131 Conversions .DURATION_TO_STRING .celOverloadDecl (),
131132 createUninterpretedConversion (Conversions .DURATION_TO_STRING ),
132- true )
133+ /* isApproximated= */ true )
133134 .build ();
134135
135136 private static final CelZ3FunctionAxiom BYTES_AXIOM =
@@ -140,7 +141,7 @@ final class TypeConversionAxioms {
140141 .addUnaryOverloadTranslator (
141142 Conversions .STRING_TO_BYTES .celOverloadDecl (),
142143 createUninterpretedConversion (Conversions .STRING_TO_BYTES ),
143- true )
144+ /* isApproximated= */ true )
144145 .build ();
145146
146147 private static final CelZ3FunctionAxiom DYN_AXIOM =
@@ -158,7 +159,7 @@ final class TypeConversionAxioms {
158159 .addUnaryOverloadTranslator (
159160 Conversions .STRING_TO_DURATION .celOverloadDecl (),
160161 createUninterpretedConversion (Conversions .STRING_TO_DURATION ),
161- true )
162+ /* isApproximated= */ true )
162163 .build ();
163164
164165 private static final CelZ3FunctionAxiom TIMESTAMP_AXIOM =
@@ -169,7 +170,7 @@ final class TypeConversionAxioms {
169170 .addUnaryOverloadTranslator (
170171 Conversions .STRING_TO_TIMESTAMP .celOverloadDecl (),
171172 createUninterpretedConversion (Conversions .STRING_TO_TIMESTAMP ),
172- true )
173+ /* isApproximated= */ true )
173174 .addUnaryOverloadTranslator (
174175 Conversions .INT64_TO_TIMESTAMP .celOverloadDecl (),
175176 (ctx , typeSystem , sink , arg ) -> {
@@ -188,7 +189,7 @@ final class TypeConversionAxioms {
188189 .addUnaryOverloadTranslator (
189190 Conversions .STRING_TO_BOOL .celOverloadDecl (),
190191 createUninterpretedConversion (Conversions .STRING_TO_BOOL ),
191- true )
192+ /* isApproximated= */ true )
192193 .build ();
193194
194195 static final ImmutableList <CelZ3FunctionAxiom > ALL_AXIOMS =
@@ -213,56 +214,53 @@ private static CelZ3FunctionAxiom.UnaryTranslator createUninterpretedConversion(
213214 typeSystem .celValueSort ());
214215 Expr <?> res = ctx .mkApp (funcDecl , arg );
215216
217+ BoolExpr isValid ;
216218 switch (conversion .celOverloadDecl ().resultType ().kind ()) {
217219 case INT :
218- BoolExpr intValid =
220+ isValid =
219221 ctx .mkAnd (
220222 typeSystem .isInt (res ),
221223 ctx .mkNot (typeSystem .checkIntOverflow (typeSystem .getInt (res ))));
222- sink .accept (intValid );
223224 break ;
224225 case TIMESTAMP :
225- BoolExpr timestampValid =
226+ isValid =
226227 ctx .mkAnd (
227228 typeSystem .isTimestamp (res ),
228229 ctx .mkNot (typeSystem .checkTimestampOverflow (typeSystem .getTimestamp (res ))));
229- sink .accept (timestampValid );
230230 break ;
231231 case DURATION :
232- BoolExpr durationValid =
232+ isValid =
233233 ctx .mkAnd (
234234 typeSystem .isDuration (res ),
235235 ctx .mkNot (typeSystem .checkDurationOverflow (typeSystem .getDuration (res ))));
236- sink .accept (durationValid );
237236 break ;
238237 case UINT :
239- BoolExpr uintValid =
238+ isValid =
240239 ctx .mkAnd (
241240 typeSystem .isUint (res ),
242241 ctx .mkNot (typeSystem .checkUintOverflow (typeSystem .getUint (res ))));
243- sink .accept (uintValid );
244242 break ;
245243 case DOUBLE :
246- BoolExpr doubleValid =
244+ isValid =
247245 ctx .mkAnd (
248246 typeSystem .isDouble (res ), ctx .mkNot (ctx .mkFPIsNaN (typeSystem .getDouble (res ))));
249- sink .accept (doubleValid );
250247 break ;
251248 case STRING :
252- sink . accept ( typeSystem .isString (res ) );
249+ isValid = typeSystem .isString (res );
253250 break ;
254251 case BYTES :
255- sink . accept ( typeSystem .isBytes (res ) );
252+ isValid = typeSystem .isBytes (res );
256253 break ;
257254 case BOOL :
258- sink . accept ( typeSystem .isBool (res ) );
255+ isValid = typeSystem .isBool (res );
259256 break ;
260257 default :
261258 throw new IllegalArgumentException (
262259 "Unsupported uninterpreted conversion result type: "
263260 + conversion .celOverloadDecl ().resultType ());
264261 }
265262
263+ sink .accept (ctx .mkOr (isValid , typeSystem .isError (res )));
266264 return Optional .of (res );
267265 };
268266 }
0 commit comments