The plugin crashes when compiling a function with datatypes=BuiltinCasing if the GHC Core contains a join point with PlutusCore.Data.Data in its type:
Context: Compiling type: PlutusCore.Data.Data
Context: Compiling data constructor type: PlutusCore.Data.B
Context: Compiling type: Data.ByteString.Internal.Type.ByteString
Context: Compiling data constructor type: Data.ByteString.Internal.Type.BS
Context: Compiling type: GHC.Prim.Addr#
Error: Unsupported feature: Type constructor: GHC.Prim.Addr#
What happens
BuiltinData wraps PlutusCore.Data.Data. Normally the plugin treats BuiltinData as a builtin and never looks inside. But GHC's simplifier can produce join points where Data appears naked in the type signature:
$j :: Data -> BuiltinUnit
The plugin with BuiltinCasing tries to compile Data as a regular ADT, follows B ByteString → BS Addr# Int, and crashes because Addr# has no Plutus Core equivalent.
Reproduction
Branch with a failing test: yura/builtin-casing-addr-joinpoint
Minimal trigger — caseList' applied twice to the same value in a separate module without BuiltinCasing:
failsToCompile :: BuiltinData -> BuiltinUnit
failsToCompile bd =
case toBuiltinData (firstOf items) of
_ -> case toBuiltinData (firstOf items) of
_ -> unitval
where
items = unsafeFromBuiltinData bd
firstOf = caseList' Nothing (\(h :: BuiltinData) _t -> Just h)
Compiled from Spec.hs (which has datatypes=BuiltinCasing) via $$(compile [||Lib.failsToCompile||]).
cabal build plutus-tx-plugin-tests
No dependencies beyond plutus-tx and plutus-tx-plugin.
Originally discovered as
A cross-library compilation failure: a Plinth validator using findOwnInput + getContinuingOutputs from plutus-ledger-api crashed when compiled with BuiltinCasing. getContinuingOutputs calls findOwnInput internally, producing the double-call pattern that triggers the join point.
The plugin crashes when compiling a function with
datatypes=BuiltinCasingif the GHC Core contains a join point withPlutusCore.Data.Datain its type:What happens
BuiltinDatawrapsPlutusCore.Data.Data. Normally the plugin treatsBuiltinDataas a builtin and never looks inside. But GHC's simplifier can produce join points whereDataappears naked in the type signature:The plugin with BuiltinCasing tries to compile
Dataas a regular ADT, followsB ByteString→BS Addr# Int, and crashes becauseAddr#has no Plutus Core equivalent.Reproduction
Branch with a failing test:
yura/builtin-casing-addr-joinpointMinimal trigger —
caseList'applied twice to the same value in a separate module without BuiltinCasing:Compiled from
Spec.hs(which hasdatatypes=BuiltinCasing) via$$(compile [||Lib.failsToCompile||]).No dependencies beyond
plutus-txandplutus-tx-plugin.Originally discovered as
A cross-library compilation failure: a Plinth validator using
findOwnInput+getContinuingOutputsfromplutus-ledger-apicrashed when compiled with BuiltinCasing.getContinuingOutputscallsfindOwnInputinternally, producing the double-call pattern that triggers the join point.