Skip to content

Dictionaries without dynamic superclasses do not get IPE source information

Consider:

{-# LANGUAGE AllowAmbiguousTypes  #-}

module Main where

import GHC.InfoProv
import Unsafe.Coerce

-- Boilerplate to help us access the literal dictionaries

data Dict c where
    Dict :: forall c. c => Dict c

data Box where
    Box :: forall a. a -> Box

mkBox :: forall a. a => Box
mkBox = unsafeCoerce (Dict @a)

-- Interesting bit

data A = A
data B a = B a

-- Will not get IPE
instance Show A where
  show = undefined

-- Will get IPE
instance Show a => Show (B a) where
  show = undefined

main :: IO ()
main = do
    (\(Box d) -> print =<< whereFrom d) $ mkBox @(Show A)
    (\(Box d) -> print =<< whereFrom d) $ mkBox @(Show (B A))

The Show A dictionary does not get a source location in its IPE data, but the Show (B a) dictionary does. This is because in GHC.Stg.Debug, when debug information is collected, StgRhsCons are not given initial estimates for source locations based on their Name, but StgRhsClosures are.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information