Make sL strict in /both/ arguments to L
[ghc-hetmet.git] / compiler / parser / Parser.y.pp
index cfaa8f8..7104a0d 100644 (file)
@@ -27,6 +27,7 @@ import HscTypes               ( IsBootInterface, DeprecTxt )
 import Lexer
 import RdrName
 import TysWiredIn      ( unitTyCon, unitDataCon, tupleTyCon, tupleCon, nilDataCon,
+                         unboxedSingletonTyCon, unboxedSingletonDataCon,
                          listTyCon_RDR, parrTyCon_RDR, consDataCon_RDR )
 import Type            ( funTyCon )
 import ForeignCall     ( Safety(..), CExportSpec(..), CLabelString,
@@ -336,6 +337,7 @@ TH_ID_SPLICE    { L _ (ITidEscape _)  }     -- $x
 '$('           { L _ ITparenEscape   }     -- $( exp )
 TH_VAR_QUOTE   { L _ ITvarQuote      }     -- 'x
 TH_TY_QUOTE    { L _ ITtyQuote       }      -- ''T
+TH_QUASIQUOTE  { L _ (ITquasiQuote _) }
 
 %monad { P } { >>= } { return }
 %lexer { lexer } { L _ ITeof }
@@ -1220,7 +1222,7 @@ decl      :: { Located (OrdList (LHsDecl RdrName)) }
                                                        PatBind (LL $ BangPat pat) (unLoc $3)
                                                                placeHolderType placeHolderNames)) } }
        | infixexp opt_sig rhs          {% do { r <- checkValDef $1 $2 $3;
-                                               return (LL $ unitOL (LL $ ValD r)) } }
+                                               return $! (LL $! (unitOL $! (LL $ ValD r))) } }
         | docdecl                       { LL $ unitOL $1 }
 
 rhs    :: { Located (GRHSs RdrName) }
@@ -1367,6 +1369,11 @@ aexp2    :: { LHsExpr RdrName }
                                                        (getTH_ID_SPLICE $1)))) } -- $x
        | '$(' exp ')'          { LL $ HsSpliceE (mkHsSplice $2) }               -- $( exp )
 
+       | TH_QUASIQUOTE         { let { loc = getLoc $1
+                                      ; ITquasiQuote (quoter, quote, quoteSpan) = unLoc $1
+                                      ; quoterId = mkUnqual varName quoter
+                                      }
+                                  in sL loc $ HsQuasiQuoteE (mkHsQuasiQuote quoterId quoteSpan quote) }
        | TH_VAR_QUOTE qvar     { LL $ HsBracket (VarBr (unLoc $2)) }
        | TH_VAR_QUOTE qcon     { LL $ HsBracket (VarBr (unLoc $2)) }
        | TH_TY_QUOTE tyvar     { LL $ HsBracket (VarBr (unLoc $2)) }
@@ -1655,6 +1662,8 @@ con       :: { Located RdrName }
 sysdcon        :: { Located DataCon }  -- Wired in data constructors
        : '(' ')'               { LL unitDataCon }
        | '(' commas ')'        { LL $ tupleCon Boxed $2 }
+       | '(#' '#)'             { LL $ unboxedSingletonDataCon }
+       | '(#' commas '#)'      { LL $ tupleCon Unboxed $2 }
        | '[' ']'               { LL nilDataCon }
 
 conop :: { Located RdrName }
@@ -1672,6 +1681,8 @@ gtycon    :: { Located RdrName }  -- A "general" qualified tycon
        : oqtycon                       { $1 }
        | '(' ')'                       { LL $ getRdrName unitTyCon }
        | '(' commas ')'                { LL $ getRdrName (tupleTyCon Boxed $2) }
+       | '(#' '#)'                     { LL $ getRdrName unboxedSingletonTyCon }
+       | '(#' commas '#)'              { LL $ getRdrName (tupleTyCon Unboxed $2) }
        | '(' '->' ')'                  { LL $ getRdrName funTyCon }
        | '[' ']'                       { LL $ listTyCon_RDR }
        | '[:' ':]'                     { LL $ parrTyCon_RDR }
@@ -1966,7 +1977,7 @@ comb4 a b c d = combineSrcSpans (getLoc a) $ combineSrcSpans (getLoc b) $
 -- strict constructor version:
 {-# INLINE sL #-}
 sL :: SrcSpan -> a -> Located a
-sL span a = span `seq` L span a
+sL span a = span `seq` a `seq` L span a
 
 -- Make a source location for the file.  We're a bit lazy here and just
 -- make a point SrcSpan at line 1, column 0.  Strictly speaking we should