@@ -226,10 +226,13 @@ open class Z3TranslatorVisitor(
226226 override fun visit (expr : UtGenericExpression ): Expr = expr.run {
227227 val constraints = mutableListOf<BoolExpr >()
228228 for (i in types.indices) {
229+ val symNumDimensions = translate(typeRegistry.genericNumDimensions(addr, i)) as BitVecExpr
229230 val symType = translate(typeRegistry.genericTypeId(addr, i))
231+
230232 if (types[i].leastCommonType.isJavaLangObject()) {
231233 continue
232234 }
235+
233236 val possibleBaseTypes = types[i].possibleConcreteTypes.map { it.baseType }
234237
235238 val typeConstraint = z3Context.mkOr(
@@ -241,6 +244,22 @@ open class Z3TranslatorVisitor(
241244 }.toTypedArray()
242245 )
243246 constraints + = typeConstraint
247+
248+ val numDimensionsConstraint = z3Context.mkAnd(
249+ * possibleBaseTypes.map {
250+ val numDimensions = z3Context.mkBV(it.numDimensions, Int .SIZE_BITS )
251+
252+ if (it.isJavaLangObject()) {
253+ z3Context.mkBVSGE(symNumDimensions, numDimensions)
254+ } else {
255+ z3Context.mkEq(symNumDimensions, numDimensions)
256+ }
257+ }.toTypedArray()
258+ )
259+
260+ constraints + = numDimensionsConstraint
261+
262+ z3Context.mkAnd(* constraints.toTypedArray())
244263 }
245264 z3Context.mkOr(
246265 z3Context.mkAnd(* constraints.toTypedArray()),
@@ -250,11 +269,19 @@ open class Z3TranslatorVisitor(
250269
251270 override fun visit (expr : UtIsGenericTypeExpression ): Expr = expr.run {
252271 val symType = translate(typeRegistry.symTypeId(addr))
272+ val symNumDimensions = translate(typeRegistry.symNumDimensions(addr))
273+
253274 val genericSymType = translate(typeRegistry.genericTypeId(baseAddr, parameterTypeIndex))
254- z3Context.mkOr(
275+ val genericNumDimensions = translate(typeRegistry.genericNumDimensions(baseAddr, parameterTypeIndex))
276+
277+ val typeConstraint = z3Context.mkOr(
255278 z3Context.mkEq(symType, genericSymType),
256279 z3Context.mkEq(translate(expr.addr), translate(nullObjectAddr))
257280 )
281+
282+ val dimensionsConstraint = z3Context.mkEq(symNumDimensions, genericNumDimensions)
283+
284+ z3Context.mkAnd(typeConstraint, dimensionsConstraint)
258285 }
259286
260287 override fun visit (expr : UtEqGenericTypeParametersExpression ): Expr = expr.run {
@@ -263,6 +290,10 @@ open class Z3TranslatorVisitor(
263290 val firstSymType = translate(typeRegistry.genericTypeId(firstAddr, i))
264291 val secondSymType = translate(typeRegistry.genericTypeId(secondAddr, j))
265292 constraints + = z3Context.mkEq(firstSymType, secondSymType)
293+
294+ val firstSymNumDimensions = translate(typeRegistry.genericNumDimensions(firstAddr, i))
295+ val secondSymNumDimensions = translate(typeRegistry.genericNumDimensions(secondAddr, j))
296+ constraints + = z3Context.mkEq(firstSymNumDimensions, secondSymNumDimensions)
266297 }
267298 z3Context.mkAnd(* constraints.toTypedArray())
268299 }
0 commit comments