Cross-module SpecConstr
Type-class specialisation now happens flawlessly across modules. That is, if I define
module DefineF where
f :: Num a => a -> a
{-# INLINEABLE f #-}
f x = ...f x'....
then modules that import DefineF and call f at some particular type (say Int) will generate a specialised copy of f's code.
But this does not happen for SpecConstr; we only specialise a function for calls made in the same module. For example:
module M where
{-# INLINABLE foo #-}
foo True y = y
foo False (a,b) = foo True (a+b,b)
module X where
import M
bar = ...(foo (x,y))...
Here foo is called with an explicit (x,y) argument in module X, and we'd like to !SpecConstr it, as it would be if the call was in module M.
All the infrastructure is in place to allow cross-module SpecConstr; it just hasn't been done yet. This ticket is to record the idea.