
#16305: When should -Wmissed-specializations fire? -------------------------------------+------------------------------------- Reporter: crockeea | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.7 Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: Poor/confusing Unknown/Multiple | error message Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- While working on a fix for #16282, I noticed: 1. that `-Wmissed-specializations` doesn't fire when the docs say it should 2. that the "probable fix" suggested when a warning does fire is highly suspect {{{ import Data.Map main :: IO () main = do let m = [] :: [Map String Bool] mapM_ print m }}} With GHC 8.4.3, 8.6.3, and HEAD: `ghc -O2 -Wmissed-specializations Main.hs` does *not* issue any warnings. However, `ghc -O2 -Wall-missed-specializations Main.hs` *does* create a warning: {{{ Main.hs: warning: [-Wall-missed-specialisations] Could not specialise imported function ‘Data.Map.Internal.$w$cshowsPrec’ when specialising ‘Data.Map.Internal.$fShowMap_$cshowsPrec’ Probable fix: add INLINABLE pragma on ‘Data.Map.Internal.$w$cshowsPrec’ }}} The docs for `-Wmissed-specializations` say, "warn when specialisation of an imported, overloaded function fails." Since `showsPrec` is an imported function, it seems that a warning should have been issued with `-Wmissed- specs`. My reading of the docs is that `-Wall-missed-specs` should output everything `-Wmissed-specs` does, along with any *local* overloaded and unspecialized functions. Moreover, the "Probable fix" is suspect. A warning recommending an `INLINABLE` pragma is issued depending on the output of `warnMissedSpec` in specialise/Specialise.hs. For `-Wall-missed-specs`, `warnMissedSpec` doesn't check if an INLINABLE pragma is already present, so the fix could be redundant. For `-Wmissed-specs`, `warnMissedSpecs` *only* issues a warning if there *is* any inline pragma (of one sort of another) on all the callers, making the `probable fix` definitely redundant. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16305 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler