Skip to content

Bug: Cannot construct a value of type: PlutusTx.Builtins.Internal.BuiltinUnit #7162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plutus-tx-plugin/plutus-tx-plugin.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ test-suite plutus-tx-plugin-tests
Budget.WithGHCOptimisations
Budget.WithoutGHCOptimisations
BuiltinList.Budget.Spec
BuiltinUnit.Spec
ByteStringLiterals.Lib
ByteStringLiterals.Spec
DataList.Budget.Spec
Expand Down
106 changes: 106 additions & 0 deletions plutus-tx-plugin/test/BuiltinUnit/Spec.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -ddump-simpl-iterations -dsuppress-all #-}
{-# OPTIONS_GHC -fno-float-in #-}
{-# OPTIONS_GHC -fno-full-laziness #-}
{-# OPTIONS_GHC -fno-ignore-interface-pragmas #-}
{-# OPTIONS_GHC -fno-local-float-out #-}
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
{-# OPTIONS_GHC -fno-spec-constr #-}
{-# OPTIONS_GHC -fno-specialise #-}
{-# OPTIONS_GHC -fno-strictness #-}
{-# OPTIONS_GHC -fno-unbox-small-strict-fields #-}
{-# OPTIONS_GHC -fno-unbox-strict-fields #-}
{-# OPTIONS_GHC -fplugin PlutusTx.Plugin #-}

module BuiltinUnit.Spec where

import PlutusTx.Prelude
import Prelude (IO, seq)

import Control.Lens (view)
import PlutusTx (CompiledCode, compile, getPlcNoAnn)
import PlutusTx.Builtins.Internal (unitval)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (Assertion, testCase)
import UntypedPlutusCore (progTerm)

tests :: TestTree
tests =
testGroup
"BuiltinUnit"
[ testCase "error ()" do assertCompiledTerm code1
, testCase "unitval" do assertCompiledTerm code2
, testCase "locally defined constructor" do assertCompiledTerm code3
, testCase "toOpaque ()" do assertCompiledTerm code4
]

{- GHC Core after simplification:

code1 = case error () of
validator1_X0 { BuiltinUnit ipv_smFH -> plc Proxy validator1_X0 }

code2 = case unitval of
validator2_X0 { BuiltinUnit ipv_smFJ -> plc Proxy validator2_X0 }

code3 = case unitval of
builtinUnit_X0 { BuiltinUnit ipv_smFL -> plc Proxy builtinUnit_X0 }

code4 = case toOpaque $fHasToOpaque()BuiltinUnit () of
validator4_X0 { BuiltinUnit ipv_smGp -> plc Proxy validator4_X0 }

Compilation error:

<no location info>: error:
GHC Core to PLC plugin:
Error: Unsupported feature:
Cannot construct a value of type: BuiltinUnit
Note: GHC can generate these unexpectedly, you may need
'-fno-strictness', '-fno-specialise', '-fno-spec-constr',
'-fno-unbox-strict-fields', or '-fno-unbox-small-strict-fields'.
Context: Compiling expr: BuiltinUnit
Context: Compiling expr: BuiltinUnit ipv
Context: Compiling definition of: validator1
Context: Compiling expr: validator1
Context: Compiling expr at: test/BuiltinUnit/Spec.hs:75:11-36
Context: Compiling expr: validator1
-}

code1 :: CompiledCode BuiltinUnit
code1 = $$(compile [||validator1||])
where
validator1 :: BuiltinUnit
validator1 = PlutusTx.Prelude.error ()
{-# INLINEABLE validator1 #-}

code2 :: CompiledCode BuiltinUnit
code2 = $$(compile [||validator2||])
where
validator2 :: BuiltinUnit
validator2 = unitval
{-# INLINEABLE validator2 #-}

code3 :: CompiledCode BuiltinUnit
code3 = $$(compile [||validator3||])
where
validator3 :: BuiltinUnit
validator3 = builtinUnit
{-# INLINEABLE validator3 #-}

builtinUnit :: BuiltinUnit
builtinUnit = unitval
{-# INLINEABLE builtinUnit #-}

code4 :: CompiledCode BuiltinUnit
code4 = $$(compile [||validator4||])
where
validator4 :: BuiltinUnit
validator4 = toOpaque ()
{-# INLINEABLE validator4 #-}

assertCompiledTerm :: CompiledCode a -> Assertion
assertCompiledTerm code = view progTerm (getPlcNoAnn code) `seq` return @IO ()
2 changes: 2 additions & 0 deletions plutus-tx-plugin/test/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import AssocMap.Spec qualified as AssocMap
import Blueprint.Tests qualified
import Budget.Spec qualified as Budget
import BuiltinList.Budget.Spec qualified as BuiltinList.Budget
import BuiltinUnit.Spec qualified as BuiltinUnit
import ByteStringLiterals.Spec qualified as ByteStringLiterals
import DataList.Budget.Spec qualified as DataList.Budget
import Inline.Spec qualified as Inline
Expand Down Expand Up @@ -60,4 +61,5 @@ tests =
, embed AssocMap.propertyTests
, embed List.propertyTests
, Array.smokeTests
, embed BuiltinUnit.tests
]