From 965942be79b3fcc286ffffe1b0c310b08ef58920 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Jul 2026 21:46:46 -0700 Subject: [PATCH] Java API: return EnumSort instead of DatatypeSort from Sort.create() (#10104) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Expr.getSort()` on a constant with an `EnumSort` sort returns a `DatatypeSort`, causing `ClassCastException` when enum-specific methods are called. ```java Context ctx = new Context(); EnumSort enumSort = ctx.mkEnumSort("my-enum", "e1", "e2"); Expr> c = ctx.mkConst("my-const", enumSort); c.getSort().getName(); // ClassCastException — getSort() returns DatatypeSort, not EnumSort ``` ### Changes - **`Sort.java`**: In `Sort.create()`, detect enum sorts at the `Z3_DATATYPE_SORT` case by checking whether all constructors have arity 0 — matching Z3's own `util::is_enum_sort` logic in `datatype_decl_plugin.cpp`. Return `EnumSort<>` when true, `DatatypeSort<>` otherwise. - **`EnumSort.java`**: Add package-private `EnumSort(Context ctx, long obj)` constructor so an `EnumSort` can be instantiated from an existing native sort handle (analogous to `DatatypeSort(Context ctx, long obj)`). --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> --- src/api/java/EnumSort.java | 5 +++++ src/api/java/Sort.java | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/api/java/EnumSort.java b/src/api/java/EnumSort.java index 5cd11ba08b..6dcbee519e 100644 --- a/src/api/java/EnumSort.java +++ b/src/api/java/EnumSort.java @@ -92,6 +92,11 @@ public class EnumSort extends Sort return new FuncDecl<>(getContext(), Native.getDatatypeSortRecognizer(getContext().nCtx(), getNativeObject(), inx)); } + EnumSort(Context ctx, long obj) + { + super(ctx, obj); + } + EnumSort(Context ctx, Symbol name, Symbol[] enumNames) { super(ctx, Native.mkEnumerationSort(ctx.nCtx(), diff --git a/src/api/java/Sort.java b/src/api/java/Sort.java index 4910338f35..8be2cda7b8 100644 --- a/src/api/java/Sort.java +++ b/src/api/java/Sort.java @@ -125,6 +125,17 @@ public class Sort extends AST case Z3_BV_SORT: return new BitVecSort(ctx, obj); case Z3_DATATYPE_SORT: + int n = Native.getDatatypeSortNumConstructors(ctx.nCtx(), obj); + boolean isEnum = true; + for (int i = 0; i < n && isEnum; i++) { + long ctor = Native.getDatatypeSortConstructor(ctx.nCtx(), obj, i); + if (Native.getDomainSize(ctx.nCtx(), ctor) != 0) { + isEnum = false; + } + } + if (isEnum) { + return new EnumSort<>(ctx, obj); + } return new DatatypeSort<>(ctx, obj); case Z3_INT_SORT: return new IntSort(ctx, obj);