import HsSyn
import TcRnMonad
+import TcHsSyn ( hsOverLitName )
import RnEnv
import RnTypes
import DynFlags ( DynFlag(..) )
import Outputable
import SrcLoc
import FastString
-import Literal ( inIntRange, inCharRange )
+import Literal ( inCharRange )
\end{code}
-*********************************************************
-* *
+%*********************************************************
+%* *
\subsection{Patterns}
-* *
-*********************************************************
+%* *
+%*********************************************************
\begin{code}
-- externally abstract type of name makers,
-- (e.g. in the pattern (x, x -> y) x needs to be bound in the rhs of the tuple)
SigPatIn pat ty -> do
- patsigs <- doptM Opt_PatternSignatures
+ patsigs <- doptM Opt_ScopedTypeVariables
if patsigs
then rnLPatAndThen var pat
(\ pat' -> do { (ty', fvs1) <- rnHsTypeFVs tvdoc ty
; return (res, fvs_res `plusFV` fv_expr) }
#ifndef GHCI
- pat@(QuasiQuotePat _) -> pprPanic "Can't do QuasiQuotePat without GHCi" (ppr p)
+ (QuasiQuotePat _) -> pprPanic "Can't do QuasiQuotePat without GHCi" (ppr p)
#else
QuasiQuotePat qq -> do
(qq', _) <- rnQuasiQuote qq
; rnLPatsAndThen var pats $ \ patslist ->
lcont (TuplePat patslist boxed placeHolderType) }
- TypePat name ->
- do { (name', fvs1) <- rnHsTypeFVs (text "In a type pattern") name
- ; (res, fvs2) <- lcont (TypePat name')
+ TypePat ty ->
+ do { (ty', fvs1) <- rnHsTypeFVs (text "In a type pattern") ty
+ ; (res, fvs2) <- lcont (TypePat ty')
; return (res, fvs1 `plusFV` fvs2) }
p -> pprPanic "rnLPatAndThen" (ppr p)
badPun :: Located RdrName -> SDoc
badPun fld = vcat [ptext (sLit "Illegal use of punning for field") <+> quotes (ppr fld),
- ptext (sLit "Use -XRecordPuns to permit this")]
+ ptext (sLit "Use -XNamedFieldPuns to permit this")]
-- wrappers
rnLit _ = return ()
rnOverLit :: HsOverLit t -> RnM (HsOverLit Name, FreeVars)
-rnOverLit (HsIntegral i _ _) = do
- (from_integer_name, fvs) <- lookupSyntaxName fromIntegerName
- if inIntRange i then
- return (HsIntegral i from_integer_name placeHolderType, fvs)
- else let
- extra_fvs = mkFVs [plusIntegerName, timesIntegerName]
- -- Big integer literals are built, using + and *,
- -- out of small integers (DsUtils.mkIntegerLit)
- -- [NB: plusInteger, timesInteger aren't rebindable...
- -- they are used to construct the argument to fromInteger,
- -- which is the rebindable one.]
- in
- return (HsIntegral i from_integer_name placeHolderType, fvs `plusFV` extra_fvs)
-
-rnOverLit (HsFractional i _ _) = do
- (from_rat_name, fvs) <- lookupSyntaxName fromRationalName
- let
- extra_fvs = mkFVs [ratioDataConName, plusIntegerName, timesIntegerName]
- -- We have to make sure that the Ratio type is imported with
- -- its constructor, because literals of type Ratio t are
- -- built with that constructor.
- -- The Rational type is needed too, but that will come in
- -- as part of the type for fromRational.
- -- The plus/times integer operations may be needed to construct the numerator
- -- and denominator (see DsUtils.mkIntegerLit)
- return (HsFractional i from_rat_name placeHolderType, fvs `plusFV` extra_fvs)
-
-rnOverLit (HsIsString s _ _) = do
- (from_string_name, fvs) <- lookupSyntaxName fromStringName
- return (HsIsString s from_string_name placeHolderType, fvs)
+rnOverLit lit@(OverLit {ol_val=val})
+ = do { let std_name = hsOverLitName val
+ ; (from_thing_name, fvs) <- lookupSyntaxName std_name
+ ; let rebindable = case from_thing_name of
+ HsVar v -> v /= std_name
+ _ -> panic "rnOverLit"
+ ; return (lit { ol_witness = from_thing_name
+ , ol_rebindable = rebindable }, fvs) }
\end{code}
+----------------------------------------------------------------
+-- Old code returned extra free vars need in desugarer
+-- but that is no longer necessary, I believe
+-- if inIntRange i then
+-- return (HsIntegral i from_integer_name placeHolderType, fvs)
+-- else let
+-- extra_fvs = mkFVs [plusIntegerName, timesIntegerName]
+-- Big integer literals are built, using + and *,
+-- out of small integers (DsUtils.mkIntegerLit)
+-- [NB: plusInteger, timesInteger aren't rebindable...
+-- they are used to construct the argument to fromInteger,
+-- which is the rebindable one.]
+
+-- (HsFractional i _ _) = do
+-- extra_fvs = mkFVs [ratioDataConName, plusIntegerName, timesIntegerName]
+-- We have to make sure that the Ratio type is imported with
+-- its constructor, because literals of type Ratio t are
+-- built with that constructor.
+-- The Rational type is needed too, but that will come in
+-- as part of the type for fromRational.
+-- The plus/times integer operations may be needed to construct the numerator
+-- and denominator (see DsUtils.mkIntegerLit)
+
%************************************************************************
%* *
\subsubsection{Quasiquotation}
patSigErr :: Outputable a => a -> SDoc
patSigErr ty
= (ptext (sLit "Illegal signature in pattern:") <+> ppr ty)
- $$ nest 4 (ptext (sLit "Use -XPatternSignatures to permit it"))
+ $$ nest 4 (ptext (sLit "Use -XScopedTypeVariables to permit it"))
dupFieldErr :: String -> RdrName -> SDoc
dupFieldErr str dup