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 <[email protected]>
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



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to