Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
-
fe2b79f4
by Recursion Ninja at 2025-12-10T08:34:18-05:00
-
06c2349c
by Recursion Ninja at 2025-12-10T08:34:58-05:00
-
97db2d98
by sheaf at 2025-12-10T11:39:08-05:00
-
f8252a5a
by sheaf at 2025-12-10T11:39:08-05:00
-
28deff1e
by Teo Camarasu at 2025-12-10T11:39:09-05:00
26 changed files:
- compiler/GHC/Cmm/Opt.hs
- compiler/GHC/Core/TyCo/FVs.hs
- compiler/GHC/Core/TyCo/Rep.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/Tc/Utils/TcType.hs
- compiler/Language/Haskell/Syntax/Type.hs
- libraries/base/src/GHC/Num.hs
- + testsuite/tests/cmm/opt/T25664.hs
- + testsuite/tests/cmm/opt/T25664.stdout
- testsuite/tests/cmm/opt/all.T
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/base-exports.stdout-ws-32
- utils/haddock/haddock-api/src/Haddock/Backends/LaTeX.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
- utils/haddock/haddock-api/src/Haddock/Convert.hs
- utils/haddock/haddock-api/src/Haddock/GhcUtils.hs
- utils/haddock/html-test/ref/Bug1050.html
- utils/haddock/html-test/ref/LinearTypes.html
- utils/haddock/html-test/ref/PatternSyns.html
- + utils/haddock/html-test/ref/PatternSyns2.html
- utils/haddock/html-test/ref/TypeOperators.html
- + utils/haddock/html-test/src/PatternSyns2.hs
- utils/haddock/latex-test/ref/LinearTypes/LinearTypes.tex
Changes:
| ... | ... | @@ -395,26 +395,39 @@ cmmMachOpFoldM platform mop [x, (CmmLit (CmmInt 1 rep))] |
| 395 | 395 | one = CmmLit (CmmInt 1 (wordWidth platform))
|
| 396 | 396 | |
| 397 | 397 | -- Now look for multiplication/division by powers of 2 (integers).
|
| 398 | - |
|
| 399 | -cmmMachOpFoldM platform mop [x, (CmmLit (CmmInt n _))]
|
|
| 398 | +--
|
|
| 399 | +-- Naively this is as simple a matter as left/right bit shifts,
|
|
| 400 | +-- but the Cmm representation if integral values quickly complicated the matter.
|
|
| 401 | +--
|
|
| 402 | +-- We must carefully narrow the value to be within the range of values for the
|
|
| 403 | +-- type's logical bit-width. However, Cmm only represents values as *signed*
|
|
| 404 | +-- integers internally yet the logical type may be unsigned. If we are dealing
|
|
| 405 | +-- with a negative integer type at width @_w@, the only negative number that
|
|
| 406 | +-- wraps around to be a positive power of 2 after calling narrowU is -2^(_w - 1)
|
|
| 407 | +-- which wraps round to 2^(_w - 1), and multiplying by -2^(_w - 1) is indeed
|
|
| 408 | +-- the same as a left shift by (w - 1), so this is OK.
|
|
| 409 | +--
|
|
| 410 | +-- ToDo: See #25664 (comment 605821) describing a change to the Cmm literal representation.
|
|
| 411 | +-- When/If this is completed, this code must be refactored to account for the explicit width sizes.
|
|
| 412 | +cmmMachOpFoldM platform mop [x, (CmmLit (CmmInt n _w))]
|
|
| 400 | 413 | = case mop of
|
| 401 | 414 | MO_Mul rep
|
| 402 | - | Just p <- exactLog2 n ->
|
|
| 415 | + | Just p <- exactLog2 (narrowU rep n) ->
|
|
| 403 | 416 | Just $! (cmmMachOpFold platform (MO_Shl rep) [x, CmmLit (CmmInt p $ wordWidth platform)])
|
| 404 | 417 | MO_U_Quot rep
|
| 405 | - | Just p <- exactLog2 n ->
|
|
| 418 | + | Just p <- exactLog2 (narrowU rep n) ->
|
|
| 406 | 419 | Just $! (cmmMachOpFold platform (MO_U_Shr rep) [x, CmmLit (CmmInt p $ wordWidth platform)])
|
| 407 | 420 | MO_U_Rem rep
|
| 408 | - | Just _ <- exactLog2 n ->
|
|
| 421 | + | Just _ <- exactLog2 (narrowU rep n) ->
|
|
| 409 | 422 | Just $! (cmmMachOpFold platform (MO_And rep) [x, CmmLit (CmmInt (n - 1) rep)])
|
| 410 | 423 | MO_S_Quot rep
|
| 411 | - | Just p <- exactLog2 n,
|
|
| 424 | + | Just p <- exactLog2 (narrowS rep n),
|
|
| 412 | 425 | CmmReg _ <- x -> -- We duplicate x in signedQuotRemHelper, hence require
|
| 413 | 426 | -- it is a reg. FIXME: remove this restriction.
|
| 414 | 427 | Just $! (cmmMachOpFold platform (MO_S_Shr rep)
|
| 415 | 428 | [signedQuotRemHelper rep p, CmmLit (CmmInt p $ wordWidth platform)])
|
| 416 | 429 | MO_S_Rem rep
|
| 417 | - | Just p <- exactLog2 n,
|
|
| 430 | + | Just p <- exactLog2 (narrowS rep n),
|
|
| 418 | 431 | CmmReg _ <- x -> -- We duplicate x in signedQuotRemHelper, hence require
|
| 419 | 432 | -- it is a reg. FIXME: remove this restriction.
|
| 420 | 433 | -- We replace (x `rem` 2^p) by (x - (x `quot` 2^p) * 2^p).
|
| ... | ... | @@ -635,7 +635,9 @@ tyCoFVsOfType (TyConApp _ tys) f bound_vars acc = tyCoFVsOfTypes tys f bound_v |
| 635 | 635 | -- See Note [Free vars and synonyms]
|
| 636 | 636 | tyCoFVsOfType (LitTy {}) f bound_vars acc = emptyFV f bound_vars acc
|
| 637 | 637 | tyCoFVsOfType (AppTy fun arg) f bound_vars acc = (tyCoFVsOfType fun `unionFV` tyCoFVsOfType arg) f bound_vars acc
|
| 638 | -tyCoFVsOfType (FunTy _ w arg res) f bound_vars acc = (tyCoFVsOfType w `unionFV` tyCoFVsOfType arg `unionFV` tyCoFVsOfType res) f bound_vars acc
|
|
| 638 | +tyCoFVsOfType (FunTy _ w arg res) f bound_vars acc =
|
|
| 639 | + -- As per #23764, if we have 'a %m -> b', quantification order should be [a,m,b] not [m,a,b].
|
|
| 640 | + (tyCoFVsOfType arg `unionFV` tyCoFVsOfType w `unionFV` tyCoFVsOfType res) f bound_vars acc
|
|
| 639 | 641 | tyCoFVsOfType (ForAllTy bndr ty) f bound_vars acc = tyCoFVsBndr bndr (tyCoFVsOfType ty) f bound_vars acc
|
| 640 | 642 | tyCoFVsOfType (CastTy ty co) f bound_vars acc = (tyCoFVsOfType ty `unionFV` tyCoFVsOfCo co) f bound_vars acc
|
| 641 | 643 | tyCoFVsOfType (CoercionTy co) f bound_vars acc = tyCoFVsOfCo co f bound_vars acc
|
| ... | ... | @@ -958,7 +960,9 @@ invisibleVarsOfType = go |
| 958 | 960 | = go ty'
|
| 959 | 961 | go (TyVarTy v) = go (tyVarKind v)
|
| 960 | 962 | go (AppTy f a) = go f `unionFV` go a
|
| 961 | - go (FunTy _ w ty1 ty2) = go w `unionFV` go ty1 `unionFV` go ty2
|
|
| 963 | + go (FunTy _ w ty1 ty2) =
|
|
| 964 | + -- As per #23764, order is: arg, mult, res.
|
|
| 965 | + go ty1 `unionFV` go w `unionFV` go ty2
|
|
| 962 | 966 | go (TyConApp tc tys) = tyCoFVsOfTypes invisibles `unionFV`
|
| 963 | 967 | invisibleVarsOfTypes visibles
|
| 964 | 968 | where (invisibles, visibles) = partitionInvisibleTypes tc tys
|
| ... | ... | @@ -1984,7 +1984,9 @@ foldTyCo (TyCoFolder { tcf_view = view |
| 1984 | 1984 | go_ty _ (LitTy {}) = mempty
|
| 1985 | 1985 | go_ty env (CastTy ty co) = go_ty env ty `mappend` go_co env co
|
| 1986 | 1986 | go_ty env (CoercionTy co) = go_co env co
|
| 1987 | - go_ty env (FunTy _ w arg res) = go_ty env w `mappend` go_ty env arg `mappend` go_ty env res
|
|
| 1987 | + go_ty env (FunTy _ w arg res) =
|
|
| 1988 | + -- As per #23764, ordering is [arg, w, res].
|
|
| 1989 | + go_ty env arg `mappend` go_ty env w `mappend` go_ty env res
|
|
| 1988 | 1990 | go_ty env (TyConApp _ tys) = go_tys env tys
|
| 1989 | 1991 | go_ty env (ForAllTy (Bndr tv vis) inner)
|
| 1990 | 1992 | = let !env' = tycobinder env tv vis -- Avoid building a thunk here
|
| ... | ... | @@ -640,6 +640,9 @@ hsLTyVarName = hsTyVarName . unLoc |
| 640 | 640 | hsLTyVarNames :: [LHsTyVarBndr flag (GhcPass p)] -> [IdP (GhcPass p)]
|
| 641 | 641 | hsLTyVarNames = mapMaybe hsLTyVarName
|
| 642 | 642 | |
| 643 | +hsQTvExplicit :: LHsQTyVars (GhcPass p) -> [LHsTyVarBndr (HsBndrVis (GhcPass p)) (GhcPass p)]
|
|
| 644 | +hsQTvExplicit = hsq_explicit
|
|
| 645 | + |
|
| 643 | 646 | hsForAllTelescopeBndrs :: HsForAllTelescope (GhcPass p) -> [LHsTyVarBndr ForAllTyFlag (GhcPass p)]
|
| 644 | 647 | hsForAllTelescopeBndrs (HsForAllVis _ bndrs) = map (fmap (setHsTyVarBndrFlag Required)) bndrs
|
| 645 | 648 | hsForAllTelescopeBndrs (HsForAllInvis _ bndrs) = map (fmap (updateHsTyVarBndrFlag Invisible)) bndrs
|
| ... | ... | @@ -1432,7 +1432,7 @@ collect_cand_qtvs orig_ty is_dep cur_lvl bound dvs ty |
| 1432 | 1432 | -- Uses accumulating-parameter style
|
| 1433 | 1433 | go dv (AppTy t1 t2) = foldlM go dv [t1, t2]
|
| 1434 | 1434 | go dv (TyConApp tc tys) = go_tc_args dv (tyConBinders tc) tys
|
| 1435 | - go dv (FunTy _ w arg res) = foldlM go dv [w, arg, res]
|
|
| 1435 | + go dv (FunTy _ w arg res) = foldlM go dv [arg, w, res]
|
|
| 1436 | 1436 | go dv (LitTy {}) = return dv
|
| 1437 | 1437 | go dv (CastTy ty co) = do { dv1 <- go dv ty
|
| 1438 | 1438 | ; collect_cand_qtvs_co orig_ty cur_lvl bound dv1 co }
|
| ... | ... | @@ -1009,8 +1009,8 @@ tcTyFamInstsAndVisX = go |
| 1009 | 1009 | go _ (LitTy {}) = []
|
| 1010 | 1010 | go is_invis_arg (ForAllTy bndr ty) = go is_invis_arg (binderType bndr)
|
| 1011 | 1011 | ++ go is_invis_arg ty
|
| 1012 | - go is_invis_arg (FunTy _ w ty1 ty2) = go is_invis_arg w
|
|
| 1013 | - ++ go is_invis_arg ty1
|
|
| 1012 | + go is_invis_arg (FunTy _ w ty1 ty2) = go is_invis_arg ty1
|
|
| 1013 | + ++ go is_invis_arg w
|
|
| 1014 | 1014 | ++ go is_invis_arg ty2
|
| 1015 | 1015 | go is_invis_arg ty@(AppTy _ _) =
|
| 1016 | 1016 | let (ty_head, ty_args) = splitAppTys ty
|
| ... | ... | @@ -55,7 +55,6 @@ module Language.Haskell.Syntax.Type ( |
| 55 | 55 | FieldOcc(..), LFieldOcc,
|
| 56 | 56 | |
| 57 | 57 | mapHsOuterImplicit,
|
| 58 | - hsQTvExplicit,
|
|
| 59 | 58 | isHsKindedTyVar
|
| 60 | 59 | ) where
|
| 61 | 60 | |
| ... | ... | @@ -68,7 +67,6 @@ import Language.Haskell.Syntax.Specificity |
| 68 | 67 | |
| 69 | 68 | import GHC.Hs.Doc (LHsDoc)
|
| 70 | 69 | import GHC.Data.FastString (FastString)
|
| 71 | -import GHC.Utils.Panic( panic )
|
|
| 72 | 70 | |
| 73 | 71 | import Data.Data hiding ( Fixity, Prefix, Infix )
|
| 74 | 72 | import Data.Maybe
|
| ... | ... | @@ -326,10 +324,6 @@ data LHsQTyVars pass -- See Note [HsType binders] |
| 326 | 324 | }
|
| 327 | 325 | | XLHsQTyVars !(XXLHsQTyVars pass)
|
| 328 | 326 | |
| 329 | -hsQTvExplicit :: LHsQTyVars pass -> [LHsTyVarBndr (HsBndrVis pass) pass]
|
|
| 330 | -hsQTvExplicit (HsQTvs { hsq_explicit = explicit_tvs }) = explicit_tvs
|
|
| 331 | -hsQTvExplicit (XLHsQTyVars {}) = panic "hsQTvExplicit"
|
|
| 332 | - |
|
| 333 | 327 | ------------------------------------------------
|
| 334 | 328 | -- HsOuterTyVarBndrs
|
| 335 | 329 | -- Used to quantify the outermost type variable binders of a type that obeys
|
| 1 | +{-# LANGUAGE MagicHash #-}
|
|
| 1 | 2 | {-# OPTIONS_HADDOCK not-home #-}
|
| 2 | 3 | |
| 3 | 4 | -- |
|
| ... | ... | @@ -16,11 +17,190 @@ module GHC.Num |
| 16 | 17 | ( Num(..)
|
| 17 | 18 | , subtract
|
| 18 | 19 | , quotRemInteger
|
| 19 | - , module GHC.Num.Integer
|
|
| 20 | - , module GHC.Num.Natural
|
|
| 20 | + , integerFromNatural
|
|
| 21 | + , integerToNaturalClamp
|
|
| 22 | + , integerToNaturalThrow
|
|
| 23 | + , integerToNatural
|
|
| 24 | + , integerToWord#
|
|
| 25 | + , integerToInt#
|
|
| 26 | + , integerToWord64#
|
|
| 27 | + , integerToInt64#
|
|
| 28 | + , integerAdd
|
|
| 29 | + , integerMul
|
|
| 30 | + , integerSub
|
|
| 31 | + , integerNegate
|
|
| 32 | + , integerAbs
|
|
| 33 | + , integerPopCount#
|
|
| 34 | + , integerQuot
|
|
| 35 | + , integerRem
|
|
| 36 | + , integerDiv
|
|
| 37 | + , integerMod
|
|
| 38 | + , integerDivMod#
|
|
| 39 | + , integerQuotRem#
|
|
| 40 | + , integerEncodeFloat#
|
|
| 41 | + , integerEncodeDouble#
|
|
| 42 | + , integerGcd
|
|
| 43 | + , integerLcm
|
|
| 44 | + , integerAnd
|
|
| 45 | + , integerOr
|
|
| 46 | + , integerXor
|
|
| 47 | + , integerComplement
|
|
| 48 | + , integerBit#
|
|
| 49 | + , integerTestBit#
|
|
| 50 | + , integerShiftL#
|
|
| 51 | + , integerShiftR#
|
|
| 52 | + , integerFromWord#
|
|
| 53 | + , integerFromWord64#
|
|
| 54 | + , integerFromInt64#
|
|
| 55 | + , Integer(..)
|
|
| 56 | + , integerBit
|
|
| 57 | + , integerCheck
|
|
| 58 | + , integerCheck#
|
|
| 59 | + , integerCompare
|
|
| 60 | + , integerDecodeDouble#
|
|
| 61 | + , integerDivMod
|
|
| 62 | + , integerEncodeDouble
|
|
| 63 | + , integerEq
|
|
| 64 | + , integerEq#
|
|
| 65 | + , integerFromAddr
|
|
| 66 | + , integerFromAddr#
|
|
| 67 | + , integerFromBigNat#
|
|
| 68 | + , integerFromBigNatNeg#
|
|
| 69 | + , integerFromBigNatSign#
|
|
| 70 | + , integerFromByteArray
|
|
| 71 | + , integerFromByteArray#
|
|
| 72 | + , integerFromInt
|
|
| 73 | + , integerFromInt#
|
|
| 74 | + , integerFromWord
|
|
| 75 | + , integerFromWordList
|
|
| 76 | + , integerFromWordNeg#
|
|
| 77 | + , integerFromWordSign#
|
|
| 78 | + , integerGcde
|
|
| 79 | + , integerGcde#
|
|
| 80 | + , integerGe
|
|
| 81 | + , integerGe#
|
|
| 82 | + , integerGt
|
|
| 83 | + , integerGt#
|
|
| 84 | + , integerIsNegative
|
|
| 85 | + , integerIsNegative#
|
|
| 86 | + , integerIsOne
|
|
| 87 | + , integerIsPowerOf2#
|
|
| 88 | + , integerIsZero
|
|
| 89 | + , integerLe
|
|
| 90 | + , integerLe#
|
|
| 91 | + , integerLog2
|
|
| 92 | + , integerLog2#
|
|
| 93 | + , integerLogBase
|
|
| 94 | + , integerLogBase#
|
|
| 95 | + , integerLogBaseWord
|
|
| 96 | + , integerLogBaseWord#
|
|
| 97 | + , integerLt
|
|
| 98 | + , integerLt#
|
|
| 99 | + , integerNe
|
|
| 100 | + , integerNe#
|
|
| 101 | + , integerOne
|
|
| 102 | + , integerPowMod#
|
|
| 103 | + , integerQuotRem
|
|
| 104 | + , integerRecipMod#
|
|
| 105 | + , integerShiftL
|
|
| 106 | + , integerShiftR
|
|
| 107 | + , integerSignum
|
|
| 108 | + , integerSignum#
|
|
| 109 | + , integerSizeInBase#
|
|
| 110 | + , integerSqr
|
|
| 111 | + , integerTestBit
|
|
| 112 | + , integerToAddr
|
|
| 113 | + , integerToAddr#
|
|
| 114 | + , integerToBigNatClamp#
|
|
| 115 | + , integerToBigNatSign#
|
|
| 116 | + , integerToInt
|
|
| 117 | + , integerToMutableByteArray
|
|
| 118 | + , integerToMutableByteArray#
|
|
| 119 | + , integerToWord
|
|
| 120 | + , integerZero
|
|
| 121 | + , naturalToWord#
|
|
| 122 | + , naturalPopCount#
|
|
| 123 | + , naturalShiftR#
|
|
| 124 | + , naturalShiftL#
|
|
| 125 | + , naturalAdd
|
|
| 126 | + , naturalSub
|
|
| 127 | + , naturalSubThrow
|
|
| 128 | + , naturalSubUnsafe
|
|
| 129 | + , naturalMul
|
|
| 130 | + , naturalQuotRem#
|
|
| 131 | + , naturalQuot
|
|
| 132 | + , naturalRem
|
|
| 133 | + , naturalAnd
|
|
| 134 | + , naturalAndNot
|
|
| 135 | + , naturalOr
|
|
| 136 | + , naturalXor
|
|
| 137 | + , naturalTestBit#
|
|
| 138 | + , naturalBit#
|
|
| 139 | + , naturalGcd
|
|
| 140 | + , naturalLcm
|
|
| 141 | + , naturalLog2#
|
|
| 142 | + , naturalLogBaseWord#
|
|
| 143 | + , naturalLogBase#
|
|
| 144 | + , naturalPowMod
|
|
| 145 | + , naturalSizeInBase#
|
|
| 146 | + , Natural(..)
|
|
| 147 | + , naturalBit
|
|
| 148 | + , naturalCheck
|
|
| 149 | + , naturalCheck#
|
|
| 150 | + , naturalClearBit
|
|
| 151 | + , naturalClearBit#
|
|
| 152 | + , naturalCompare
|
|
| 153 | + , naturalComplementBit
|
|
| 154 | + , naturalComplementBit#
|
|
| 155 | + , naturalEncodeDouble#
|
|
| 156 | + , naturalEncodeFloat#
|
|
| 157 | + , naturalEq
|
|
| 158 | + , naturalEq#
|
|
| 159 | + , naturalFromAddr
|
|
| 160 | + , naturalFromAddr#
|
|
| 161 | + , naturalFromBigNat#
|
|
| 162 | + , naturalFromByteArray#
|
|
| 163 | + , naturalFromWord
|
|
| 164 | + , naturalFromWord#
|
|
| 165 | + , naturalFromWord2#
|
|
| 166 | + , naturalFromWordList
|
|
| 167 | + , naturalGe
|
|
| 168 | + , naturalGe#
|
|
| 169 | + , naturalGt
|
|
| 170 | + , naturalGt#
|
|
| 171 | + , naturalIsOne
|
|
| 172 | + , naturalIsPowerOf2#
|
|
| 173 | + , naturalIsZero
|
|
| 174 | + , naturalLe
|
|
| 175 | + , naturalLe#
|
|
| 176 | + , naturalLog2
|
|
| 177 | + , naturalLogBase
|
|
| 178 | + , naturalLogBaseWord
|
|
| 179 | + , naturalLt
|
|
| 180 | + , naturalLt#
|
|
| 181 | + , naturalNe
|
|
| 182 | + , naturalNe#
|
|
| 183 | + , naturalNegate
|
|
| 184 | + , naturalOne
|
|
| 185 | + , naturalPopCount
|
|
| 186 | + , naturalQuotRem
|
|
| 187 | + , naturalSetBit
|
|
| 188 | + , naturalSetBit#
|
|
| 189 | + , naturalShiftL
|
|
| 190 | + , naturalShiftR
|
|
| 191 | + , naturalSignum
|
|
| 192 | + , naturalSqr
|
|
| 193 | + , naturalTestBit
|
|
| 194 | + , naturalToAddr
|
|
| 195 | + , naturalToAddr#
|
|
| 196 | + , naturalToBigNat#
|
|
| 197 | + , naturalToMutableByteArray#
|
|
| 198 | + , naturalToWord
|
|
| 199 | + , naturalToWordClamp
|
|
| 200 | + , naturalToWordClamp#
|
|
| 201 | + , naturalToWordMaybe#
|
|
| 202 | + , naturalZero
|
|
| 21 | 203 | )
|
| 22 | 204 | where
|
| 23 | 205 | |
| 24 | 206 | import GHC.Internal.Num |
| 25 | -import GHC.Num.Integer
|
|
| 26 | -import GHC.Num.Natural |
| 1 | +{-# OPTIONS_GHC -O -fno-full-laziness #-}
|
|
| 2 | +{-# LANGUAGE MagicHash #-}
|
|
| 3 | + |
|
| 4 | +import GHC.Exts
|
|
| 5 | +import GHC.Int
|
|
| 6 | + |
|
| 7 | +mb8 :: Int8 -> Int8
|
|
| 8 | +{-# OPAQUE mb8 #-}
|
|
| 9 | +mb8 (I8# i) = I8# (i `quotInt8#` (noinline intToInt8# 128#))
|
|
| 10 | + |
|
| 11 | +mb16 :: Int16 -> Int16
|
|
| 12 | +{-# OPAQUE mb16 #-}
|
|
| 13 | +mb16 (I16# i) = I16# (i `quotInt16#` (noinline intToInt16# 32768#))
|
|
| 14 | + |
|
| 15 | +main :: IO ()
|
|
| 16 | +main = print (mb8 minBound) >> print (mb16 minBound)
|
|
| 17 | + |
| 1 | +1
|
|
| 2 | +1 |
| ... | ... | @@ -12,3 +12,6 @@ test('T25771', [cmm_src, only_ways(['optasm']), |
| 12 | 12 | grep_errmsg(r'(12\.345|0\.6640625)',[1]),
|
| 13 | 13 | ],
|
| 14 | 14 | compile, ['-ddump-cmm'])
|
| 15 | + |
|
| 16 | +# Cmm should correctly account for word size when performing MUL/DIV/REM by a power of 2 optimization.
|
|
| 17 | +test('T25664', normal, compile_and_run, ['']) |
|
| \ No newline at end of file |
| ... | ... | @@ -8351,7 +8351,7 @@ module GHC.Natural where |
| 8351 | 8351 | xorNatural :: Natural -> Natural -> Natural
|
| 8352 | 8352 | |
| 8353 | 8353 | module GHC.Num where
|
| 8354 | - -- Safety: None
|
|
| 8354 | + -- Safety: Safe-Inferred
|
|
| 8355 | 8355 | type Integer :: *
|
| 8356 | 8356 | data Integer = IS GHC.Internal.Prim.Int# | IP GHC.Internal.Prim.ByteArray# | IN GHC.Internal.Prim.ByteArray#
|
| 8357 | 8357 | type Natural :: *
|
| ... | ... | @@ -11397,7 +11397,7 @@ module GHC.Natural where |
| 11397 | 11397 | xorNatural :: Natural -> Natural -> Natural
|
| 11398 | 11398 | |
| 11399 | 11399 | module GHC.Num where
|
| 11400 | - -- Safety: None
|
|
| 11400 | + -- Safety: Safe-Inferred
|
|
| 11401 | 11401 | type Integer :: *
|
| 11402 | 11402 | data Integer = IS GHC.Internal.Prim.Int# | IP GHC.Internal.Prim.ByteArray# | IN GHC.Internal.Prim.ByteArray#
|
| 11403 | 11403 | type Natural :: *
|
| ... | ... | @@ -8569,7 +8569,7 @@ module GHC.Natural where |
| 8569 | 8569 | xorNatural :: Natural -> Natural -> Natural
|
| 8570 | 8570 | |
| 8571 | 8571 | module GHC.Num where
|
| 8572 | - -- Safety: None
|
|
| 8572 | + -- Safety: Safe-Inferred
|
|
| 8573 | 8573 | type Integer :: *
|
| 8574 | 8574 | data Integer = IS GHC.Internal.Prim.Int# | IP GHC.Internal.Prim.ByteArray# | IN GHC.Internal.Prim.ByteArray#
|
| 8575 | 8575 | type Natural :: *
|
| ... | ... | @@ -8351,7 +8351,7 @@ module GHC.Natural where |
| 8351 | 8351 | xorNatural :: Natural -> Natural -> Natural
|
| 8352 | 8352 | |
| 8353 | 8353 | module GHC.Num where
|
| 8354 | - -- Safety: None
|
|
| 8354 | + -- Safety: Safe-Inferred
|
|
| 8355 | 8355 | type Integer :: *
|
| 8356 | 8356 | data Integer = IS GHC.Internal.Prim.Int# | IP GHC.Internal.Prim.ByteArray# | IN GHC.Internal.Prim.ByteArray#
|
| 8357 | 8357 | type Natural :: *
|
| ... | ... | @@ -435,7 +435,7 @@ ppFamHeader |
| 435 | 435 | | associated = id
|
| 436 | 436 | | otherwise = (<+> keyword "family")
|
| 437 | 437 | |
| 438 | - famName = ppAppDocNameTyVarBndrs unicode name (hsq_explicit tvs)
|
|
| 438 | + famName = ppAppDocNameTyVarBndrs unicode name (hsQTvExplicitBinders tvs)
|
|
| 439 | 439 | |
| 440 | 440 | famSig = case result of
|
| 441 | 441 | NoSig _ -> empty
|
| ... | ... | @@ -644,7 +644,7 @@ ppTyVars :: RenderableBndrFlag flag => Bool -> [LHsTyVarBndr flag DocNameI] -> [ |
| 644 | 644 | ppTyVars unicode tvs = map (ppHsTyVarBndr unicode . unLoc) tvs
|
| 645 | 645 | |
| 646 | 646 | tyvarNames :: LHsQTyVars DocNameI -> [Maybe Name]
|
| 647 | -tyvarNames = map (fmap getName . hsLTyVarNameI) . hsQTvExplicit
|
|
| 647 | +tyvarNames = map (fmap getName . hsLTyVarNameI) . hsQTvExplicitBinders
|
|
| 648 | 648 | |
| 649 | 649 | declWithDoc :: LaTeX -> Maybe LaTeX -> LaTeX
|
| 650 | 650 | declWithDoc decl doc =
|
| ... | ... | @@ -468,7 +468,7 @@ ppTySyn |
| 468 | 468 | hdr =
|
| 469 | 469 | hsep
|
| 470 | 470 | ( [keyword "type", ppBinder summary occ]
|
| 471 | - ++ ppTyVars unicode qual (hsQTvExplicit ltyvars)
|
|
| 471 | + ++ ppTyVars unicode qual (hsQTvExplicitBinders ltyvars)
|
|
| 472 | 472 | )
|
| 473 | 473 | full = hdr <+> def
|
| 474 | 474 | def = case unLoc ltype of
|
| ... | ... | @@ -595,7 +595,7 @@ ppFamHeader |
| 595 | 595 | qual =
|
| 596 | 596 | hsep
|
| 597 | 597 | [ ppFamilyLeader associated info
|
| 598 | - , ppAppDocNameTyVarBndrs summary unicode qual name (hsq_explicit tvs)
|
|
| 598 | + , ppAppDocNameTyVarBndrs summary unicode qual name (hsQTvExplicitBinders tvs)
|
|
| 599 | 599 | , ppResultSig result unicode qual
|
| 600 | 600 | , injAnn
|
| 601 | 601 | , whereBit
|
| ... | ... | @@ -760,7 +760,7 @@ ppClassHdr |
| 760 | 760 | ppClassHdr summ lctxt n tvs fds unicode qual =
|
| 761 | 761 | keyword "class"
|
| 762 | 762 | <+> (if not (null $ fromMaybeContext lctxt) then ppLContext lctxt unicode qual HideEmptyContexts else noHtml)
|
| 763 | - <+> ppAppDocNameTyVarBndrs summ unicode qual n (hsQTvExplicit tvs)
|
|
| 763 | + <+> ppAppDocNameTyVarBndrs summ unicode qual n (hsQTvExplicitBinders tvs)
|
|
| 764 | 764 | <+> ppFds fds unicode qual
|
| 765 | 765 | |
| 766 | 766 | ppFds :: [LHsFunDep DocNameI] -> Unicode -> Qualification -> Html
|
| ... | ... | @@ -1656,7 +1656,7 @@ ppDataHeader |
| 1656 | 1656 | ppLContext ctxt unicode qual HideEmptyContexts
|
| 1657 | 1657 | <+>
|
| 1658 | 1658 | -- T a b c ..., or a :+: b
|
| 1659 | - ppAppDocNameTyVarBndrs summary unicode qual name (hsQTvExplicit tvs)
|
|
| 1659 | + ppAppDocNameTyVarBndrs summary unicode qual name (hsQTvExplicitBinders tvs)
|
|
| 1660 | 1660 | <+> case ks of
|
| 1661 | 1661 | Nothing -> mempty
|
| 1662 | 1662 | Just (L _ x) -> dcolon unicode <+> ppKind unicode qual x
|
| ... | ... | @@ -29,7 +29,7 @@ module Haddock.Convert |
| 29 | 29 | |
| 30 | 30 | import Control.DeepSeq (force)
|
| 31 | 31 | import Data.Either (lefts, partitionEithers, rights)
|
| 32 | -import Data.Maybe (catMaybes, mapMaybe, maybeToList)
|
|
| 32 | +import Data.Maybe (catMaybes, mapMaybe)
|
|
| 33 | 33 | import GHC.Builtin.Names
|
| 34 | 34 | ( boxedRepDataConKey
|
| 35 | 35 | , eqTyConKey
|
| ... | ... | @@ -140,7 +140,7 @@ tyThingToLHsDecl prr t = case t of |
| 140 | 140 | hsq_explicit $
|
| 141 | 141 | fdTyVars fd
|
| 142 | 142 | , feqn_fixity = fdFixity fd
|
| 143 | - , feqn_rhs = synifyType WithinType [] rhs
|
|
| 143 | + , feqn_rhs = synifyType WithinType emptyVarSet rhs
|
|
| 144 | 144 | }
|
| 145 | 145 | |
| 146 | 146 | extractAtItem
|
| ... | ... | @@ -179,7 +179,7 @@ tyThingToLHsDecl prr t = case t of |
| 179 | 179 | noLocA (MinimalSig (noAnn, NoSourceText) . noLocA $ classMinimalDef cl)
|
| 180 | 180 | : [ noLocA tcdSig
|
| 181 | 181 | | clsOp <- classOpItems cl
|
| 182 | - , tcdSig <- synifyTcIdSig vs clsOp
|
|
| 182 | + , tcdSig <- synifyTcIdSig (mkVarSet vs) clsOp
|
|
| 183 | 183 | ]
|
| 184 | 184 | , tcdMeths = [] -- ignore default method definitions, they don't affect signature
|
| 185 | 185 | -- class associated-types are a subset of TyCon:
|
| ... | ... | @@ -213,9 +213,9 @@ synifyAxBranch :: TyCon -> CoAxBranch -> TyFamInstEqn GhcRn |
| 213 | 213 | synifyAxBranch tc (CoAxBranch{cab_tvs = tkvs, cab_lhs = args, cab_rhs = rhs}) =
|
| 214 | 214 | let name = synifyNameN tc
|
| 215 | 215 | args_types_only = filterOutInvisibleTypes tc args
|
| 216 | - typats = map (synifyType WithinType []) args_types_only
|
|
| 216 | + typats = map (synifyType WithinType emptyVarSet) args_types_only
|
|
| 217 | 217 | annot_typats = zipWith3 annotHsType args_poly args_types_only typats
|
| 218 | - hs_rhs = synifyType WithinType [] rhs
|
|
| 218 | + hs_rhs = synifyType WithinType emptyVarSet rhs
|
|
| 219 | 219 | outer_bndrs = HsOuterImplicit{hso_ximplicit = map tyVarName tkvs}
|
| 220 | 220 | in -- TODO: this must change eventually
|
| 221 | 221 | FamEqn
|
| ... | ... | @@ -344,7 +344,7 @@ synifyTyCon _prr coax tc |
| 344 | 344 | , tcdLName = synifyNameN tc
|
| 345 | 345 | , tcdTyVars = synifyTyVars (tyConVisibleTyVars tc)
|
| 346 | 346 | , tcdFixity = synifyFixity tc
|
| 347 | - , tcdRhs = synifyType WithinType [] ty
|
|
| 347 | + , tcdRhs = synifyType WithinType emptyVarSet ty
|
|
| 348 | 348 | }
|
| 349 | 349 | -- (closed) newtype and data
|
| 350 | 350 | | otherwise = do
|
| ... | ... | @@ -578,8 +578,8 @@ synifyDataCon use_gadt_syntax dc = |
| 578 | 578 | linear_tys =
|
| 579 | 579 | zipWith
|
| 580 | 580 | ( \(Scaled mult ty) (HsSrcBang st unp str) ->
|
| 581 | - let tySyn = synifyType WithinType [] ty
|
|
| 582 | - multSyn = synifyMultRec [] mult
|
|
| 581 | + let tySyn = synifyType WithinType emptyVarSet ty
|
|
| 582 | + multSyn = synifyMultRec emptyVarSet mult
|
|
| 583 | 583 | in CDF (noAnn, st) unp str multSyn tySyn Nothing
|
| 584 | 584 | )
|
| 585 | 585 | arg_tys
|
| ... | ... | @@ -620,7 +620,7 @@ synifyDataCon use_gadt_syntax dc = |
| 620 | 620 | , con_inner_bndrs = inner_bndrs
|
| 621 | 621 | , con_mb_cxt = ctx
|
| 622 | 622 | , con_g_args = hat
|
| 623 | - , con_res_ty = synifyType WithinType [] res_ty
|
|
| 623 | + , con_res_ty = synifyType WithinType emptyVarSet res_ty
|
|
| 624 | 624 | , con_doc = Nothing
|
| 625 | 625 | }
|
| 626 | 626 | else do
|
| ... | ... | @@ -657,11 +657,11 @@ synifyIdSig |
| 657 | 657 | -> SynifyTypeState
|
| 658 | 658 | -- ^ what to do with a 'forall'
|
| 659 | 659 | -> [TyVar]
|
| 660 | - -- ^ free variables in the type to convert
|
|
| 660 | + -- ^ type variables bound from an outer scope
|
|
| 661 | 661 | -> Id
|
| 662 | 662 | -- ^ the 'Id' from which to get the type signature
|
| 663 | 663 | -> Sig GhcRn
|
| 664 | -synifyIdSig prr s vs i = TypeSig noAnn [n] (synifySigWcType s vs t)
|
|
| 664 | +synifyIdSig prr s boundTvs i = TypeSig noAnn [n] (synifySigWcType s boundTvs t)
|
|
| 665 | 665 | where
|
| 666 | 666 | !n = force $ synifyNameN i
|
| 667 | 667 | t = defaultType prr (varType i)
|
| ... | ... | @@ -669,18 +669,18 @@ synifyIdSig prr s vs i = TypeSig noAnn [n] (synifySigWcType s vs t) |
| 669 | 669 | -- | Turn a 'ClassOpItem' into a list of signatures. The list returned is going
|
| 670 | 670 | -- to contain the synified 'ClassOpSig' as well (when appropriate) a default
|
| 671 | 671 | -- 'ClassOpSig'.
|
| 672 | -synifyTcIdSig :: [TyVar] -> ClassOpItem -> [Sig GhcRn]
|
|
| 673 | -synifyTcIdSig vs (i, dm) =
|
|
| 672 | +synifyTcIdSig :: TyVarSet -> ClassOpItem -> [Sig GhcRn]
|
|
| 673 | +synifyTcIdSig boundTvs (i, dm) =
|
|
| 674 | 674 | [ClassOpSig noAnn False [synifyNameN i] (mainSig (varType i))]
|
| 675 | 675 | ++ [ ClassOpSig noAnn True [noLocA dn] (defSig dt)
|
| 676 | 676 | | Just (dn, GenericDM dt) <- [dm]
|
| 677 | 677 | ]
|
| 678 | 678 | where
|
| 679 | - mainSig t = synifySigType DeleteTopLevelQuantification vs t
|
|
| 680 | - defSig t = synifySigType ImplicitizeForAll vs t
|
|
| 679 | + mainSig t = synifySigType DeleteTopLevelQuantification boundTvs t
|
|
| 680 | + defSig t = synifySigType ImplicitizeForAll boundTvs t
|
|
| 681 | 681 | |
| 682 | 682 | synifyCtx :: [PredType] -> LHsContext GhcRn
|
| 683 | -synifyCtx ts = noLocA (map (synifyType WithinType []) ts)
|
|
| 683 | +synifyCtx ts = noLocA (map (synifyType WithinType emptyVarSet) ts)
|
|
| 684 | 684 | |
| 685 | 685 | synifyTyVars :: [TyVar] -> LHsQTyVars GhcRn
|
| 686 | 686 | synifyTyVars ktvs =
|
| ... | ... | @@ -699,7 +699,7 @@ synifyTyVarBndr' :: VarSet -> VarBndr TyVar flag -> LHsTyVarBndr flag GhcRn |
| 699 | 699 | synifyTyVarBndr' no_kinds (Bndr tv spec) = synify_ty_var no_kinds spec tv
|
| 700 | 700 | |
| 701 | 701 | -- | Like 'synifyTyVarBndr', but accepts a set of variables for which to omit kind
|
| 702 | --- signatures (even if they don't have the lifted type kind).
|
|
| 702 | +-- signatures (even if they don't have kind 'Type').
|
|
| 703 | 703 | synify_ty_var :: VarSet -> flag -> TyVar -> LHsTyVarBndr flag GhcRn
|
| 704 | 704 | synify_ty_var no_kinds flag tv =
|
| 705 | 705 | noLocA (HsTvb noAnn flag bndr_var bndr_kind)
|
| ... | ... | @@ -726,7 +726,7 @@ annotHsType _ _ hs_ty@(L _ (HsKindSig{})) = hs_ty |
| 726 | 726 | annotHsType True ty hs_ty
|
| 727 | 727 | | not $ isEmptyVarSet $ filterVarSet isTyVar $ tyCoVarsOfType ty =
|
| 728 | 728 | let ki = typeKind ty
|
| 729 | - hs_ki = synifyType WithinType [] ki
|
|
| 729 | + hs_ki = synifyType WithinType emptyVarSet ki
|
|
| 730 | 730 | in noLocA (HsKindSig noAnn hs_ty hs_ki)
|
| 731 | 731 | annotHsType _ _ hs_ty = hs_ty
|
| 732 | 732 | |
| ... | ... | @@ -768,14 +768,15 @@ data SynifyTypeState |
| 768 | 768 | -- the defining class gets to quantify all its functions for free!
|
| 769 | 769 | DeleteTopLevelQuantification
|
| 770 | 770 | |
| 771 | -synifySigType :: SynifyTypeState -> [TyVar] -> Type -> LHsSigType GhcRn
|
|
| 771 | +synifySigType :: SynifyTypeState -> TyVarSet -> Type -> LHsSigType GhcRn
|
|
| 772 | 772 | -- The use of mkEmptySigType (which uses empty binders in OuterImplicit)
|
| 773 | 773 | -- is a bit suspicious; what if the type has free variables?
|
| 774 | -synifySigType s vs ty = mkEmptySigType (synifyType s vs ty)
|
|
| 774 | +synifySigType s boundTvs ty = mkEmptySigType (synifyType s boundTvs ty)
|
|
| 775 | 775 | |
| 776 | 776 | synifySigWcType :: SynifyTypeState -> [TyVar] -> Type -> LHsSigWcType GhcRn
|
| 777 | 777 | -- Ditto (see synifySigType)
|
| 778 | -synifySigWcType s vs ty = mkEmptyWildCardBndrs (mkEmptySigType (rename (map getName vs) $ synifyType s vs ty))
|
|
| 778 | +synifySigWcType s vs ty =
|
|
| 779 | + mkEmptyWildCardBndrs (mkEmptySigType (rename (map getName vs) $ synifyType s (mkVarSet vs) ty))
|
|
| 779 | 780 | |
| 780 | 781 | synifyPatSynSigType :: PatSyn -> LHsSigType GhcRn
|
| 781 | 782 | -- Ditto (see synifySigType)
|
| ... | ... | @@ -791,13 +792,13 @@ defaultType HideRuntimeRep = defaultRuntimeRepVars |
| 791 | 792 | synifyType
|
| 792 | 793 | :: SynifyTypeState
|
| 793 | 794 | -- ^ what to do with a 'forall'
|
| 794 | - -> [TyVar]
|
|
| 795 | - -- ^ free variables in the type to convert
|
|
| 795 | + -> TyVarSet
|
|
| 796 | + -- ^ bound type variables
|
|
| 796 | 797 | -> Type
|
| 797 | 798 | -- ^ the type to convert
|
| 798 | 799 | -> LHsType GhcRn
|
| 799 | 800 | synifyType _ _ (TyVarTy tv) = noLocA $ HsTyVar noAnn NotPromoted $ noLocA (noUserRdr $ getName tv)
|
| 800 | -synifyType _ vs (TyConApp tc tys) =
|
|
| 801 | +synifyType _ boundTvs (TyConApp tc tys) =
|
|
| 801 | 802 | maybe_sig res_ty
|
| 802 | 803 | where
|
| 803 | 804 | res_ty :: LHsType GhcRn
|
| ... | ... | @@ -819,24 +820,24 @@ synifyType _ vs (TyConApp tc tys) = |
| 819 | 820 | ConstraintTuple -> HsBoxedOrConstraintTuple
|
| 820 | 821 | UnboxedTuple -> HsUnboxedTuple
|
| 821 | 822 | )
|
| 822 | - (map (synifyType WithinType vs) vis_tys)
|
|
| 823 | + (map (synifyType WithinType boundTvs) vis_tys)
|
|
| 823 | 824 | | isUnboxedSumTyCon tc =
|
| 824 | - noLocA $ HsSumTy noAnn (map (synifyType WithinType vs) vis_tys)
|
|
| 825 | + noLocA $ HsSumTy noAnn (map (synifyType WithinType boundTvs) vis_tys)
|
|
| 825 | 826 | | Just dc <- isPromotedDataCon_maybe tc
|
| 826 | 827 | , isTupleDataCon dc
|
| 827 | 828 | , dataConSourceArity dc == length vis_tys =
|
| 828 | - noLocA $ HsExplicitTupleTy noExtField IsPromoted (map (synifyType WithinType vs) vis_tys)
|
|
| 829 | + noLocA $ HsExplicitTupleTy noExtField IsPromoted (map (synifyType WithinType boundTvs) vis_tys)
|
|
| 829 | 830 | -- ditto for lists
|
| 830 | 831 | | getName tc == listTyConName
|
| 831 | 832 | , [ty] <- vis_tys =
|
| 832 | - noLocA $ HsListTy noAnn (synifyType WithinType vs ty)
|
|
| 833 | + noLocA $ HsListTy noAnn (synifyType WithinType boundTvs ty)
|
|
| 833 | 834 | | tc == promotedNilDataCon
|
| 834 | 835 | , [] <- vis_tys =
|
| 835 | 836 | noLocA $ HsExplicitListTy noExtField IsPromoted []
|
| 836 | 837 | | tc == promotedConsDataCon
|
| 837 | 838 | , [ty1, ty2] <- vis_tys =
|
| 838 | - let hTy = synifyType WithinType vs ty1
|
|
| 839 | - in case synifyType WithinType vs ty2 of
|
|
| 839 | + let hTy = synifyType WithinType boundTvs ty1
|
|
| 840 | + in case synifyType WithinType boundTvs ty2 of
|
|
| 840 | 841 | tTy
|
| 841 | 842 | | L _ (HsExplicitListTy _ IsPromoted tTy') <- stripKindSig tTy ->
|
| 842 | 843 | noLocA $ HsExplicitListTy noExtField IsPromoted (hTy : tTy')
|
| ... | ... | @@ -846,7 +847,7 @@ synifyType _ vs (TyConApp tc tys) = |
| 846 | 847 | | tc `hasKey` ipClassKey
|
| 847 | 848 | , [name, ty] <- tys
|
| 848 | 849 | , Just x <- isStrLitTy name =
|
| 849 | - noLocA $ HsIParamTy noAnn (noLocA $ HsIPName x) (synifyType WithinType vs ty)
|
|
| 850 | + noLocA $ HsIParamTy noAnn (noLocA $ HsIPName x) (synifyType WithinType boundTvs ty)
|
|
| 850 | 851 | -- and equalities
|
| 851 | 852 | | tc `hasKey` eqTyConKey
|
| 852 | 853 | , [ty1, ty2] <- tys =
|
| ... | ... | @@ -854,9 +855,9 @@ synifyType _ vs (TyConApp tc tys) = |
| 854 | 855 | HsOpTy
|
| 855 | 856 | noExtField
|
| 856 | 857 | NotPromoted
|
| 857 | - (synifyType WithinType vs ty1)
|
|
| 858 | + (synifyType WithinType boundTvs ty1)
|
|
| 858 | 859 | (noLocA $ noUserRdr eqTyConName)
|
| 859 | - (synifyType WithinType vs ty2)
|
|
| 860 | + (synifyType WithinType boundTvs ty2)
|
|
| 860 | 861 | -- and infix type operators
|
| 861 | 862 | | isSymOcc (nameOccName (getName tc))
|
| 862 | 863 | , ty1 : ty2 : tys_rest <- vis_tys =
|
| ... | ... | @@ -864,9 +865,9 @@ synifyType _ vs (TyConApp tc tys) = |
| 864 | 865 | ( HsOpTy
|
| 865 | 866 | noExtField
|
| 866 | 867 | prom
|
| 867 | - (synifyType WithinType vs ty1)
|
|
| 868 | + (synifyType WithinType boundTvs ty1)
|
|
| 868 | 869 | (noLocA $ noUserRdr $ getName tc)
|
| 869 | - (synifyType WithinType vs ty2)
|
|
| 870 | + (synifyType WithinType boundTvs ty2)
|
|
| 870 | 871 | )
|
| 871 | 872 | tys_rest
|
| 872 | 873 | -- Most TyCons:
|
| ... | ... | @@ -880,7 +881,7 @@ synifyType _ vs (TyConApp tc tys) = |
| 880 | 881 | foldl
|
| 881 | 882 | (\t1 t2 -> noLocA $ HsAppTy noExtField t1 t2)
|
| 882 | 883 | (noLocA ty_app)
|
| 883 | - ( map (synifyType WithinType vs) $
|
|
| 884 | + ( map (synifyType WithinType boundTvs) $
|
|
| 884 | 885 | filterOut isCoercionTy ty_args
|
| 885 | 886 | )
|
| 886 | 887 | |
| ... | ... | @@ -891,56 +892,57 @@ synifyType _ vs (TyConApp tc tys) = |
| 891 | 892 | maybe_sig ty'
|
| 892 | 893 | | tyConAppNeedsKindSig False tc tys_len =
|
| 893 | 894 | let full_kind = typeKind (mkTyConApp tc tys)
|
| 894 | - full_kind' = synifyType WithinType vs full_kind
|
|
| 895 | + full_kind' = synifyType WithinType boundTvs full_kind
|
|
| 895 | 896 | in noLocA $ HsKindSig noAnn ty' full_kind'
|
| 896 | 897 | | otherwise = ty'
|
| 897 | -synifyType _ vs ty@(AppTy{}) =
|
|
| 898 | +synifyType _ boundTvs ty@(AppTy{}) =
|
|
| 898 | 899 | let
|
| 899 | 900 | (ty_head, ty_args) = splitAppTys ty
|
| 900 | - ty_head' = synifyType WithinType vs ty_head
|
|
| 901 | + ty_head' = synifyType WithinType boundTvs ty_head
|
|
| 901 | 902 | ty_args' =
|
| 902 | - map (synifyType WithinType vs) $
|
|
| 903 | + map (synifyType WithinType boundTvs) $
|
|
| 903 | 904 | filterOut isCoercionTy $
|
| 904 | 905 | filterByList
|
| 905 | 906 | (map isVisibleForAllTyFlag $ appTyForAllTyFlags ty_head ty_args)
|
| 906 | 907 | ty_args
|
| 907 | 908 | in
|
| 908 | 909 | foldl (\t1 t2 -> noLocA $ HsAppTy noExtField t1 t2) ty_head' ty_args'
|
| 909 | -synifyType s vs funty@(FunTy af w t1 t2)
|
|
| 910 | - | isInvisibleFunArg af = synifySigmaType s vs funty
|
|
| 910 | +synifyType s boundTvs funty@(FunTy af w t1 t2)
|
|
| 911 | + | isInvisibleFunArg af = synifySigmaType s boundTvs funty
|
|
| 911 | 912 | | otherwise = noLocA $ HsFunTy noExtField w' s1 s2
|
| 912 | 913 | where
|
| 913 | - s1 = synifyType WithinType vs t1
|
|
| 914 | - s2 = synifyType WithinType vs t2
|
|
| 915 | - w' = synifyMultArrow vs w
|
|
| 916 | -synifyType s vs forallty@(ForAllTy (Bndr _ argf) _ty) =
|
|
| 914 | + s1 = synifyType WithinType boundTvs t1
|
|
| 915 | + s2 = synifyType WithinType boundTvs t2
|
|
| 916 | + w' = synifyMultArrow boundTvs w
|
|
| 917 | +synifyType s boundTvs forallty@(ForAllTy (Bndr _ argf) _ty) =
|
|
| 917 | 918 | case argf of
|
| 918 | - Required -> synifyVisForAllType vs forallty
|
|
| 919 | - Invisible _ -> synifySigmaType s vs forallty
|
|
| 919 | + Required -> synifyVisForAllType boundTvs forallty
|
|
| 920 | + Invisible _ -> synifySigmaType s boundTvs forallty
|
|
| 920 | 921 | synifyType _ _ (LitTy t) = noLocA $ HsTyLit noExtField $ synifyTyLit t
|
| 921 | -synifyType s vs (CastTy t _) = synifyType s vs t
|
|
| 922 | +synifyType s boundTvs (CastTy t _) = synifyType s boundTvs t
|
|
| 922 | 923 | synifyType _ _ (CoercionTy{}) = error "synifyType:Coercion"
|
| 923 | 924 | |
| 924 | 925 | -- | Process a 'Type' which starts with a visible @forall@ into an 'HsType'
|
| 925 | 926 | synifyVisForAllType
|
| 926 | - :: [TyVar]
|
|
| 927 | - -- ^ free variables in the type to convert
|
|
| 927 | + :: TyVarSet
|
|
| 928 | + -- ^ bound type variables
|
|
| 928 | 929 | -> Type
|
| 929 | 930 | -- ^ the forall type to convert
|
| 930 | 931 | -> LHsType GhcRn
|
| 931 | -synifyVisForAllType vs ty =
|
|
| 932 | +synifyVisForAllType boundTvs ty =
|
|
| 932 | 933 | let (tvs, rho) = tcSplitForAllTysReqPreserveSynonyms ty
|
| 933 | 934 | |
| 934 | - sTvs = map synifyTyVarBndr tvs
|
|
| 935 | + sTvs = map (synifyTyVarBndr' noKindSigTvs) tvs
|
|
| 936 | + noKindSigTvs = noKindSigTyVars ty
|
|
| 935 | 937 | |
| 936 | 938 | -- Figure out what the type variable order would be inferred in the
|
| 937 | 939 | -- absence of an explicit forall
|
| 938 | - tvs' = orderedFVs (mkVarSet vs) [rho]
|
|
| 940 | + tvs' = orderedFVs boundTvs [rho]
|
|
| 939 | 941 | in noLocA $
|
| 940 | 942 | HsForAllTy
|
| 941 | 943 | { hst_tele = mkHsForAllVisTele noAnn sTvs
|
| 942 | 944 | , hst_xforall = noExtField
|
| 943 | - , hst_body = synifyType WithinType (tvs' ++ vs) rho
|
|
| 945 | + , hst_body = synifyType WithinType (extendVarSetList boundTvs tvs') rho
|
|
| 944 | 946 | }
|
| 945 | 947 | |
| 946 | 948 | -- | Process a 'Type' which starts with an invisible @forall@ or a constraint
|
| ... | ... | @@ -948,18 +950,18 @@ synifyVisForAllType vs ty = |
| 948 | 950 | synifySigmaType
|
| 949 | 951 | :: SynifyTypeState
|
| 950 | 952 | -- ^ what to do with the 'forall'
|
| 951 | - -> [TyVar]
|
|
| 952 | - -- ^ free variables in the type to convert
|
|
| 953 | + -> TyVarSet
|
|
| 954 | + -- ^ bound type variables
|
|
| 953 | 955 | -> Type
|
| 954 | 956 | -- ^ the forall type to convert
|
| 955 | 957 | -> LHsType GhcRn
|
| 956 | -synifySigmaType s vs ty =
|
|
| 958 | +synifySigmaType s boundTvs ty =
|
|
| 957 | 959 | let (tvs, ctx, tau) = tcSplitSigmaTyPreserveSynonyms ty
|
| 958 | 960 | sPhi =
|
| 959 | 961 | HsQualTy
|
| 960 | 962 | { hst_ctxt = synifyCtx ctx
|
| 961 | 963 | , hst_xqual = noExtField
|
| 962 | - , hst_body = synifyType WithinType (tvs' ++ vs) tau
|
|
| 964 | + , hst_body = synifyType WithinType (extendVarSetList boundTvs tvs' ) tau
|
|
| 963 | 965 | }
|
| 964 | 966 | |
| 965 | 967 | sTy =
|
| ... | ... | @@ -969,49 +971,56 @@ synifySigmaType s vs ty = |
| 969 | 971 | , hst_body = noLocA sPhi
|
| 970 | 972 | }
|
| 971 | 973 | |
| 972 | - sTvs = map synifyTyVarBndr tvs
|
|
| 974 | + sTvs = map (synifyTyVarBndr' noKindSigTvs) tvs
|
|
| 975 | + |
|
| 976 | + noKindSigTvs = noKindSigTyVars ty
|
|
| 973 | 977 | |
| 974 | 978 | -- Figure out what the type variable order would be inferred in the
|
| 975 | 979 | -- absence of an explicit forall
|
| 976 | - tvs' = orderedFVs (mkVarSet vs) (ctx ++ [tau])
|
|
| 980 | + tvs' = orderedFVs boundTvs (ctx ++ [tau])
|
|
| 977 | 981 | in case s of
|
| 978 | - DeleteTopLevelQuantification -> synifyType ImplicitizeForAll (tvs' ++ vs) tau
|
|
| 982 | + DeleteTopLevelQuantification -> synifyType ImplicitizeForAll (extendVarSetList boundTvs tvs') tau
|
|
| 979 | 983 | -- Put a forall in if there are any type variables
|
| 980 | 984 | WithinType
|
| 981 | 985 | | not (null tvs) -> noLocA sTy
|
| 982 | 986 | | otherwise -> noLocA sPhi
|
| 983 | - ImplicitizeForAll -> implicitForAll [] vs tvs ctx (synifyType WithinType) tau
|
|
| 987 | + ImplicitizeForAll -> implicitForAll boundTvs tvs ctx (synifyType WithinType) tau
|
|
| 984 | 988 | |
| 985 | --- | Put a forall in if there are any type variables which require
|
|
| 986 | --- explicit kind annotations or if the inferred type variable order
|
|
| 987 | --- would be different.
|
|
| 989 | +-- | Use an explicit forall if there are any type variables which require
|
|
| 990 | +-- explicit kind annotations or if the inferred type variable quantification
|
|
| 991 | +-- order would be different.
|
|
| 988 | 992 | implicitForAll
|
| 989 | - :: [TyCon]
|
|
| 990 | - -- ^ type constructors that determine their args kinds
|
|
| 991 | - -> [TyVar]
|
|
| 992 | - -- ^ free variables in the type to convert
|
|
| 993 | + :: TyVarSet
|
|
| 994 | + -- ^ bound type variables (e.g. bound from an outer scope)
|
|
| 993 | 995 | -> [InvisTVBinder]
|
| 994 | 996 | -- ^ type variable binders in the forall
|
| 995 | 997 | -> ThetaType
|
| 996 | 998 | -- ^ constraints right after the forall
|
| 997 | - -> ([TyVar] -> Type -> LHsType GhcRn)
|
|
| 999 | + -> (TyVarSet -> Type -> LHsType GhcRn)
|
|
| 998 | 1000 | -- ^ how to convert the inner type
|
| 999 | 1001 | -> Type
|
| 1000 | 1002 | -- ^ inner type
|
| 1001 | 1003 | -> LHsType GhcRn
|
| 1002 | -implicitForAll tycons vs tvs ctx synInner tau
|
|
| 1003 | - | any (isHsKindedTyVar . unLoc) sTvs = noLocA sTy
|
|
| 1004 | - | tvs' /= (binderVars tvs) = noLocA sTy
|
|
| 1005 | - | otherwise = noLocA sPhi
|
|
| 1004 | +implicitForAll boundTvs tvbs ctx synInner tau
|
|
| 1005 | + | any (isHsKindedTyVar . unLoc) sTvs
|
|
| 1006 | + -- Explicit forall: some type variable needs an explicit kind annotation.
|
|
| 1007 | + = noLocA sTy
|
|
| 1008 | + | tvs /= inferredFreeTvs
|
|
| 1009 | + -- Explicit forall: the inferred quantification order would be different.
|
|
| 1010 | + = noLocA sTy
|
|
| 1011 | + | otherwise
|
|
| 1012 | + -- Implicit forall.
|
|
| 1013 | + = noLocA sPhi
|
|
| 1006 | 1014 | where
|
| 1007 | - sRho = synInner (tvs' ++ vs) tau
|
|
| 1015 | + tvs = binderVars tvbs
|
|
| 1016 | + sRho = synInner (extendVarSetList boundTvs inferredFreeTvs) tau
|
|
| 1008 | 1017 | sPhi
|
| 1009 | 1018 | | null ctx = unLoc sRho
|
| 1010 | 1019 | | otherwise =
|
| 1011 | 1020 | HsQualTy
|
| 1012 | 1021 | { hst_ctxt = synifyCtx ctx
|
| 1013 | 1022 | , hst_xqual = noExtField
|
| 1014 | - , hst_body = synInner (tvs' ++ vs) tau
|
|
| 1023 | + , hst_body = sRho
|
|
| 1015 | 1024 | }
|
| 1016 | 1025 | sTy =
|
| 1017 | 1026 | HsForAllTy
|
| ... | ... | @@ -1020,84 +1029,129 @@ implicitForAll tycons vs tvs ctx synInner tau |
| 1020 | 1029 | , hst_body = noLocA sPhi
|
| 1021 | 1030 | }
|
| 1022 | 1031 | |
| 1023 | - no_kinds_needed = noKindTyVars tycons tau
|
|
| 1024 | - sTvs = map (synifyTyVarBndr' no_kinds_needed) tvs
|
|
| 1032 | + no_kinds_needed = noKindSigTyVars tau
|
|
| 1033 | + sTvs = map (synifyTyVarBndr' no_kinds_needed) tvbs
|
|
| 1025 | 1034 | |
| 1026 | 1035 | -- Figure out what the type variable order would be inferred in the
|
| 1027 | 1036 | -- absence of an explicit forall
|
| 1028 | - tvs' = orderedFVs (mkVarSet vs) (ctx ++ [tau])
|
|
| 1037 | + inferredFreeTvs = orderedFVs boundTvs (ctx ++ [tau])
|
|
| 1029 | 1038 | |
| 1030 | --- | Find the set of type variables whose kind signatures can be properly
|
|
| 1031 | --- inferred just from their uses in the type signature. This means the type
|
|
| 1032 | --- variable to has at least one fully applied use @f x1 x2 ... xn@ where:
|
|
| 1039 | +-- | Returns a subset of the free type variables of the given type whose kinds
|
|
| 1040 | +-- can definitely be inferred from their occurrences in the type.
|
|
| 1033 | 1041 | --
|
| 1034 | --- * @f@ has a function kind where the arguments have the same kinds
|
|
| 1035 | --- as @x1 x2 ... xn@.
|
|
| 1042 | +-- This function is only a simple heuristic, which is used in order to avoid
|
|
| 1043 | +-- needlessly cluttering Haddocks with explicit foralls that are not needed.
|
|
| 1044 | +-- This function may return some type variables for which we aren't sure
|
|
| 1045 | +-- (which will cause us to display the type with an explicit forall, just in
|
|
| 1046 | +-- case).
|
|
| 1036 | 1047 | --
|
| 1037 | --- * @f@ has a function kind whose final return has lifted type kind
|
|
| 1038 | -noKindTyVars
|
|
| 1039 | - :: [TyCon]
|
|
| 1040 | - -- ^ type constructors that determine their args kinds
|
|
| 1041 | - -> Type
|
|
| 1048 | +-- In the future, we hope to address the issue of whether to print a type with
|
|
| 1049 | +-- an explicit forall by storing whether the user wrote the type with an
|
|
| 1050 | +-- explicit forall in the first place (see GHC ticket #26271).
|
|
| 1051 | +noKindSigTyVars
|
|
| 1052 | + :: Type
|
|
| 1042 | 1053 | -- ^ type to inspect
|
| 1043 | 1054 | -> VarSet
|
| 1044 | - -- ^ set of variables whose kinds can be inferred from uses in the type
|
|
| 1045 | -noKindTyVars _ (TyVarTy var)
|
|
| 1046 | - | isLiftedTypeKind (tyVarKind var) = unitVarSet var
|
|
| 1047 | -noKindTyVars ts ty
|
|
| 1048 | - | (f, xs) <- splitAppTys ty
|
|
| 1049 | - , not (null xs) =
|
|
| 1050 | - let args = map (noKindTyVars ts) xs
|
|
| 1051 | - func = case f of
|
|
| 1052 | - TyVarTy var
|
|
| 1053 | - | (xsKinds, outKind) <- splitFunTys (tyVarKind var)
|
|
| 1054 | - , map scaledThing xsKinds `eqTypes` map typeKind xs
|
|
| 1055 | - , isLiftedTypeKind outKind ->
|
|
| 1056 | - unitVarSet var
|
|
| 1057 | - TyConApp t ks
|
|
| 1058 | - | t `elem` ts
|
|
| 1059 | - , all noFreeVarsOfType ks ->
|
|
| 1060 | - mkVarSet [v | TyVarTy v <- xs]
|
|
| 1061 | - _ -> noKindTyVars ts f
|
|
| 1062 | - in unionVarSets (func : args)
|
|
| 1063 | -noKindTyVars ts (ForAllTy _ t) = noKindTyVars ts t
|
|
| 1064 | -noKindTyVars ts (FunTy _ w t1 t2) =
|
|
| 1065 | - noKindTyVars ts w
|
|
| 1066 | - `unionVarSet` noKindTyVars ts t1
|
|
| 1067 | - `unionVarSet` noKindTyVars ts t2
|
|
| 1068 | -noKindTyVars ts (CastTy t _) = noKindTyVars ts t
|
|
| 1069 | -noKindTyVars _ _ = emptyVarSet
|
|
| 1070 | - |
|
| 1071 | -synifyMultArrow :: [TyVar] -> Mult -> HsMultAnn GhcRn
|
|
| 1072 | -synifyMultArrow vs t = case t of
|
|
| 1055 | + -- ^ set of variables whose kinds can definitely be inferred from occurrences in the type
|
|
| 1056 | +noKindSigTyVars ty
|
|
| 1057 | + | Just ty' <- coreView ty
|
|
| 1058 | + = noKindSigTyVars ty'
|
|
| 1059 | + -- In a TyConApp 'T ty_1 ... ty_n', if 'ty_i = tv' is a type variable and the
|
|
| 1060 | + -- i-th argument of the kind of 'T' is monomorphic, then the kind of 'tv'
|
|
| 1061 | + -- is fully determined by its occurrence in the TyConApp.
|
|
| 1062 | + | Just (tc, args) <- splitTyConApp_maybe ty
|
|
| 1063 | + , let (tcArgBndrs, _tcResKi) = splitPiTys (tyConKind tc)
|
|
| 1064 | + tcArgKis = map (\case { Named (Bndr b _) -> tyVarKind b; Anon (Scaled _ t) _ -> t}) tcArgBndrs
|
|
| 1065 | + = mono_tvs tcArgKis args `unionVarSet` (mapUnionVarSet noKindSigTyVars args)
|
|
| 1066 | + -- If we have 'f ty_1 ... ty_n' where 'f :: ki_1 -> ... -> ki_n -> Type'
|
|
| 1067 | + -- then we can infer the kind of 'f' from the kinds of its arguments.
|
|
| 1068 | + --
|
|
| 1069 | + -- This special case handles common examples involving functors, monads...
|
|
| 1070 | + -- with type signatures such as '(a -> b) -> (f a -> f b)'.
|
|
| 1071 | + | (TyVarTy fun, args) <- splitAppTys ty
|
|
| 1072 | + , not (null args)
|
|
| 1073 | + , (funArgKinds, funResKind) <- splitFunTys (tyVarKind fun)
|
|
| 1074 | + , map scaledThing funArgKinds `eqTypes` map typeKind args
|
|
| 1075 | + , isLiftedTypeKind funResKind
|
|
| 1076 | + = ( `extendVarSet` fun ) $ mapUnionVarSet noKindSigTyVars args
|
|
| 1077 | + where
|
|
| 1078 | + mono_tvs :: [Type] -> [Type] -> VarSet
|
|
| 1079 | + mono_tvs (tcArgKi:tcArgKis) (arg:args)
|
|
| 1080 | + | TyVarTy arg_tv <- arg
|
|
| 1081 | + , noFreeVarsOfType tcArgKi
|
|
| 1082 | + = ( `extendVarSet` arg_tv ) $ mono_tvs tcArgKis args
|
|
| 1083 | + | otherwise
|
|
| 1084 | + = mono_tvs tcArgKis args
|
|
| 1085 | + mono_tvs _ _ = emptyVarSet
|
|
| 1086 | +noKindSigTyVars (ForAllTy _ t) = noKindSigTyVars t
|
|
| 1087 | +noKindSigTyVars (CastTy t _) = noKindSigTyVars t
|
|
| 1088 | +noKindSigTyVars _ = emptyVarSet
|
|
| 1089 | + |
|
| 1090 | +synifyMultArrow :: TyVarSet -> Mult -> HsMultAnn GhcRn
|
|
| 1091 | +synifyMultArrow boundTvs t = case t of
|
|
| 1073 | 1092 | OneTy -> HsLinearAnn noExtField
|
| 1074 | 1093 | ManyTy -> HsUnannotated noExtField
|
| 1075 | - ty -> HsExplicitMult noExtField (synifyType WithinType vs ty)
|
|
| 1094 | + ty -> HsExplicitMult noExtField (synifyType WithinType boundTvs ty)
|
|
| 1076 | 1095 | |
| 1077 | -synifyMultRec :: [TyVar] -> Mult -> HsMultAnn GhcRn
|
|
| 1078 | -synifyMultRec vs t = case t of
|
|
| 1096 | +synifyMultRec :: TyVarSet -> Mult -> HsMultAnn GhcRn
|
|
| 1097 | +synifyMultRec boundTvs t = case t of
|
|
| 1079 | 1098 | OneTy -> HsUnannotated noExtField
|
| 1080 | - ty -> HsExplicitMult noExtField (synifyType WithinType vs ty)
|
|
| 1099 | + ty -> HsExplicitMult noExtField (synifyType WithinType boundTvs ty)
|
|
| 1081 | 1100 | |
| 1082 | 1101 | synifyPatSynType :: PatSyn -> LHsType GhcRn
|
| 1083 | 1102 | synifyPatSynType ps =
|
| 1084 | - let (univ_tvs, req_theta, ex_tvs, prov_theta, arg_tys, res_ty) = patSynSigBndr ps
|
|
| 1085 | - ts = maybeToList (tyConAppTyCon_maybe res_ty)
|
|
| 1103 | + let (univ_tvbs, req_theta, ex_tvbs, prov_theta, arg_tys, res_ty) = patSynSigBndr ps
|
|
| 1104 | + |
|
| 1105 | +{- Recall that pattern synonyms have both "required" and "provided" constraints,
|
|
| 1106 | +e.g.
|
|
| 1107 | + |
|
| 1108 | + pattern P :: forall a b c. req => forall e f g => prov => arg_ty1 -> ... -> res_ty
|
|
| 1109 | + |
|
| 1110 | +Here:
|
|
| 1111 | + |
|
| 1112 | + a, b, c are universal type variables
|
|
| 1113 | + req are required constraints
|
|
| 1086 | 1114 | |
| 1087 | - -- HACK: a HsQualTy with theta = [unitTy] will be printed as "() =>",
|
|
| 1088 | - -- i.e., an explicit empty context, which is what we need. This is not
|
|
| 1089 | - -- possible by taking theta = [], as that will print no context at all
|
|
| 1115 | + e, f, g are existential type variables
|
|
| 1116 | + prov are provided constraints
|
|
| 1117 | + |
|
| 1118 | +The first pair comes from the outside, while the second pair is obtained upon
|
|
| 1119 | +a successful match on the pattern.
|
|
| 1120 | + |
|
| 1121 | +Remarks:
|
|
| 1122 | + |
|
| 1123 | + 1. Both foralls are optional.
|
|
| 1124 | + |
|
| 1125 | + 2. If there is only one =>, we interpret the constraints as required.
|
|
| 1126 | + Thus, if we want an empty set of required constraints and a non-empty set
|
|
| 1127 | + of provided constraints, the type signature must be written like
|
|
| 1128 | + |
|
| 1129 | + () => prov => res_ty
|
|
| 1130 | +-}
|
|
| 1131 | + |
|
| 1132 | + |
|
| 1133 | + -- Add an explicit "() => ..." when req_theta is empty but there are
|
|
| 1134 | + -- existential variables or provided constraints.
|
|
| 1090 | 1135 | req_theta'
|
| 1091 | 1136 | | null req_theta
|
| 1092 | - , not (null prov_theta && null ex_tvs) =
|
|
| 1137 | + , not (null prov_theta && null ex_tvbs) =
|
|
| 1093 | 1138 | [unitTy]
|
| 1094 | 1139 | | otherwise = req_theta
|
| 1140 | + univ_tvs = mkVarSet $ binderVars univ_tvbs
|
|
| 1141 | + ex_tvs = mkVarSet $ binderVars ex_tvbs
|
|
| 1142 | + |
|
| 1143 | + |
|
| 1095 | 1144 | in implicitForAll
|
| 1096 | - ts
|
|
| 1097 | - []
|
|
| 1098 | - (univ_tvs ++ ex_tvs)
|
|
| 1145 | + ex_tvs -- consider the ex_tvs non-free, so that we don't quantify over them here
|
|
| 1146 | + univ_tvbs -- quantify only over the universals
|
|
| 1099 | 1147 | req_theta'
|
| 1100 | - (\vs -> implicitForAll ts vs [] prov_theta (synifyType WithinType))
|
|
| 1148 | + ( \_ ->
|
|
| 1149 | + implicitForAll
|
|
| 1150 | + univ_tvs -- the univ_tvs are already bound
|
|
| 1151 | + ex_tvbs -- quantify only over the existentials
|
|
| 1152 | + prov_theta
|
|
| 1153 | + (synifyType WithinType)
|
|
| 1154 | + )
|
|
| 1101 | 1155 | (mkScaledFunTys arg_tys res_ty)
|
| 1102 | 1156 | |
| 1103 | 1157 | synifyTyLit :: TyLit -> HsTyLit GhcRn
|
| ... | ... | @@ -1106,7 +1160,7 @@ synifyTyLit (StrTyLit s) = HsStrTy NoSourceText s |
| 1106 | 1160 | synifyTyLit (CharTyLit c) = HsCharTy NoSourceText c
|
| 1107 | 1161 | |
| 1108 | 1162 | synifyKindSig :: Kind -> LHsKind GhcRn
|
| 1109 | -synifyKindSig k = synifyType WithinType [] k
|
|
| 1163 | +synifyKindSig k = synifyType WithinType emptyVarSet k
|
|
| 1110 | 1164 | |
| 1111 | 1165 | stripKindSig :: LHsType GhcRn -> LHsType GhcRn
|
| 1112 | 1166 | stripKindSig (L _ (HsKindSig _ t _)) = t
|
| ... | ... | @@ -1119,7 +1173,7 @@ synifyInstHead (vs, preds, cls, types) associated_families = |
| 1119 | 1173 | , ihdTypes = map unLoc annot_ts
|
| 1120 | 1174 | , ihdInstType =
|
| 1121 | 1175 | ClassInst
|
| 1122 | - { clsiCtx = map (unLoc . synifyType WithinType []) preds
|
|
| 1176 | + { clsiCtx = map (unLoc . synifyType WithinType emptyVarSet) preds
|
|
| 1123 | 1177 | , clsiTyVars = synifyTyVars (tyConVisibleTyVars cls_tycon)
|
| 1124 | 1178 | , clsiSigs = map synifyClsIdSig $ specialized_class_methods
|
| 1125 | 1179 | , clsiAssocTys =
|
| ... | ... | @@ -1132,7 +1186,7 @@ synifyInstHead (vs, preds, cls, types) associated_families = |
| 1132 | 1186 | where
|
| 1133 | 1187 | cls_tycon = classTyCon cls
|
| 1134 | 1188 | ts = filterOutInvisibleTypes cls_tycon types
|
| 1135 | - ts' = map (synifyType WithinType vs) ts
|
|
| 1189 | + ts' = map (synifyType WithinType $ mkVarSet vs) ts
|
|
| 1136 | 1190 | annot_ts = zipWith3 annotHsType args_poly ts ts'
|
| 1137 | 1191 | args_poly = tyConArgsPolyKinded cls_tycon
|
| 1138 | 1192 | synifyClsIdSig = synifyIdSig ShowRuntimeRep DeleteTopLevelQuantification vs
|
| ... | ... | @@ -1151,7 +1205,7 @@ synifyFamInst fi opaque = do |
| 1151 | 1205 | where
|
| 1152 | 1206 | ityp SynFamilyInst | opaque = return $ TypeInst Nothing
|
| 1153 | 1207 | ityp SynFamilyInst =
|
| 1154 | - return . TypeInst . Just . unLoc $ synifyType WithinType [] fam_rhs
|
|
| 1208 | + return . TypeInst . Just . unLoc $ synifyType WithinType emptyVarSet fam_rhs
|
|
| 1155 | 1209 | ityp (DataFamilyInst c) =
|
| 1156 | 1210 | DataInst <$> synifyTyCon HideRuntimeRep (Just $ famInstAxiom fi) c
|
| 1157 | 1211 | fam_tc = famInstTyCon fi
|
| ... | ... | @@ -1173,7 +1227,7 @@ synifyFamInst fi opaque = do |
| 1173 | 1227 | fam_lhs
|
| 1174 | 1228 | |
| 1175 | 1229 | ts = filterOutInvisibleTypes fam_tc eta_expanded_lhs
|
| 1176 | - synifyTypes = map (synifyType WithinType [])
|
|
| 1230 | + synifyTypes = map (synifyType WithinType emptyVarSet)
|
|
| 1177 | 1231 | ts' = synifyTypes ts
|
| 1178 | 1232 | annot_ts = zipWith3 annotHsType args_poly ts ts'
|
| 1179 | 1233 | args_poly = tyConArgsPolyKinded fam_tc
|
| ... | ... | @@ -333,9 +333,12 @@ lHsQTyVarsToTypes tvs = |
| 333 | 333 | [ HsValArg noExtField $ noLocA (case hsLTyVarName tv of
|
| 334 | 334 | Nothing -> HsWildCardTy noExtField
|
| 335 | 335 | Just nm -> HsTyVar noAnn NotPromoted (noLocA $ noUserRdr nm))
|
| 336 | - | tv <- hsQTvExplicit tvs
|
|
| 336 | + | tv <- hsq_explicit tvs
|
|
| 337 | 337 | ]
|
| 338 | 338 | |
| 339 | +hsQTvExplicitBinders :: LHsQTyVars DocNameI -> [LHsTyVarBndr (HsBndrVis DocNameI) DocNameI]
|
|
| 340 | +hsQTvExplicitBinders = hsq_explicit
|
|
| 341 | + |
|
| 339 | 342 | --------------------------------------------------------------------------------
|
| 340 | 343 | |
| 341 | 344 | -- * Making abstract declarations
|
| ... | ... | @@ -853,8 +856,8 @@ tyCoFVsOfType' (TyConApp _ tys) a b c = tyCoFVsOfTypes' tys a b c |
| 853 | 856 | tyCoFVsOfType' (LitTy{}) a b c = emptyFV a b c
|
| 854 | 857 | tyCoFVsOfType' (AppTy fun arg) a b c = (tyCoFVsOfType' arg `unionFV` tyCoFVsOfType' fun) a b c
|
| 855 | 858 | tyCoFVsOfType' (FunTy _ w arg res) a b c =
|
| 856 | - ( tyCoFVsOfType' w
|
|
| 857 | - `unionFV` tyCoFVsOfType' res
|
|
| 859 | + ( tyCoFVsOfType' res
|
|
| 860 | + `unionFV` tyCoFVsOfType' w
|
|
| 858 | 861 | `unionFV` tyCoFVsOfType' arg
|
| 859 | 862 | )
|
| 860 | 863 | a
|
| ... | ... | @@ -99,11 +99,7 @@ |
| 99 | 99 | >mkT</a
|
| 100 | 100 | > :: <span class="keyword"
|
| 101 | 101 | >forall</span
|
| 102 | - > {k} {f :: <span class="keyword"
|
|
| 103 | - >forall</span
|
|
| 104 | - > k1. k1 -> <a href="#" title="Data.Kind"
|
|
| 105 | - >Type</a
|
|
| 106 | - >} {a :: k}. f a -> <a href="#" title="Bug1050"
|
|
| 102 | + > {k} {f} {a :: k}. f a -> <a href="#" title="Bug1050"
|
|
| 107 | 103 | >T</a
|
| 108 | 104 | > f a <a href="#" class="selflink"
|
| 109 | 105 | >#</a
|
| ... | ... | @@ -64,11 +64,7 @@ |
| 64 | 64 | ><li class="src short"
|
| 65 | 65 | ><a href="#"
|
| 66 | 66 | >poly</a
|
| 67 | - > :: <span class="keyword"
|
|
| 68 | - >forall</span
|
|
| 69 | - > a (m :: <a href="#" title="GHC.Exts"
|
|
| 70 | - >Multiplicity</a
|
|
| 71 | - >) b. a %m -> b</li
|
|
| 67 | + > :: a %m -> b</li
|
|
| 72 | 68 | ><li class="src short"
|
| 73 | 69 | ><span class="keyword"
|
| 74 | 70 | >data</span
|
| ... | ... | @@ -163,11 +159,7 @@ |
| 163 | 159 | ><p class="src"
|
| 164 | 160 | ><a id="v:poly" class="def"
|
| 165 | 161 | >poly</a
|
| 166 | - > :: <span class="keyword"
|
|
| 167 | - >forall</span
|
|
| 168 | - > a (m :: <a href="#" title="GHC.Exts"
|
|
| 169 | - >Multiplicity</a
|
|
| 170 | - >) b. a %m -> b <a href="#" class="selflink"
|
|
| 162 | + > :: a %m -> b <a href="#" class="selflink"
|
|
| 171 | 163 | >#</a
|
| 172 | 164 | ></p
|
| 173 | 165 | ><div class="doc"
|
| ... | ... | @@ -132,7 +132,9 @@ |
| 132 | 132 | >pattern</span
|
| 133 | 133 | > <a href="#"
|
| 134 | 134 | >E</a
|
| 135 | - > :: a <a href="#" title="PatternSyns"
|
|
| 135 | + > :: <span class="keyword"
|
|
| 136 | + >forall</span
|
|
| 137 | + > {k} {a} {b :: k}. a <a href="#" title="PatternSyns"
|
|
| 136 | 138 | >><</a
|
| 137 | 139 | > b</li
|
| 138 | 140 | ><li class="src short"
|
| ... | ... | @@ -335,7 +337,9 @@ |
| 335 | 337 | >pattern</span
|
| 336 | 338 | > <a id="v:E" class="def"
|
| 337 | 339 | >E</a
|
| 338 | - > :: a <a href="#" title="PatternSyns"
|
|
| 340 | + > :: <span class="keyword"
|
|
| 341 | + >forall</span
|
|
| 342 | + > {k} {a} {b :: k}. a <a href="#" title="PatternSyns"
|
|
| 339 | 343 | >><</a
|
| 340 | 344 | > b <a href="#" class="selflink"
|
| 341 | 345 | >#</a
|
| 1 | +<html xmlns="http://www.w3.org/1999/xhtml"
|
|
| 2 | +><head
|
|
| 3 | + ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
|
|
| 4 | + /><meta name="viewport" content="width=device-width, initial-scale=1"
|
|
| 5 | + /><title
|
|
| 6 | + >PatternSyns2</title
|
|
| 7 | + ><link href="#" rel="stylesheet" type="text/css" title="Linuwial"
|
|
| 8 | + /><link rel="stylesheet" type="text/css" href="#"
|
|
| 9 | + /><link rel="stylesheet" type="text/css" href="#"
|
|
| 10 | + /><script src="haddock-bundle.min.js" async="async" type="text/javascript"
|
|
| 11 | + ></script
|
|
| 12 | + ><script type="text/x-mathjax-config"
|
|
| 13 | + >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script
|
|
| 14 | + ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"
|
|
| 15 | + ></script
|
|
| 16 | + ></head
|
|
| 17 | + ><body
|
|
| 18 | + ><div id="package-header"
|
|
| 19 | + ><span class="caption empty"
|
|
| 20 | + > </span
|
|
| 21 | + ><ul class="links" id="page-menu"
|
|
| 22 | + ><li
|
|
| 23 | + ><a href="#"
|
|
| 24 | + >Contents</a
|
|
| 25 | + ></li
|
|
| 26 | + ><li
|
|
| 27 | + ><a href="#"
|
|
| 28 | + >Index</a
|
|
| 29 | + ></li
|
|
| 30 | + ></ul
|
|
| 31 | + ></div
|
|
| 32 | + ><div id="content"
|
|
| 33 | + ><div id="module-header"
|
|
| 34 | + ><table class="info"
|
|
| 35 | + ><tr
|
|
| 36 | + ><th
|
|
| 37 | + >Safe Haskell</th
|
|
| 38 | + ><td
|
|
| 39 | + >None</td
|
|
| 40 | + ></tr
|
|
| 41 | + ><tr
|
|
| 42 | + ><th
|
|
| 43 | + >Language</th
|
|
| 44 | + ><td
|
|
| 45 | + >Haskell2010</td
|
|
| 46 | + ></tr
|
|
| 47 | + ></table
|
|
| 48 | + ><p class="caption"
|
|
| 49 | + >PatternSyns2</p
|
|
| 50 | + ></div
|
|
| 51 | + ><div id="interface"
|
|
| 52 | + ><h1
|
|
| 53 | + >Documentation</h1
|
|
| 54 | + ><div class="top"
|
|
| 55 | + ><p class="src"
|
|
| 56 | + ><span class="keyword"
|
|
| 57 | + >pattern</span
|
|
| 58 | + > <a id="v:P1" class="def"
|
|
| 59 | + >P1</a
|
|
| 60 | + > :: () => <a href="#" title="Prelude"
|
|
| 61 | + >Num</a
|
|
| 62 | + > a => a -> D <a href="#" title="Prelude"
|
|
| 63 | + >Num</a
|
|
| 64 | + > a <a href="#" class="selflink"
|
|
| 65 | + >#</a
|
|
| 66 | + ></p
|
|
| 67 | + ></div
|
|
| 68 | + ><div class="top"
|
|
| 69 | + ><p class="src"
|
|
| 70 | + ><span class="keyword"
|
|
| 71 | + >pattern</span
|
|
| 72 | + > <a id="v:P2" class="def"
|
|
| 73 | + >P2</a
|
|
| 74 | + > :: <a href="#" title="Prelude"
|
|
| 75 | + >Num</a
|
|
| 76 | + > a => a -> a <a href="#" class="selflink"
|
|
| 77 | + >#</a
|
|
| 78 | + ></p
|
|
| 79 | + ></div
|
|
| 80 | + ><div class="top"
|
|
| 81 | + ><p class="src"
|
|
| 82 | + ><span class="keyword"
|
|
| 83 | + >pattern</span
|
|
| 84 | + > <a id="v:P3" class="def"
|
|
| 85 | + >P3</a
|
|
| 86 | + > :: () => <span class="keyword"
|
|
| 87 | + >forall</span
|
|
| 88 | + > (e :: <a href="#" title="GHC.Exts"
|
|
| 89 | + >TYPE</a
|
|
| 90 | + > '<a href="#" title="GHC.Exts"
|
|
| 91 | + >DoubleRep</a
|
|
| 92 | + >). <span class="breakable"
|
|
| 93 | + >(<span class="unbreakable"
|
|
| 94 | + >PCIR a</span
|
|
| 95 | + >, <span class="unbreakable"
|
|
| 96 | + >PCDR e</span
|
|
| 97 | + >)</span
|
|
| 98 | + > => a -> e -> Q a <a href="#" class="selflink"
|
|
| 99 | + >#</a
|
|
| 100 | + ></p
|
|
| 101 | + ></div
|
|
| 102 | + ><div class="top"
|
|
| 103 | + ><p class="src"
|
|
| 104 | + ><span class="keyword"
|
|
| 105 | + >pattern</span
|
|
| 106 | + > <a id="v:P4" class="def"
|
|
| 107 | + >P4</a
|
|
| 108 | + > :: RCIR a => <span class="keyword"
|
|
| 109 | + >forall</span
|
|
| 110 | + > (e :: <a href="#" title="GHC.Exts"
|
|
| 111 | + >TYPE</a
|
|
| 112 | + > '<a href="#" title="GHC.Exts"
|
|
| 113 | + >DoubleRep</a
|
|
| 114 | + >). <span class="breakable"
|
|
| 115 | + >(<span class="unbreakable"
|
|
| 116 | + >PCIR a</span
|
|
| 117 | + >, <span class="unbreakable"
|
|
| 118 | + >PCDR e</span
|
|
| 119 | + >)</span
|
|
| 120 | + > => a -> e -> Q a <a href="#" class="selflink"
|
|
| 121 | + >#</a
|
|
| 122 | + ></p
|
|
| 123 | + ></div
|
|
| 124 | + ><div class="top"
|
|
| 125 | + ><p class="src"
|
|
| 126 | + ><span class="keyword"
|
|
| 127 | + >pattern</span
|
|
| 128 | + > <a id="v:P5" class="def"
|
|
| 129 | + >P5</a
|
|
| 130 | + > :: RCIR a => <span class="keyword"
|
|
| 131 | + >forall</span
|
|
| 132 | + > (e :: <a href="#" title="GHC.Exts"
|
|
| 133 | + >TYPE</a
|
|
| 134 | + > '<a href="#" title="GHC.Exts"
|
|
| 135 | + >DoubleRep</a
|
|
| 136 | + >). a -> e -> Q a <a href="#" class="selflink"
|
|
| 137 | + >#</a
|
|
| 138 | + ></p
|
|
| 139 | + ></div
|
|
| 140 | + ><div class="top"
|
|
| 141 | + ><p class="src"
|
|
| 142 | + ><span class="keyword"
|
|
| 143 | + >pattern</span
|
|
| 144 | + > <a id="v:P" class="def"
|
|
| 145 | + >P</a
|
|
| 146 | + > :: () => <span class="keyword"
|
|
| 147 | + >forall</span
|
|
| 148 | + > k (a :: k) b. <a href="#" title="Prelude"
|
|
| 149 | + >Show</a
|
|
| 150 | + > b => <a href="#" title="Data.Proxy"
|
|
| 151 | + >Proxy</a
|
|
| 152 | + > a -> b -> A <a href="#" class="selflink"
|
|
| 153 | + >#</a
|
|
| 154 | + ></p
|
|
| 155 | + ></div
|
|
| 156 | + ></div
|
|
| 157 | + ></div
|
|
| 158 | + ></body
|
|
| 159 | + ></html
|
|
| 160 | +> |
| ... | ... | @@ -185,17 +185,7 @@ |
| 185 | 185 | ><p class="src"
|
| 186 | 186 | ><a id="v:biO" class="def"
|
| 187 | 187 | >biO</a
|
| 188 | - > :: <span class="keyword"
|
|
| 189 | - >forall</span
|
|
| 190 | - > (g :: <a href="#" title="Data.Kind"
|
|
| 191 | - >Type</a
|
|
| 192 | - > -> <a href="#" title="Data.Kind"
|
|
| 193 | - >Type</a
|
|
| 194 | - >) (f :: <a href="#" title="Data.Kind"
|
|
| 195 | - >Type</a
|
|
| 196 | - > -> <a href="#" title="Data.Kind"
|
|
| 197 | - >Type</a
|
|
| 198 | - >) a. <a href="#" title="TypeOperators"
|
|
| 188 | + > :: <a href="#" title="TypeOperators"
|
|
| 199 | 189 | >O</a
|
| 200 | 190 | > g f a <a href="#" class="selflink"
|
| 201 | 191 | >#</a
|
| 1 | +{-# LANGUAGE Haskell2010 #-}
|
|
| 2 | + |
|
| 3 | +{-# LANGUAGE DataKinds #-}
|
|
| 4 | +{-# LANGUAGE GADTs #-}
|
|
| 5 | +{-# LANGUAGE PatternSynonyms #-}
|
|
| 6 | +{-# LANGUAGE PolyKinds #-}
|
|
| 7 | +{-# LANGUAGE ScopedTypeVariables #-}
|
|
| 8 | +{-# LANGUAGE StandaloneKindSignatures #-}
|
|
| 9 | + |
|
| 10 | +module PatternSyns2
|
|
| 11 | + ( pattern P1, pattern P2, pattern P3, pattern P4, pattern P5
|
|
| 12 | + , pattern P
|
|
| 13 | + )
|
|
| 14 | + where
|
|
| 15 | + |
|
| 16 | +import Data.Kind
|
|
| 17 | +import Data.Proxy
|
|
| 18 | +import GHC.Exts
|
|
| 19 | + |
|
| 20 | +type D :: ( Type -> Constraint ) -> Type -> Type
|
|
| 21 | +data D c a where
|
|
| 22 | + MkD :: c a => a -> D c a
|
|
| 23 | + |
|
| 24 | +pattern P1 :: () => Num a => a -> D Num a
|
|
| 25 | +pattern P1 a = MkD a
|
|
| 26 | + |
|
| 27 | +pattern P2 :: Num a => () => a -> a
|
|
| 28 | +pattern P2 a = a
|
|
| 29 | + |
|
| 30 | +type RCIR :: TYPE IntRep -> Constraint
|
|
| 31 | +class RCIR a where
|
|
| 32 | + |
|
| 33 | +type PCIR :: TYPE IntRep -> Constraint
|
|
| 34 | +class PCIR a where
|
|
| 35 | + |
|
| 36 | +type PCDR :: TYPE DoubleRep -> Constraint
|
|
| 37 | +class PCDR a where
|
|
| 38 | + |
|
| 39 | +type Q :: TYPE IntRep -> Type
|
|
| 40 | +data Q a where
|
|
| 41 | + MkQ :: forall ( a :: TYPE IntRep ) ( e :: TYPE DoubleRep )
|
|
| 42 | + . ( PCIR a, PCDR e )
|
|
| 43 | + => a -> e -> Q a
|
|
| 44 | + |
|
| 45 | +pattern P3 :: forall (a :: TYPE IntRep). () => forall (e :: TYPE DoubleRep). (PCIR a, PCDR e) => a -> e -> Q a
|
|
| 46 | +pattern P3 a e = MkQ a e
|
|
| 47 | + |
|
| 48 | +pattern P4 :: forall (a :: TYPE IntRep). (RCIR a) => forall (e :: TYPE DoubleRep). (PCIR a, PCDR e) => a -> e -> Q a
|
|
| 49 | +pattern P4 a e = MkQ a e
|
|
| 50 | + |
|
| 51 | +pattern P5 :: forall (a :: TYPE IntRep). (RCIR a) => forall (e :: TYPE DoubleRep). () => a -> e -> Q a
|
|
| 52 | +pattern P5 a e <- MkQ a e
|
|
| 53 | + |
|
| 54 | + |
|
| 55 | +type A :: Type
|
|
| 56 | +data A where
|
|
| 57 | + MkA :: forall k (a ::k) b. ( Show b ) => Proxy a -> b -> A
|
|
| 58 | + |
|
| 59 | +pattern P :: forall . () => forall k (a :: k) b. ( Show b ) => Proxy a -> b -> A
|
|
| 60 | +pattern P a b = MkA a b |
| ... | ... | @@ -24,7 +24,7 @@ Does something linear.\par} |
| 24 | 24 | \end{haddockdesc}
|
| 25 | 25 | \begin{haddockdesc}
|
| 26 | 26 | \item[\begin{tabular}{@{}l}
|
| 27 | -poly :: forall a (m :: Multiplicity) b. a {\char '45}m -> b
|
|
| 27 | +poly :: a {\char '45}m -> b
|
|
| 28 | 28 | \end{tabular}]
|
| 29 | 29 | {\haddockbegindoc
|
| 30 | 30 | Does something polymorphic.\par}
|