Skip to content

BuiltinCasing crashes on GHC.Prim.Addr# when a join point exposes Data in its type #7716

Description

@Unisay

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 ByteStringBS 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.

Metadata

Metadata

Assignees

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions