[commit: ghc] master: Fix the SPECIALISE error in the haddock invocation of validate (1bf40a4)
Simon Peyton Jones
simonpj at microsoft.com
Mon Jun 13 15:40:24 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/1bf40a4b38180b8b1c1bdaf4919bc327d5b27abe
>---------------------------------------------------------------
commit 1bf40a4b38180b8b1c1bdaf4919bc327d5b27abe
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Mon Jun 13 13:37:47 2011 +0100
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 files 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
More information about the Cvs-ghc
mailing list