Linear types are not supported in FFI [GHC-57396]

If the extension LinearTypes is enabled, then programmers can write expressions which have the linear function type a %1 -> b for functions which use their argument exactly once. When calling external functions via GHC’s FFI functionality, however, then it is not allowed to use a linear function type.

More information about this specific restriction can be found in the discussion in the GHC issue tracker.

Examples

Linear function type was used in foreign function call

In this example the programmer tries to use a C function with the help of GHC’s FFI system. The type given to the imported function, however, is not allowed. Only non-linear function types can be given to foreign functions.

messages/GHC-57396/linear-ffi/before/LinearFFI.hs:6:1: error: [GHC-57396]
    • Unacceptable argument type in foreign declaration:
        Linear types are not supported in FFI declarations, see #18472
    • When checking declaration:
        foreign import ccall safe "exp" c_exp :: Double %1 -> Double
  |
6 | foreign import ccall "exp" c_exp :: Double %1 -> Double
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LinearFFI.hs
Before
{-# LANGUAGE LinearTypes #-}
module LinearFFI where

import Foreign.Ptr

foreign import ccall "exp" c_exp :: Double %1 -> Double
After
{-# LANGUAGE LinearTypes #-}
module LinearFFI where

import Foreign.Ptr

foreign import ccall "exp" c_exp :: Double -> Double