summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2015-08-05 13:38:20 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2015-08-05 14:25:23 +0100
commit617f6966b5aaedd3ecd3f4c0f3735253187b7ff5 (patch)
tree215c9ca17ffa4eb2976876668c787cbc3cf54c65
parente2b5738141d1f60858e53ed1edd7167b1a93800c (diff)
downloadhaskell-617f6966b5aaedd3ecd3f4c0f3735253187b7ff5.tar.gz
Do not complain about SPECIALISE for INLINE
Fixes Trac #10721. See Note [SPECIALISE on INLINE functions]
-rw-r--r--compiler/deSugar/DsBinds.hs25
1 files changed, 17 insertions, 8 deletions
diff --git a/compiler/deSugar/DsBinds.hs b/compiler/deSugar/DsBinds.hs
index b6edf7c35f..55c82dd0dc 100644
--- a/compiler/deSugar/DsBinds.hs
+++ b/compiler/deSugar/DsBinds.hs
@@ -67,9 +67,7 @@ import Bag
import BasicTypes hiding ( TopLevel )
import DynFlags
import FastString
-import ErrUtils( MsgDoc )
import Util
-import Control.Monad( when )
import MonadUtils
import Control.Monad(liftM)
import Fingerprint(Fingerprint(..), fingerprintString)
@@ -460,8 +458,10 @@ dsSpec mb_poly_rhs (L loc (SpecPrag poly_id spec_co spec_inl))
; spec_rhs <- dsHsWrapper spec_co poly_rhs
- ; when (isInlinePragma id_inl && wopt Opt_WarnPointlessPragmas dflags)
- (warnDs (specOnInline poly_name))
+-- Commented out: see Note [SPECIALISE on INLINE functions]
+-- ; when (isInlinePragma id_inl)
+-- (warnDs $ ptext (sLit "SPECIALISE pragma on INLINE function probably won't fire:")
+-- <+> quotes (ppr poly_name))
; return (Just (unitOL (spec_id, spec_rhs), rule))
-- NB: do *not* use makeCorePair on (spec_id,spec_rhs), because
@@ -503,11 +503,20 @@ dsSpec mb_poly_rhs (L loc (SpecPrag poly_id spec_co spec_inl))
| otherwise = spec_prag_act -- Specified by user
-specOnInline :: Name -> MsgDoc
-specOnInline f = ptext (sLit "SPECIALISE pragma on INLINE function probably won't fire:")
- <+> quotes (ppr f)
-{-
+{- Note [SPECIALISE on INLINE functions]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We used to warn that using SPECIALISE for a function marked INLINE
+would be a no-op; but it isn't! Especially with worker/wrapper split
+we might have
+ {-# INLINE f #-}
+ f :: Ord a => Int -> a -> ...
+ f d x y = case x of I# x' -> $wf d x' y
+
+We might want to specialise 'f' so that we in turn specialise '$wf'.
+We can't even /name/ '$wf' in the source code, so we can't specialise
+it even if we wanted to. Trac #10721 is a case in point.
+
Note [Activation pragmas for SPECIALISE]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
From a user SPECIALISE pragma for f, we generate