From 1bf40a4b38180b8b1c1bdaf4919bc327d5b27abe Mon Sep 17 00:00:00 2001 From: Simon Peyton Jones Date: Mon, 13 Jun 2011 13:37:47 +0100 Subject: [PATCH 1/1] Fix the SPECIALISE error in the haddock invocation of validate Specifically - Turn the error "You cannot SPECIALISE f because it is not INLINEABLE" into a warning - More importantly, suppress it altogether when HscTarget = HscNothing or HscInterpreted because then we aren't going to be generating unfoldings --- compiler/typecheck/TcBinds.lhs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/compiler/typecheck/TcBinds.lhs b/compiler/typecheck/TcBinds.lhs index 881c304..537da93 100644 --- a/compiler/typecheck/TcBinds.lhs +++ b/compiler/typecheck/TcBinds.lhs @@ -559,22 +559,29 @@ tcImpPrags :: [LSig Name] -> TcM [LTcSpecPrag] tcImpPrags prags = do { this_mod <- getModule ; dflags <- getDOpts - ; if not (dopt Opt_Specialise dflags) then - return [] -- Ignore SPECIALISE pragmas for imported things - -- when -O is not on; otherwise we get bogus - -- complaints about lack of INLINABLE pragmas - -- in the imported module (also compiled without -O) - -- Notably, when Haddocking the base library + ; if (not_specialising dflags) then + return [] else mapAndRecoverM (wrapLocM tcImpSpec) [L loc (name,prag) | (L loc prag@(SpecSig (L _ name) _ _)) <- prags , not (nameIsLocalOrFrom this_mod name) ] } + where + -- Ignore SPECIALISE pragmas for imported things + -- when we aren't specialising, or when we aren't generating + -- code. The latter happens when Haddocking the base library; + -- we don't wnat complaints about lack of INLINABLE pragmas + not_specialising dflags + | not (dopt Opt_Specialise dflags) = True + | otherwise = case hscTarget dflags of + HscNothing -> True + HscInterpreted -> True + _other -> False tcImpSpec :: (Name, Sig Name) -> TcM TcSpecPrag tcImpSpec (name, prag) = do { id <- tcLookupId name - ; checkTc (isAnyInlinePragma (idInlinePragma id)) - (impSpecErr name) + ; unless (isAnyInlinePragma (idInlinePragma id)) + (addWarnTc (impSpecErr name)) ; tcSpec id prag } impSpecErr :: Name -> SDoc -- 1.7.10.4