Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
15 changed files:
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Solver/Equality.hs
- compiler/GHC/Tc/Solver/Monad.hs
- compiler/GHC/Tc/Types/Constraint.hs
- compiler/GHC/Tc/Utils/Unify.hs
- testsuite/tests/rep-poly/RepPolyTuple4.stderr
- testsuite/tests/rep-poly/T19709b.stderr
- testsuite/tests/rep-poly/T23903.stderr
- testsuite/tests/simplCore/should_compile/simpl017.stderr
- + testsuite/tests/typecheck/should_compile/T26030.hs
- testsuite/tests/typecheck/should_compile/all.T
- + testsuite/tests/typecheck/should_fail/T25950.hs
- + testsuite/tests/typecheck/should_fail/T25950.stderr
- testsuite/tests/typecheck/should_fail/all.T
Changes:
| ... | ... | @@ -4043,9 +4043,13 @@ pprTcSolverReportMsg _ (FixedRuntimeRepError frr_origs) = |
| 4043 | 4043 | Nothing -> empty
|
| 4044 | 4044 | Just o -> other_context o
|
| 4045 | 4045 | , case mb_not_conc of
|
| 4046 | - Nothing -> empty
|
|
| 4047 | - Just (conc_tv, not_conc) ->
|
|
| 4048 | - unsolved_concrete_eq_explanation conc_tv not_conc ]
|
|
| 4046 | + Just (conc_tv, not_conc)
|
|
| 4047 | + | conc_tv `elemVarSet` tyCoVarsOfType ty
|
|
| 4048 | + -- Only show this message if 'conc_tv' appears somewhere
|
|
| 4049 | + -- in the type, otherwise it's not helpful.
|
|
| 4050 | + -> unsolved_concrete_eq_explanation conc_tv not_conc
|
|
| 4051 | + _ -> empty
|
|
| 4052 | + ]
|
|
| 4049 | 4053 | |
| 4050 | 4054 | -- Don't print out the type (only the kind), if the type includes
|
| 4051 | 4055 | -- a confusing cast, unless the user passed -fprint-explicit-coercions.
|
| ... | ... | @@ -2066,18 +2066,22 @@ qlUnify ty1 ty2 |
| 2066 | 2066 | = go_flexi1 kappa ty2
|
| 2067 | 2067 | |
| 2068 | 2068 | go_flexi1 kappa ty2 -- ty2 is zonked
|
| 2069 | - | -- See Note [QuickLook unification] (UQL1)
|
|
| 2070 | - simpleUnifyCheck UC_QuickLook kappa ty2
|
|
| 2071 | - = do { co <- unifyKind (Just (TypeThing ty2)) ty2_kind kappa_kind
|
|
| 2072 | - -- unifyKind: see (UQL2) in Note [QuickLook unification]
|
|
| 2073 | - -- and (MIV2) in Note [Monomorphise instantiation variables]
|
|
| 2074 | - ; let ty2' = mkCastTy ty2 co
|
|
| 2075 | - ; traceTc "qlUnify:update" $
|
|
| 2076 | - ppr kappa <+> text ":=" <+> ppr ty2
|
|
| 2077 | - ; liftZonkM $ writeMetaTyVar kappa ty2' }
|
|
| 2078 | - |
|
| 2079 | - | otherwise
|
|
| 2080 | - = return () -- Occurs-check or forall-bound variable
|
|
| 2069 | + = do { cur_lvl <- getTcLevel
|
|
| 2070 | + -- See Note [Unification preconditions], (UNTOUCHABLE) wrinkles
|
|
| 2071 | + -- Here we are in the TcM monad, which does not track enclosing
|
|
| 2072 | + -- Given equalities; so for quick-look unification we conservatively
|
|
| 2073 | + -- treat /any/ level outside this one as untouchable. Hence cur_lvl.
|
|
| 2074 | + ; case simpleUnifyCheck UC_QuickLook cur_lvl kappa ty2 of
|
|
| 2075 | + SUC_CanUnify ->
|
|
| 2076 | + do { co <- unifyKind (Just (TypeThing ty2)) ty2_kind kappa_kind
|
|
| 2077 | + -- unifyKind: see (UQL2) in Note [QuickLook unification]
|
|
| 2078 | + -- and (MIV2) in Note [Monomorphise instantiation variables]
|
|
| 2079 | + ; let ty2' = mkCastTy ty2 co
|
|
| 2080 | + ; traceTc "qlUnify:update" $
|
|
| 2081 | + ppr kappa <+> text ":=" <+> ppr ty2
|
|
| 2082 | + ; liftZonkM $ writeMetaTyVar kappa ty2' }
|
|
| 2083 | + _ -> return () -- e.g. occurs-check or forall-bound variable
|
|
| 2084 | + }
|
|
| 2081 | 2085 | where
|
| 2082 | 2086 | kappa_kind = tyVarKind kappa
|
| 2083 | 2087 | ty2_kind = typeKind ty2
|
| 1 | 1 | {-# LANGUAGE CPP #-}
|
| 2 | 2 | {-# LANGUAGE DuplicateRecordFields #-}
|
| 3 | +{-# LANGUAGE LambdaCase #-}
|
|
| 3 | 4 | {-# LANGUAGE MultiWayIf #-}
|
| 4 | 5 | |
| 5 | 6 | module GHC.Tc.Solver.Equality(
|
| ... | ... | @@ -1888,81 +1889,102 @@ canEqCanLHSFinish_try_unification ev eq_rel swapped lhs rhs |
| 1888 | 1889 | | CtWanted wev <- ev -- See Note [Do not unify Givens]
|
| 1889 | 1890 | , NomEq <- eq_rel -- See Note [Do not unify representational equalities]
|
| 1890 | 1891 | , wantedCtHasNoRewriters wev -- See Note [Unify only if the rewriter set is empty]
|
| 1891 | - , TyVarLHS tv <- lhs
|
|
| 1892 | - = do { given_eq_lvl <- getInnermostGivenEqLevel
|
|
| 1893 | - ; if not (touchabilityAndShapeTest given_eq_lvl tv rhs)
|
|
| 1894 | - then if | Just can_rhs <- canTyFamEqLHS_maybe rhs
|
|
| 1895 | - -> swapAndFinish ev eq_rel swapped (mkTyVarTy tv) can_rhs
|
|
| 1896 | - -- See Note [Orienting TyVarLHS/TyFamLHS]
|
|
| 1897 | - |
|
| 1898 | - | otherwise
|
|
| 1899 | - -> canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs
|
|
| 1900 | - else
|
|
| 1901 | - |
|
| 1902 | - -- We have a touchable unification variable on the left
|
|
| 1903 | - do { check_result <- checkTouchableTyVarEq ev tv rhs
|
|
| 1904 | - ; case check_result of {
|
|
| 1905 | - PuFail reason
|
|
| 1892 | + , TyVarLHS lhs_tv <- lhs
|
|
| 1893 | + = do { given_eq_lvl <- getInnermostGivenEqLevel
|
|
| 1894 | + ; case simpleUnifyCheck UC_Solver given_eq_lvl lhs_tv rhs of
|
|
| 1895 | + SUC_CanUnify ->
|
|
| 1896 | + unify lhs_tv (mkReflRedn Nominal rhs)
|
|
| 1897 | + SUC_CannotUnify
|
|
| 1906 | 1898 | | Just can_rhs <- canTyFamEqLHS_maybe rhs
|
| 1907 | - -> swapAndFinish ev eq_rel swapped (mkTyVarTy tv) can_rhs
|
|
| 1908 | - -- Swap back: see Note [Orienting TyVarLHS/TyFamLHS]
|
|
| 1909 | - |
|
| 1910 | - | reason `cterHasOnlyProblems` do_not_prevent_rewriting
|
|
| 1911 | - -> canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs
|
|
| 1912 | - |
|
| 1899 | + -> swap_and_finish lhs_tv can_rhs -- See Note [Orienting TyVarLHS/TyFamLHS]
|
|
| 1913 | 1900 | | otherwise
|
| 1914 | - -> tryIrredInstead reason ev eq_rel swapped lhs rhs ;
|
|
| 1915 | - |
|
| 1916 | - PuOK _ rhs_redn ->
|
|
| 1917 | - |
|
| 1918 | - -- Success: we can solve by unification
|
|
| 1919 | - do { -- In the common case where rhs_redn is Refl, we don't need to rewrite
|
|
| 1920 | - -- the evidence, even if swapped=IsSwapped. Suppose the original was
|
|
| 1921 | - -- [W] co : Int ~ alpha
|
|
| 1922 | - -- We unify alpha := Int, and set co := <Int>. No need to
|
|
| 1923 | - -- swap to co = sym co'
|
|
| 1924 | - -- co' = <Int>
|
|
| 1925 | - new_ev <- if isReflCo (reductionCoercion rhs_redn)
|
|
| 1926 | - then return ev
|
|
| 1927 | - else rewriteEqEvidence emptyRewriterSet ev swapped
|
|
| 1928 | - (mkReflRedn Nominal (mkTyVarTy tv)) rhs_redn
|
|
| 1929 | - |
|
| 1930 | - ; let tv_ty = mkTyVarTy tv
|
|
| 1931 | - final_rhs = reductionReducedType rhs_redn
|
|
| 1932 | - |
|
| 1933 | - ; traceTcS "Sneaky unification:" $
|
|
| 1934 | - vcat [text "Unifies:" <+> ppr tv <+> text ":=" <+> ppr final_rhs,
|
|
| 1935 | - text "Coercion:" <+> pprEq tv_ty final_rhs,
|
|
| 1936 | - text "Left Kind is:" <+> ppr (typeKind tv_ty),
|
|
| 1937 | - text "Right Kind is:" <+> ppr (typeKind final_rhs) ]
|
|
| 1938 | - |
|
| 1939 | - -- Update the unification variable itself
|
|
| 1940 | - ; unifyTyVar tv final_rhs
|
|
| 1941 | - |
|
| 1942 | - -- Provide Refl evidence for the constraint
|
|
| 1943 | - -- Ignore 'swapped' because it's Refl!
|
|
| 1944 | - ; setEvBindIfWanted new_ev EvCanonical $
|
|
| 1945 | - evCoercion (mkNomReflCo final_rhs)
|
|
| 1946 | - |
|
| 1947 | - -- Kick out any constraints that can now be rewritten
|
|
| 1948 | - ; kickOutAfterUnification [tv]
|
|
| 1949 | - |
|
| 1950 | - ; return (Stop new_ev (text "Solved by unification")) }}}}
|
|
| 1951 | - |
|
| 1901 | + -> finish_no_unify
|
|
| 1902 | + SUC_NotSure ->
|
|
| 1903 | + -- We have a touchable unification variable on the left,
|
|
| 1904 | + -- and the top-shape check succeeded. These are both guaranteed
|
|
| 1905 | + -- by the fact that simpleUnifyCheck did not return SUC_CannotUnify.
|
|
| 1906 | + do { let flags = unifyingLHSMetaTyVar_TEFTask ev lhs_tv
|
|
| 1907 | + ; check_result <- wrapTcS (checkTyEqRhs flags rhs)
|
|
| 1908 | + ; case check_result of
|
|
| 1909 | + PuOK cts rhs_redn ->
|
|
| 1910 | + do { emitWork cts
|
|
| 1911 | + ; unify lhs_tv rhs_redn }
|
|
| 1912 | + PuFail reason
|
|
| 1913 | + | Just can_rhs <- canTyFamEqLHS_maybe rhs
|
|
| 1914 | + -> swap_and_finish lhs_tv can_rhs -- See Note [Orienting TyVarLHS/TyFamLHS]
|
|
| 1915 | + | reason `cterHasOnlyProblems` do_not_prevent_rewriting
|
|
| 1916 | + ->
|
|
| 1917 | + -- ContinueWith, to allow using this constraint for
|
|
| 1918 | + -- rewriting (e.g. alpha[2] ~ beta[3]).
|
|
| 1919 | + do { let role = eqRelRole eq_rel
|
|
| 1920 | + ; new_ev <- rewriteEqEvidence emptyRewriterSet ev swapped
|
|
| 1921 | + (mkReflRedn role (canEqLHSType lhs))
|
|
| 1922 | + (mkReflRedn role rhs)
|
|
| 1923 | + ; continueWith $ Right $
|
|
| 1924 | + EqCt { eq_ev = new_ev, eq_eq_rel = eq_rel
|
|
| 1925 | + , eq_lhs = lhs , eq_rhs = rhs }
|
|
| 1926 | + }
|
|
| 1927 | + | otherwise
|
|
| 1928 | + -> try_irred reason
|
|
| 1929 | + }
|
|
| 1930 | + }
|
|
| 1952 | 1931 | -- Otherwise unification is off the table
|
| 1953 | 1932 | | otherwise
|
| 1954 | - = canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs
|
|
| 1933 | + = finish_no_unify
|
|
| 1955 | 1934 | |
| 1956 | 1935 | where
|
| 1957 | - -- Some problems prevent /unification/ but not /rewriting/
|
|
| 1958 | - -- Skolem-escape: if we have [W] alpha[2] ~ Maybe b[3]
|
|
| 1959 | - -- we can't unify (skolem-escape); but it /is/ canonical,
|
|
| 1960 | - -- and hence we /can/ use it for rewriting
|
|
| 1961 | - -- Concrete-ness: alpha[conc] ~ b[sk]
|
|
| 1962 | - -- We can use it to rewrite; we still have to solve the original
|
|
| 1963 | - do_not_prevent_rewriting :: CheckTyEqResult
|
|
| 1964 | - do_not_prevent_rewriting = cteProblem cteSkolemEscape S.<>
|
|
| 1965 | - cteProblem cteConcrete
|
|
| 1936 | + -- We can't unify, but this equality can go in the inert set
|
|
| 1937 | + -- and be used to rewrite other constraints.
|
|
| 1938 | + finish_no_unify =
|
|
| 1939 | + canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs
|
|
| 1940 | + |
|
| 1941 | + -- We can't unify, and this equality should not be used to rewrite
|
|
| 1942 | + -- other constraints (e.g. because it has an occurs check).
|
|
| 1943 | + -- So add it to the inert Irreds.
|
|
| 1944 | + try_irred reason =
|
|
| 1945 | + tryIrredInstead reason ev eq_rel swapped lhs rhs
|
|
| 1946 | + |
|
| 1947 | + -- We can't unify as-is, and want to flip the equality around.
|
|
| 1948 | + -- Example: alpha ~ F tys, flip it around to become the canonical
|
|
| 1949 | + -- equality f tys ~ alpha.
|
|
| 1950 | + swap_and_finish tv can_rhs =
|
|
| 1951 | + swapAndFinish ev eq_rel swapped (mkTyVarTy tv) can_rhs
|
|
| 1952 | + |
|
| 1953 | + -- We can unify; go ahead and do so.
|
|
| 1954 | + unify tv rhs_redn =
|
|
| 1955 | + |
|
| 1956 | + do { -- In the common case where rhs_redn is Refl, we don't need to rewrite
|
|
| 1957 | + -- the evidence, even if swapped=IsSwapped. Suppose the original was
|
|
| 1958 | + -- [W] co : Int ~ alpha
|
|
| 1959 | + -- We unify alpha := Int, and set co := <Int>. No need to
|
|
| 1960 | + -- swap to co = sym co'
|
|
| 1961 | + -- co' = <Int>
|
|
| 1962 | + new_ev <- if isReflCo (reductionCoercion rhs_redn)
|
|
| 1963 | + then return ev
|
|
| 1964 | + else rewriteEqEvidence emptyRewriterSet ev swapped
|
|
| 1965 | + (mkReflRedn Nominal (mkTyVarTy tv)) rhs_redn
|
|
| 1966 | + |
|
| 1967 | + ; let tv_ty = mkTyVarTy tv
|
|
| 1968 | + final_rhs = reductionReducedType rhs_redn
|
|
| 1969 | + |
|
| 1970 | + ; traceTcS "Sneaky unification:" $
|
|
| 1971 | + vcat [text "Unifies:" <+> ppr tv <+> text ":=" <+> ppr final_rhs,
|
|
| 1972 | + text "Coercion:" <+> pprEq tv_ty final_rhs,
|
|
| 1973 | + text "Left Kind is:" <+> ppr (typeKind tv_ty),
|
|
| 1974 | + text "Right Kind is:" <+> ppr (typeKind final_rhs) ]
|
|
| 1975 | + |
|
| 1976 | + -- Update the unification variable itself
|
|
| 1977 | + ; unifyTyVar tv final_rhs
|
|
| 1978 | + |
|
| 1979 | + -- Provide Refl evidence for the constraint
|
|
| 1980 | + -- Ignore 'swapped' because it's Refl!
|
|
| 1981 | + ; setEvBindIfWanted new_ev EvCanonical $
|
|
| 1982 | + evCoercion (mkNomReflCo final_rhs)
|
|
| 1983 | + |
|
| 1984 | + -- Kick out any constraints that can now be rewritten
|
|
| 1985 | + ; kickOutAfterUnification [tv]
|
|
| 1986 | + |
|
| 1987 | + ; return (Stop new_ev (text "Solved by unification")) }
|
|
| 1966 | 1988 | |
| 1967 | 1989 | ---------------------------
|
| 1968 | 1990 | -- Unification is off the table
|
| ... | ... | @@ -1989,6 +2011,17 @@ canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs |
| 1989 | 2011 | -- -> swapAndFinish ev eq_rel swapped lhs_ty can_rhs
|
| 1990 | 2012 | -- | otherwise
|
| 1991 | 2013 | |
| 2014 | + | reason `cterHasOnlyProblems` do_not_prevent_rewriting
|
|
| 2015 | + -> do { let role = eqRelRole eq_rel
|
|
| 2016 | + ; new_ev <- rewriteEqEvidence emptyRewriterSet ev swapped
|
|
| 2017 | + (mkReflRedn role (canEqLHSType lhs))
|
|
| 2018 | + (mkReflRedn role rhs)
|
|
| 2019 | + ; continueWith $ Right $
|
|
| 2020 | + EqCt { eq_ev = new_ev, eq_eq_rel = eq_rel
|
|
| 2021 | + , eq_lhs = lhs , eq_rhs = rhs }
|
|
| 2022 | + }
|
|
| 2023 | + |
|
| 2024 | + | otherwise
|
|
| 1992 | 2025 | -> tryIrredInstead reason ev eq_rel swapped lhs rhs
|
| 1993 | 2026 | |
| 1994 | 2027 | PuOK _ rhs_redn
|
| ... | ... | @@ -2005,6 +2038,18 @@ canEqCanLHSFinish_no_unification ev eq_rel swapped lhs rhs |
| 2005 | 2038 | , eq_lhs = lhs
|
| 2006 | 2039 | , eq_rhs = reductionReducedType rhs_redn } } }
|
| 2007 | 2040 | |
| 2041 | +-- | Some problems prevent /unification/ but not /rewriting/:
|
|
| 2042 | +--
|
|
| 2043 | +-- Skolem-escape: if we have [W] alpha[2] ~ Maybe b[3]
|
|
| 2044 | +-- we can't unify (skolem-escape); but it /is/ canonical,
|
|
| 2045 | +-- and hence we /can/ use it for rewriting
|
|
| 2046 | +--
|
|
| 2047 | +-- Concrete-ness: alpha[conc] ~ b[sk]
|
|
| 2048 | +-- We can use it to rewrite; we still have to solve the original
|
|
| 2049 | +do_not_prevent_rewriting :: CheckTyEqResult
|
|
| 2050 | +do_not_prevent_rewriting = cteProblem cteSkolemEscape S.<>
|
|
| 2051 | + cteProblem cteConcrete
|
|
| 2052 | + |
|
| 2008 | 2053 | ----------------------
|
| 2009 | 2054 | swapAndFinish :: CtEvidence -> EqRel -> SwapFlag
|
| 2010 | 2055 | -> TcType -> CanEqLHS -- ty ~ F tys
|
| ... | ... | @@ -2297,8 +2342,9 @@ and we turn this into |
| 2297 | 2342 | [W] Arg alpha ~ cbv1
|
| 2298 | 2343 | [W] Res alpha ~ cbv2
|
| 2299 | 2344 | |
| 2300 | -where cbv1 and cbv2 are fresh TauTvs. This is actually done by `break_wanted`
|
|
| 2301 | -in `GHC.Tc.Solver.Monad.checkTouchableTyVarEq`.
|
|
| 2345 | +where cbv1 and cbv2 are fresh TauTvs. This is actually done within checkTyEqRhs,
|
|
| 2346 | +called within canEqCanLHSFinish_try_unification, which will use the BreakWanted
|
|
| 2347 | +FamAppBreaker.
|
|
| 2302 | 2348 | |
| 2303 | 2349 | Why TauTvs? See [Why TauTvs] below.
|
| 2304 | 2350 | |
| ... | ... | @@ -2307,7 +2353,7 @@ directly instead of calling wrapUnifierTcS. (Otherwise, we'd end up |
| 2307 | 2353 | unifying cbv1 and cbv2 immediately, achieving nothing.) Next, we
|
| 2308 | 2354 | unify alpha := cbv1 -> cbv2, having eliminated the occurs check. This
|
| 2309 | 2355 | unification happens immediately following a successful call to
|
| 2310 | -checkTouchableTyVarEq, in canEqCanLHSFinish_try_unification.
|
|
| 2356 | +checkTyEqRhs, in canEqCanLHSFinish_try_unification.
|
|
| 2311 | 2357 | |
| 2312 | 2358 | Now, we're here (including further context from our original example,
|
| 2313 | 2359 | from the top of the Note):
|
| ... | ... | @@ -129,7 +129,7 @@ module GHC.Tc.Solver.Monad ( |
| 129 | 129 | pprEq,
|
| 130 | 130 | |
| 131 | 131 | -- Enforcing invariants for type equalities
|
| 132 | - checkTypeEq, checkTouchableTyVarEq
|
|
| 132 | + checkTypeEq
|
|
| 133 | 133 | ) where
|
| 134 | 134 | |
| 135 | 135 | import GHC.Prelude
|
| ... | ... | @@ -228,8 +228,6 @@ import GHC.Data.Graph.Directed |
| 228 | 228 | import qualified Data.Set as Set
|
| 229 | 229 | import GHC.Unit.Module.Graph
|
| 230 | 230 | |
| 231 | -import GHC.Data.Maybe
|
|
| 232 | - |
|
| 233 | 231 | {- *********************************************************************
|
| 234 | 232 | * *
|
| 235 | 233 | SolverStage and StopOrContinue
|
| ... | ... | @@ -2416,81 +2414,31 @@ wrapUnifierX ev role do_unifications |
| 2416 | 2414 | ************************************************************************
|
| 2417 | 2415 | -}
|
| 2418 | 2416 | |
| 2419 | -checkTouchableTyVarEq
|
|
| 2420 | - :: CtEvidence
|
|
| 2421 | - -> TcTyVar -- A touchable meta-tyvar
|
|
| 2422 | - -> TcType -- The RHS
|
|
| 2423 | - -> TcS (PuResult () Reduction)
|
|
| 2424 | --- Used for Nominal, Wanted equalities, with a touchable meta-tyvar on LHS
|
|
| 2425 | --- If checkTouchableTyVarEq tv ty = PuOK cts redn
|
|
| 2426 | --- then we can unify
|
|
| 2427 | --- tv := ty |> redn
|
|
| 2428 | --- with extra wanteds 'cts'
|
|
| 2429 | --- If it returns (PuFail reason) we can't unify, and the reason explains why.
|
|
| 2430 | -checkTouchableTyVarEq ev lhs_tv rhs
|
|
| 2431 | - | simpleUnifyCheck UC_Solver lhs_tv rhs -- An (optional) short-cut
|
|
| 2432 | - = do { traceTcS "checkTouchableTyVarEq: simple-check wins" (ppr lhs_tv $$ ppr rhs)
|
|
| 2433 | - ; return (pure (mkReflRedn Nominal rhs)) }
|
|
| 2434 | - |
|
| 2435 | - | otherwise
|
|
| 2436 | - = do { traceTcS "checkTouchableTyVarEq {" (ppr lhs_tv $$ ppr rhs)
|
|
| 2437 | - ; check_result <- wrapTcS (check_rhs rhs)
|
|
| 2438 | - ; traceTcS "checkTouchableTyVarEq }" (ppr lhs_tv $$ ppr check_result)
|
|
| 2439 | - ; case check_result of
|
|
| 2440 | - PuFail reason -> return (PuFail reason)
|
|
| 2441 | - PuOK cts redn -> do { emitWork cts
|
|
| 2442 | - ; return (pure redn) } }
|
|
| 2443 | - |
|
| 2444 | - where
|
|
| 2445 | - lhs_tv_info = metaTyVarInfo lhs_tv -- lhs_tv should be a meta-tyvar
|
|
| 2446 | - |
|
| 2447 | - is_concrete_lhs_tv = isJust $ concreteInfo_maybe lhs_tv_info
|
|
| 2448 | - |
|
| 2449 | - check_rhs rhs
|
|
| 2450 | - -- Crucial special case for alpha ~ F tys
|
|
| 2451 | - -- We don't want to flatten that (F tys)!
|
|
| 2452 | - | Just (TyFamLHS tc tys) <- canTyFamEqLHS_maybe rhs
|
|
| 2453 | - = if is_concrete_lhs_tv
|
|
| 2454 | - then return $ PuFail (cteProblem cteConcrete)
|
|
| 2455 | - else recurseIntoFamTyConApp flags tc tys
|
|
| 2456 | - | otherwise
|
|
| 2457 | - = checkTyEqRhs flags rhs
|
|
| 2458 | - |
|
| 2459 | - flags = unifyingLHSMetaTyVar_TEFTask ev lhs_tv
|
|
| 2460 | - |
|
| 2461 | -------------------------
|
|
| 2462 | 2417 | checkTypeEq :: CtEvidence -> EqRel -> CanEqLHS -> TcType
|
| 2463 | 2418 | -> TcS (PuResult () Reduction)
|
| 2464 | 2419 | -- Used for general CanEqLHSs, ones that do
|
| 2465 | 2420 | -- not have a touchable type variable on the LHS (i.e. not unifying)
|
| 2466 | -checkTypeEq ev eq_rel lhs rhs
|
|
| 2467 | - | isGiven ev
|
|
| 2468 | - = do { traceTcS "checkTypeEq {" (vcat [ text "lhs:" <+> ppr lhs
|
|
| 2469 | - , text "rhs:" <+> ppr rhs ])
|
|
| 2470 | - ; check_result <- wrapTcS (check_given_rhs rhs)
|
|
| 2471 | - ; traceTcS "checkTypeEq }" (ppr check_result)
|
|
| 2472 | - ; case check_result of
|
|
| 2473 | - PuFail reason -> return (PuFail reason)
|
|
| 2474 | - PuOK prs redn -> do { new_givens <- mapBagM mk_new_given prs
|
|
| 2475 | - ; emitWork new_givens
|
|
| 2476 | - ; updInertSet (addCycleBreakerBindings prs)
|
|
| 2477 | - ; return (pure redn) } }
|
|
| 2478 | - |
|
| 2479 | - | otherwise -- Wanted
|
|
| 2480 | - = do { check_result <- wrapTcS (checkTyEqRhs wanted_flags rhs)
|
|
| 2481 | - ; case check_result of
|
|
| 2482 | - PuFail reason -> return (PuFail reason)
|
|
| 2483 | - PuOK cts redn -> do { emitWork cts
|
|
| 2484 | - ; return (pure redn) } }
|
|
| 2421 | +checkTypeEq ev eq_rel lhs rhs =
|
|
| 2422 | + case ev of
|
|
| 2423 | + CtGiven {} ->
|
|
| 2424 | + do { traceTcS "checkTypeEq {" (vcat [ text "lhs:" <+> ppr lhs
|
|
| 2425 | + , text "rhs:" <+> ppr rhs ])
|
|
| 2426 | + ; check_result <- wrapTcS (checkTyEqRhs given_flags rhs)
|
|
| 2427 | + ; traceTcS "checkTypeEq }" (ppr check_result)
|
|
| 2428 | + ; case check_result of
|
|
| 2429 | + PuFail reason -> return (PuFail reason)
|
|
| 2430 | + PuOK prs redn -> do { new_givens <- mapBagM mk_new_given prs
|
|
| 2431 | + ; emitWork new_givens
|
|
| 2432 | + ; updInertSet (addCycleBreakerBindings prs)
|
|
| 2433 | + ; return (pure redn) } }
|
|
| 2434 | + CtWanted {} ->
|
|
| 2435 | + do { check_result <- wrapTcS (checkTyEqRhs wanted_flags rhs)
|
|
| 2436 | + ; case check_result of
|
|
| 2437 | + PuFail reason -> return (PuFail reason)
|
|
| 2438 | + PuOK cts redn -> do { emitWork cts
|
|
| 2439 | + ; return (pure redn) } }
|
|
| 2485 | 2440 | where
|
| 2486 | - check_given_rhs :: TcType -> TcM (PuResult (TcTyVar,TcType) Reduction)
|
|
| 2487 | - check_given_rhs rhs
|
|
| 2488 | - -- See Note [Special case for top-level of Given equality]
|
|
| 2489 | - | Just (TyFamLHS tc tys) <- canTyFamEqLHS_maybe rhs
|
|
| 2490 | - = recurseIntoFamTyConApp given_flags tc tys
|
|
| 2491 | - | otherwise
|
|
| 2492 | - = checkTyEqRhs given_flags rhs
|
|
| 2493 | - |
|
| 2441 | + wanted_flags :: TyEqFlags TcM Ct
|
|
| 2494 | 2442 | wanted_flags = notUnifying_TEFTask occ_prob lhs
|
| 2495 | 2443 | -- checkTypeEq deals only with the non-unifying case
|
| 2496 | 2444 | |
| ... | ... | @@ -2532,31 +2480,6 @@ restoreTyVarCycles is |
| 2532 | 2480 | (a ~R# b a) is soluble if b later turns out to be Identity
|
| 2533 | 2481 | So we treat this as a "soluble occurs check".
|
| 2534 | 2482 | |
| 2535 | -Note [Special case for top-level of Given equality]
|
|
| 2536 | -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 2537 | -We take care when examining
|
|
| 2538 | - [G] F ty ~ G (...(F ty)...)
|
|
| 2539 | -where both sides are TyFamLHSs. We don't want to flatten that RHS to
|
|
| 2540 | - [G] F ty ~ cbv
|
|
| 2541 | - [G] G (...(F ty)...) ~ cbv
|
|
| 2542 | -Instead we'd like to say "occurs-check" and swap LHS and RHS, which yields a
|
|
| 2543 | -canonical constraint
|
|
| 2544 | - [G] G (...(F ty)...) ~ F ty
|
|
| 2545 | -That tends to rewrite a big type to smaller one. This happens in T15703,
|
|
| 2546 | -where we had:
|
|
| 2547 | - [G] Pure g ~ From1 (To1 (Pure g))
|
|
| 2548 | -Making a loop breaker and rewriting left to right just makes much bigger
|
|
| 2549 | -types than swapping it over.
|
|
| 2550 | - |
|
| 2551 | -(We might hope to have swapped it over before getting to checkTypeEq,
|
|
| 2552 | -but better safe than sorry.)
|
|
| 2553 | - |
|
| 2554 | -NB: We never see a TyVarLHS here, such as
|
|
| 2555 | - [G] a ~ F tys here
|
|
| 2556 | -because we'd have swapped it to
|
|
| 2557 | - [G] F tys ~ a
|
|
| 2558 | -in canEqCanLHS2, before getting to checkTypeEq.
|
|
| 2559 | - |
|
| 2560 | 2483 | Note [Don't cycle-break Wanteds when not unifying]
|
| 2561 | 2484 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| 2562 | 2485 | Consdier
|
| ... | ... | @@ -279,10 +279,10 @@ We thus perform an occurs-check. There is, of course, some subtlety: |
| 279 | 279 | |
| 280 | 280 | * For type variables, the occurs-check looks deeply including kinds of
|
| 281 | 281 | type variables. This is because a CEqCan over a meta-variable is
|
| 282 | - also used to inform unification, in
|
|
| 283 | - GHC.Tc.Solver.Monad.checkTouchableTyVarEq. If the LHS appears
|
|
| 284 | - anywhere in the RHS, at all, unification will create an infinite
|
|
| 285 | - structure which is bad.
|
|
| 282 | + also used to inform unification, via `checkTyEqRhs`, called in
|
|
| 283 | + `canEqCanLHSFinish_try_unification`.
|
|
| 284 | + If the LHS appears anywhere in the RHS, at all, unification will create
|
|
| 285 | + an infinite structure, which is bad.
|
|
| 286 | 286 | |
| 287 | 287 | * For type family applications, the occurs-check is shallow; it looks
|
| 288 | 288 | only in places where we might rewrite. (Specifically, it does not
|
| ... | ... | @@ -29,7 +29,7 @@ module GHC.Tc.Utils.Unify ( |
| 29 | 29 | -- Various unifications
|
| 30 | 30 | unifyType, unifyKind, unifyInvisibleType, unifyExpectedType,
|
| 31 | 31 | unifyExprType, unifyTypeAndEmit, promoteTcType,
|
| 32 | - swapOverTyVars, touchabilityAndShapeTest, checkTopShape, lhsPriority,
|
|
| 32 | + swapOverTyVars, touchabilityTest, checkTopShape, lhsPriority,
|
|
| 33 | 33 | UnifyEnv(..), updUEnvLoc, setUEnvRole,
|
| 34 | 34 | uType,
|
| 35 | 35 | mightEqualLater,
|
| ... | ... | @@ -55,7 +55,7 @@ module GHC.Tc.Utils.Unify ( |
| 55 | 55 | TyEqFamApp(..), FamAppBreaker(..),
|
| 56 | 56 | checkPromoteFreeVars,
|
| 57 | 57 | |
| 58 | - simpleUnifyCheck, UnifyCheckCaller(..),
|
|
| 58 | + simpleUnifyCheck, UnifyCheckCaller(..), SimpleUnifyResult(..),
|
|
| 59 | 59 | |
| 60 | 60 | fillInferResult,
|
| 61 | 61 | ) where
|
| ... | ... | @@ -2482,10 +2482,9 @@ uUnfilledVar2 :: UnifyEnv -- Precondition: u_role==Nominal |
| 2482 | 2482 | uUnfilledVar2 env@(UE { u_defer = def_eq_ref }) swapped tv1 ty2
|
| 2483 | 2483 | = do { cur_lvl <- getTcLevel
|
| 2484 | 2484 | -- See Note [Unification preconditions], (UNTOUCHABLE) wrinkles
|
| 2485 | - -- Here we don't know about given equalities here; so we treat
|
|
| 2485 | + -- Here we don't know about given equalities; so we treat
|
|
| 2486 | 2486 | -- /any/ level outside this one as untouchable. Hence cur_lvl.
|
| 2487 | - ; if not (touchabilityAndShapeTest cur_lvl tv1 ty2
|
|
| 2488 | - && simpleUnifyCheck UC_OnTheFly tv1 ty2)
|
|
| 2487 | + ; if simpleUnifyCheck UC_OnTheFly cur_lvl tv1 ty2 /= SUC_CanUnify
|
|
| 2489 | 2488 | then not_ok_so_defer cur_lvl
|
| 2490 | 2489 | else
|
| 2491 | 2490 | do { def_eqs <- readTcRef def_eq_ref -- Capture current state of def_eqs
|
| ... | ... | @@ -2530,8 +2529,8 @@ uUnfilledVar2 env@(UE { u_defer = def_eq_ref }) swapped tv1 ty2 |
| 2530 | 2529 | do { traceTc "uUnfilledVar2 not ok" $
|
| 2531 | 2530 | vcat [ text "tv1:" <+> ppr tv1
|
| 2532 | 2531 | , text "ty2:" <+> ppr ty2
|
| 2533 | - , text "simple-unify-chk:" <+> ppr (simpleUnifyCheck UC_OnTheFly tv1 ty2)
|
|
| 2534 | - , text "touchability:" <+> ppr (touchabilityAndShapeTest cur_lvl tv1 ty2)]
|
|
| 2532 | + , text "simple-unify-chk:" <+> ppr (simpleUnifyCheck UC_OnTheFly cur_lvl tv1 ty2)
|
|
| 2533 | + ]
|
|
| 2535 | 2534 | -- Occurs check or an untouchable: just defer
|
| 2536 | 2535 | -- NB: occurs check isn't necessarily fatal:
|
| 2537 | 2536 | -- eg tv1 occurred in type family parameter
|
| ... | ... | @@ -2590,9 +2589,8 @@ lhsPriority tv |
| 2590 | 2589 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| 2591 | 2590 | Question: given a homogeneous equality (alpha ~# ty), when is it OK to
|
| 2592 | 2591 | unify alpha := ty?
|
| 2593 | - |
|
| 2594 | -This note only applied to /homogeneous/ equalities, in which both
|
|
| 2595 | -sides have the same kind.
|
|
| 2592 | +(This note only applies to /homogeneous/ equalities, in which both
|
|
| 2593 | +sides have the same kind.)
|
|
| 2596 | 2594 | |
| 2597 | 2595 | There are five reasons not to unify:
|
| 2598 | 2596 | |
| ... | ... | @@ -2688,7 +2686,7 @@ Needless to say, all there are wrinkles: |
| 2688 | 2686 | |
| 2689 | 2687 | * In the constraint solver, we track where Given equalities occur
|
| 2690 | 2688 | and use that to guard unification in
|
| 2691 | - GHC.Tc.Utils.Unify.touchabilityAndShapeTest. More details in
|
|
| 2689 | + GHC.Tc.Utils.Unify.touchabilityTest. More details in
|
|
| 2692 | 2690 | Note [Tracking Given equalities] in GHC.Tc.Solver.InertSet
|
| 2693 | 2691 | |
| 2694 | 2692 | Historical note: in the olden days (pre 2021) the constraint solver
|
| ... | ... | @@ -2929,12 +2927,34 @@ data UnifyCheckCaller |
| 2929 | 2927 | = UC_OnTheFly -- Called from the on-the-fly unifier
|
| 2930 | 2928 | | UC_QuickLook -- Called from Quick Look
|
| 2931 | 2929 | | UC_Solver -- Called from constraint solver
|
| 2932 | - | UC_Defaulting -- Called when doing top-level defaulting
|
|
| 2933 | 2930 | |
| 2934 | -simpleUnifyCheck :: UnifyCheckCaller -> TcTyVar -> TcType -> Bool
|
|
| 2935 | --- simpleUnifyCheck does a fast check: True <=> unification is OK
|
|
| 2936 | --- If it says 'False' then unification might still be OK, but
|
|
| 2937 | --- it'll take more work to do -- use the full checkTypeEq
|
|
| 2931 | +-- | The result type of 'simpleUnifyCheck'.
|
|
| 2932 | +data SimpleUnifyResult
|
|
| 2933 | + -- | Definitely cannot unify (untouchable variable or incompatible top-shape)
|
|
| 2934 | + = SUC_CannotUnify
|
|
| 2935 | + -- | The variable is touchable and the top-shape test passed, but
|
|
| 2936 | + -- it may or may not be OK to unify
|
|
| 2937 | + | SUC_NotSure
|
|
| 2938 | + -- | Definitely OK to unify
|
|
| 2939 | + | SUC_CanUnify
|
|
| 2940 | + deriving stock (Eq, Ord, Show)
|
|
| 2941 | +instance Semigroup SimpleUnifyResult where
|
|
| 2942 | + no@SUC_CannotUnify <> _ = no
|
|
| 2943 | + SUC_CanUnify <> r = r
|
|
| 2944 | + _ <> no@SUC_CannotUnify = no
|
|
| 2945 | + r <> SUC_CanUnify = r
|
|
| 2946 | + ns@SUC_NotSure <> SUC_NotSure = ns
|
|
| 2947 | + |
|
| 2948 | +instance Outputable SimpleUnifyResult where
|
|
| 2949 | + ppr = \case
|
|
| 2950 | + SUC_CannotUnify -> text "SUC_CannotUnify"
|
|
| 2951 | + SUC_NotSure -> text "SUC_NotSure"
|
|
| 2952 | + SUC_CanUnify -> text "SUC_CanUnify"
|
|
| 2953 | + |
|
| 2954 | +simpleUnifyCheck :: UnifyCheckCaller -> TcLevel -> TcTyVar -> TcType -> SimpleUnifyResult
|
|
| 2955 | +-- ^ A fast check for unification. May return "not sure", in which case
|
|
| 2956 | +-- unification might still be OK, but it'll take more work to do
|
|
| 2957 | +-- (use the full 'checkTypeEq').
|
|
| 2938 | 2958 | --
|
| 2939 | 2959 | -- * Rejects if lhs_tv occurs in rhs_ty (occurs check)
|
| 2940 | 2960 | -- * Rejects foralls unless
|
| ... | ... | @@ -2945,9 +2965,17 @@ simpleUnifyCheck :: UnifyCheckCaller -> TcTyVar -> TcType -> Bool |
| 2945 | 2965 | -- * Does a level-check for type variables, to avoid skolem escape
|
| 2946 | 2966 | --
|
| 2947 | 2967 | -- This function is pretty heavily used, so it's optimised not to allocate
|
| 2948 | -simpleUnifyCheck caller lhs_tv rhs
|
|
| 2949 | - = go rhs
|
|
| 2968 | +simpleUnifyCheck caller given_eq_lvl lhs_tv rhs
|
|
| 2969 | + | not $ touchabilityTest given_eq_lvl lhs_tv
|
|
| 2970 | + = SUC_CannotUnify
|
|
| 2971 | + | not $ checkTopShape lhs_info rhs
|
|
| 2972 | + = SUC_CannotUnify
|
|
| 2973 | + | rhs_is_ok rhs
|
|
| 2974 | + = SUC_CanUnify
|
|
| 2975 | + | otherwise
|
|
| 2976 | + = SUC_NotSure
|
|
| 2950 | 2977 | where
|
| 2978 | + lhs_info = metaTyVarInfo lhs_tv
|
|
| 2951 | 2979 | |
| 2952 | 2980 | !(occ_in_ty, occ_in_co) = mkOccFolders (tyVarName lhs_tv)
|
| 2953 | 2981 | |
| ... | ... | @@ -2967,33 +2995,32 @@ simpleUnifyCheck caller lhs_tv rhs |
| 2967 | 2995 | UC_Solver -> True
|
| 2968 | 2996 | UC_QuickLook -> True
|
| 2969 | 2997 | UC_OnTheFly -> False
|
| 2970 | - UC_Defaulting -> True
|
|
| 2971 | 2998 | |
| 2972 | - go (TyVarTy tv)
|
|
| 2999 | + rhs_is_ok (TyVarTy tv)
|
|
| 2973 | 3000 | | lhs_tv == tv = False
|
| 2974 | 3001 | | tcTyVarLevel tv `strictlyDeeperThan` lhs_tv_lvl = False
|
| 2975 | 3002 | | lhs_tv_is_concrete, not (isConcreteTyVar tv) = False
|
| 2976 | 3003 | | occ_in_ty $! (tyVarKind tv) = False
|
| 2977 | 3004 | | otherwise = True
|
| 2978 | 3005 | |
| 2979 | - go (FunTy {ft_af = af, ft_mult = w, ft_arg = a, ft_res = r})
|
|
| 3006 | + rhs_is_ok (FunTy {ft_af = af, ft_mult = w, ft_arg = a, ft_res = r})
|
|
| 2980 | 3007 | | not forall_ok, isInvisibleFunArg af = False
|
| 2981 | - | otherwise = go w && go a && go r
|
|
| 3008 | + | otherwise = rhs_is_ok w && rhs_is_ok a && rhs_is_ok r
|
|
| 2982 | 3009 | |
| 2983 | - go (TyConApp tc tys)
|
|
| 3010 | + rhs_is_ok (TyConApp tc tys)
|
|
| 2984 | 3011 | | lhs_tv_is_concrete, not (isConcreteTyCon tc) = False
|
| 2985 | 3012 | | not forall_ok, not (isTauTyCon tc) = False
|
| 2986 | 3013 | | not fam_ok, not (isFamFreeTyCon tc) = False
|
| 2987 | - | otherwise = all go tys
|
|
| 3014 | + | otherwise = all rhs_is_ok tys
|
|
| 2988 | 3015 | |
| 2989 | - go (ForAllTy (Bndr tv _) ty)
|
|
| 2990 | - | forall_ok = go (tyVarKind tv) && (tv == lhs_tv || go ty)
|
|
| 3016 | + rhs_is_ok (ForAllTy (Bndr tv _) ty)
|
|
| 3017 | + | forall_ok = rhs_is_ok (tyVarKind tv) && (tv == lhs_tv || rhs_is_ok ty)
|
|
| 2991 | 3018 | | otherwise = False
|
| 2992 | 3019 | |
| 2993 | - go (AppTy t1 t2) = go t1 && go t2
|
|
| 2994 | - go (CastTy ty co) = not (occ_in_co co) && go ty
|
|
| 2995 | - go (CoercionTy co) = not (occ_in_co co)
|
|
| 2996 | - go (LitTy {}) = True
|
|
| 3020 | + rhs_is_ok (AppTy t1 t2) = rhs_is_ok t1 && rhs_is_ok t2
|
|
| 3021 | + rhs_is_ok (CastTy ty co) = not (occ_in_co co) && rhs_is_ok ty
|
|
| 3022 | + rhs_is_ok (CoercionTy co) = not (occ_in_co co)
|
|
| 3023 | + rhs_is_ok (LitTy {}) = True
|
|
| 2997 | 3024 | |
| 2998 | 3025 | |
| 2999 | 3026 | mkOccFolders :: Name -> (TcType -> Bool, TcCoercion -> Bool)
|
| ... | ... | @@ -3078,8 +3105,13 @@ We must jolly well use that reductionReduced type, even though the |
| 3078 | 3105 | reductionCoercion is Refl. See `canEqCanLHSFinish_no_unification`.
|
| 3079 | 3106 | -}
|
| 3080 | 3107 | |
| 3081 | -data PuResult a b = PuFail CheckTyEqResult
|
|
| 3082 | - | PuOK (Bag a) b
|
|
| 3108 | +data PuResult a b
|
|
| 3109 | + -- | Pure unifier failure.
|
|
| 3110 | + --
|
|
| 3111 | + -- Invariant: the CheckTyEqResult is not 'cteOK'; that it, it specifies a problem.
|
|
| 3112 | + = PuFail CheckTyEqResult
|
|
| 3113 | + -- | Pure unifier success.
|
|
| 3114 | + | PuOK (Bag a) b
|
|
| 3083 | 3115 | deriving stock (Functor, Foldable, Traversable)
|
| 3084 | 3116 | |
| 3085 | 3117 | instance Applicative (PuResult a) where
|
| ... | ... | @@ -3414,15 +3446,15 @@ famAppBreaker (BreakWanted ev lhs_tv) fam_app |
| 3414 | 3446 | ; return (PuOK (singleCt (mkNonCanonical $ CtWanted new_ev))
|
| 3415 | 3447 | (mkReduction (HoleCo hole) new_tv_ty)) } }
|
| 3416 | 3448 | where
|
| 3449 | + fam_app_kind = typeKind fam_app
|
|
| 3417 | 3450 | (lhs_tv_info, lhs_tv_lvl) =
|
| 3418 | 3451 | case tcTyVarDetails lhs_tv of
|
| 3419 | 3452 | MetaTv { mtv_info = info, mtv_tclvl = lvl } -> (info,lvl)
|
| 3420 | 3453 | -- lhs_tv should be a meta-tyvar
|
| 3421 | - _ -> pprPanic "checkTouchableTyVarEq" (ppr lhs_tv)
|
|
| 3422 | - fam_app_kind = typeKind fam_app
|
|
| 3423 | - -- See Detail (7) of the Note
|
|
| 3454 | + _ -> pprPanic "famAppBreaker BreakWanted: lhs_tv is not a meta-tyvar"
|
|
| 3455 | + (ppr lhs_tv)
|
|
| 3424 | 3456 | cb_loc = updateCtLocOrigin (ctEvLoc ev) CycleBreakerOrigin
|
| 3425 | - |
|
| 3457 | + -- CycleBreakerOrigin: see Detail (7) of Note [Type equality cycles]
|
|
| 3426 | 3458 | |
| 3427 | 3459 | instance Outputable (TyEqFlags m a) where
|
| 3428 | 3460 | ppr = \case
|
| ... | ... | @@ -3492,12 +3524,95 @@ famAppArgFlags flags = case flags of |
| 3492 | 3524 | -> LC_Check { lc_lvlc = lvl, lc_lenient = False }
|
| 3493 | 3525 | lc -> lc
|
| 3494 | 3526 | |
| 3527 | +{- Note [checkTyEqRhs]
|
|
| 3528 | +~~~~~~~~~~~~~~~~~~~~~~
|
|
| 3529 | +The key function `checkTyEqRhs ty_eq_flags rhs` is called on the
|
|
| 3530 | +RHS of a type equality
|
|
| 3531 | + lhs ~ rhs
|
|
| 3532 | +and checks to see if `rhs` satisfies, or can be made to satisfy,
|
|
| 3533 | +invariants described by `ty_eq_flags`. It can succeded or fail; in
|
|
| 3534 | +the latter case it returns a `CheckTyEqResult` that describes why it
|
|
| 3535 | +failed.
|
|
| 3536 | + |
|
| 3537 | +When `lhs` is a touchable type variable, so unification might happen, then
|
|
| 3538 | +`checkTyEqRhs` enforces the unification preconditions of Note [Unification preconditions].
|
|
| 3539 | + |
|
| 3540 | +Notably, it can check for things like:
|
|
| 3541 | + * Insoluble occurs check
|
|
| 3542 | + e.g. alpha[tau] ~ [alpha]
|
|
| 3543 | + or F Int ~ [F Int]
|
|
| 3544 | + * Potentially-soluble occurs check
|
|
| 3545 | + e.g. alpha[tau] ~ [F alpha beta]
|
|
| 3546 | + * Impredicativity error:
|
|
| 3547 | + e.g. alpha[tau] ~ (forall a. a->a)
|
|
| 3548 | + * Skolem escape
|
|
| 3549 | + e.g alpha[1] ~ (b[sk:2], Int)
|
|
| 3550 | + * Concreteness error
|
|
| 3551 | + e.g. alpha[conc] ~ r[sk]
|
|
| 3552 | + |
|
| 3553 | +Its specific behaviour is governed by the `TyEqFlags` that are passed
|
|
| 3554 | +to it; see Note [TyEqFlags].
|
|
| 3555 | + |
|
| 3556 | +Note, however, that `checkTyEqRhs` specifically does /not/ check for:
|
|
| 3557 | + * Touchability of the LHS (in the case of a unification variable)
|
|
| 3558 | + * Shape of the LHS (e.g. we can't unify Int with a TyVarTv)
|
|
| 3559 | +These things are checked by `simpleUnifyCheck`.
|
|
| 3560 | +-}
|
|
| 3561 | + |
|
| 3562 | + |
|
| 3563 | +-- | Perform the checks specified by the 'TyEqFlags' on the RHS, in order to
|
|
| 3564 | +-- enforce the unification preconditions of Note [Unification preconditions].
|
|
| 3565 | +--
|
|
| 3566 | +-- See Note [checkTyEqRhs].
|
|
| 3495 | 3567 | checkTyEqRhs :: forall m a
|
| 3496 | 3568 | . Monad m
|
| 3497 | 3569 | => TyEqFlags m a
|
| 3498 | 3570 | -> TcType -- Already zonked
|
| 3499 | 3571 | -> m (PuResult a Reduction)
|
| 3500 | -checkTyEqRhs flags ty
|
|
| 3572 | +checkTyEqRhs flags rhs
|
|
| 3573 | + -- Crucial special case for a top-level equality of the form 'alpha ~ F tys'.
|
|
| 3574 | + -- We don't want to flatten that (F tys), as this gets us right back to where
|
|
| 3575 | + -- we started!
|
|
| 3576 | + --
|
|
| 3577 | + -- See also Note [Special case for top-level of Given equality]
|
|
| 3578 | + | Just (TyFamLHS tc tys) <- canTyFamEqLHS_maybe rhs
|
|
| 3579 | + , not $ tefConcrete flags
|
|
| 3580 | + = recurseIntoFamTyConApp flags tc tys
|
|
| 3581 | + | otherwise
|
|
| 3582 | + = check_ty_eq_rhs flags rhs
|
|
| 3583 | + |
|
| 3584 | +{- Note [Special case for top-level of Given equality]
|
|
| 3585 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 3586 | +We take care when examining
|
|
| 3587 | + [G] F ty ~ G (...(F ty)...)
|
|
| 3588 | +where both sides are TyFamLHSs. We don't want to flatten that RHS to
|
|
| 3589 | + [G] F ty ~ cbv
|
|
| 3590 | + [G] G (...(F ty)...) ~ cbv
|
|
| 3591 | +Instead we'd like to say "occurs-check" and swap LHS and RHS, which yields a
|
|
| 3592 | +canonical constraint
|
|
| 3593 | + [G] G (...(F ty)...) ~ F ty
|
|
| 3594 | +That tends to rewrite a big type to smaller one. This happens in T15703,
|
|
| 3595 | +where we had:
|
|
| 3596 | + [G] Pure g ~ From1 (To1 (Pure g))
|
|
| 3597 | +Making a loop breaker and rewriting left to right just makes much bigger
|
|
| 3598 | +types than swapping it over.
|
|
| 3599 | + |
|
| 3600 | +(We might hope to have swapped it over before getting to checkTypeEq,
|
|
| 3601 | +but better safe than sorry.)
|
|
| 3602 | + |
|
| 3603 | +NB: We never see a TyVarLHS here, such as
|
|
| 3604 | + [G] a ~ F tys here
|
|
| 3605 | +because we'd have swapped it to
|
|
| 3606 | + [G] F tys ~ a
|
|
| 3607 | +in canEqCanLHS2, before getting to checkTypeEq.
|
|
| 3608 | +-}
|
|
| 3609 | + |
|
| 3610 | +check_ty_eq_rhs :: forall m a
|
|
| 3611 | + . Monad m
|
|
| 3612 | + => TyEqFlags m a
|
|
| 3613 | + -> TcType -- Already zonked
|
|
| 3614 | + -> m (PuResult a Reduction)
|
|
| 3615 | +check_ty_eq_rhs flags ty
|
|
| 3501 | 3616 | = case ty of
|
| 3502 | 3617 | LitTy {} -> return $ okCheckRefl ty
|
| 3503 | 3618 | TyConApp tc tys -> checkTyConApp flags ty tc tys
|
| ... | ... | @@ -3510,16 +3625,16 @@ checkTyEqRhs flags ty |
| 3510 | 3625 | | isInvisibleFunArg af -- e.g. Num a => blah
|
| 3511 | 3626 | -> return $ PuFail impredicativeProblem -- Not allowed (TyEq:F)
|
| 3512 | 3627 | | otherwise
|
| 3513 | - -> do { w_res <- checkTyEqRhs flags w
|
|
| 3514 | - ; a_res <- checkTyEqRhs flags a
|
|
| 3515 | - ; r_res <- checkTyEqRhs flags r
|
|
| 3628 | + -> do { w_res <- check_ty_eq_rhs flags w
|
|
| 3629 | + ; a_res <- check_ty_eq_rhs flags a
|
|
| 3630 | + ; r_res <- check_ty_eq_rhs flags r
|
|
| 3516 | 3631 | ; return (mkFunRedn Nominal af <$> w_res <*> a_res <*> r_res) }
|
| 3517 | 3632 | |
| 3518 | - AppTy fun arg -> do { fun_res <- checkTyEqRhs flags fun
|
|
| 3519 | - ; arg_res <- checkTyEqRhs flags arg
|
|
| 3633 | + AppTy fun arg -> do { fun_res <- check_ty_eq_rhs flags fun
|
|
| 3634 | + ; arg_res <- check_ty_eq_rhs flags arg
|
|
| 3520 | 3635 | ; return (mkAppRedn <$> fun_res <*> arg_res) }
|
| 3521 | 3636 | |
| 3522 | - CastTy ty co -> do { ty_res <- checkTyEqRhs flags ty
|
|
| 3637 | + CastTy ty co -> do { ty_res <- check_ty_eq_rhs flags ty
|
|
| 3523 | 3638 | ; co_res <- checkCo flags co
|
| 3524 | 3639 | ; return (mkCastRedn1 Nominal ty <$> co_res <*> ty_res) }
|
| 3525 | 3640 | |
| ... | ... | @@ -3527,7 +3642,7 @@ checkTyEqRhs flags ty |
| 3527 | 3642 | ; return (mkReflCoRedn Nominal <$> co_res) }
|
| 3528 | 3643 | |
| 3529 | 3644 | ForAllTy {} -> return $ PuFail impredicativeProblem -- Not allowed (TyEq:F)
|
| 3530 | -{-# INLINEABLE checkTyEqRhs #-}
|
|
| 3645 | +{-# INLINEABLE check_ty_eq_rhs #-}
|
|
| 3531 | 3646 | |
| 3532 | 3647 | -------------------
|
| 3533 | 3648 | checkCo :: Monad m => TyEqFlags m a -> Coercion -> m (PuResult a Coercion)
|
| ... | ... | @@ -3702,14 +3817,14 @@ checkTyConApp flags tc_app tc tys |
| 3702 | 3817 | else do { let (fun_args, extra_args) = splitAt (tyConArity tc) tys
|
| 3703 | 3818 | fun_app = mkTyConApp tc fun_args
|
| 3704 | 3819 | ; fun_res <- checkFamApp flags fun_app tc fun_args
|
| 3705 | - ; extra_res <- mapCheck (checkTyEqRhs flags) extra_args
|
|
| 3820 | + ; extra_res <- mapCheck (check_ty_eq_rhs flags) extra_args
|
|
| 3706 | 3821 | ; return (mkAppRedns <$> fun_res <*> extra_res) }
|
| 3707 | 3822 | |
| 3708 | 3823 | | Just ty' <- rewriterView tc_app
|
| 3709 | 3824 | -- e.g. S a where type S a = F [a]
|
| 3710 | 3825 | -- or type S a = Int
|
| 3711 | 3826 | -- See Note [Forgetful synonyms in checkTyConApp]
|
| 3712 | - = checkTyEqRhs flags ty'
|
|
| 3827 | + = check_ty_eq_rhs flags ty'
|
|
| 3713 | 3828 | |
| 3714 | 3829 | | not (isTauTyCon tc)
|
| 3715 | 3830 | = return $ PuFail impredicativeProblem
|
| ... | ... | @@ -3727,7 +3842,7 @@ recurseIntoTyConApp :: Monad m |
| 3727 | 3842 | -> TyCon -> [TcType]
|
| 3728 | 3843 | -> m (PuResult a Reduction)
|
| 3729 | 3844 | recurseIntoTyConApp flags tc tys
|
| 3730 | - = do { tys_res <- mapCheck (checkTyEqRhs flags) tys
|
|
| 3845 | + = do { tys_res <- mapCheck (check_ty_eq_rhs flags) tys
|
|
| 3731 | 3846 | ; return (mkTyConAppRedn Nominal tc <$> tys_res) }
|
| 3732 | 3847 | |
| 3733 | 3848 | recurseIntoFamTyConApp :: Monad m
|
| ... | ... | @@ -3888,7 +4003,7 @@ checkTyVar flags occ_tv |
| 3888 | 4003 | -- unfilled meta-tyvar, we need to ensure that the kind of
|
| 3889 | 4004 | -- 'occ_tv' is concrete. Test cases: T23051, T23176.
|
| 3890 | 4005 | ; let occ_kind = tyVarKind occ_tv
|
| 3891 | - ; kind_result <- checkTyEqRhs flags occ_kind
|
|
| 4006 | + ; kind_result <- check_ty_eq_rhs flags occ_kind
|
|
| 3892 | 4007 | ; for kind_result $ \ kind_redn ->
|
| 3893 | 4008 | do { let kind_co = reductionCoercion kind_redn
|
| 3894 | 4009 | new_kind = reductionReducedType kind_redn
|
| ... | ... | @@ -4010,16 +4125,15 @@ promote_meta_tyvar info dest_lvl occ_tv |
| 4010 | 4125 | |
| 4011 | 4126 | |
| 4012 | 4127 | -------------------------
|
| 4013 | -touchabilityAndShapeTest :: TcLevel -> TcTyVar -> TcType -> Bool
|
|
| 4014 | --- This is the key test for untouchability:
|
|
| 4128 | +touchabilityTest :: TcLevel -> TcTyVar -> Bool
|
|
| 4129 | +-- ^ This is the key test for untouchability:
|
|
| 4015 | 4130 | -- See Note [Unification preconditions] in GHC.Tc.Utils.Unify
|
| 4016 | 4131 | -- and Note [Solve by unification] in GHC.Tc.Solver.Equality
|
| 4017 | --- True <=> touchability and shape are OK
|
|
| 4018 | -touchabilityAndShapeTest given_eq_lvl tv rhs
|
|
| 4019 | - | MetaTv { mtv_info = info, mtv_tclvl = tv_lvl } <- tcTyVarDetails tv
|
|
| 4020 | - , tv_lvl `deeperThanOrSame` given_eq_lvl
|
|
| 4021 | - , checkTopShape info rhs
|
|
| 4022 | - = True
|
|
| 4132 | +--
|
|
| 4133 | +-- @True@ <=> the variable is touchable
|
|
| 4134 | +touchabilityTest given_eq_lvl tv
|
|
| 4135 | + | MetaTv { mtv_tclvl = tv_lvl } <- tcTyVarDetails tv
|
|
| 4136 | + = tv_lvl `deeperThanOrSame` given_eq_lvl
|
|
| 4023 | 4137 | | otherwise
|
| 4024 | 4138 | = False
|
| 4025 | 4139 |
| ... | ... | @@ -6,8 +6,6 @@ RepPolyTuple4.hs:8:7: error: [GHC-55287] |
| 6 | 6 | When unifying:
|
| 7 | 7 | • a0 -> b0 -> (# a0, b0 #)
|
| 8 | 8 | • a -> a -> (# a, a #)
|
| 9 | - Cannot unify ‘r’ with the type variable ‘w1’
|
|
| 10 | - because the former is not a concrete ‘RuntimeRep’.
|
|
| 11 | 9 | • The second component of the unboxed tuple
|
| 12 | 10 | does not have a fixed runtime representation.
|
| 13 | 11 | Its type is:
|
| ... | ... | @@ -15,8 +13,6 @@ RepPolyTuple4.hs:8:7: error: [GHC-55287] |
| 15 | 13 | When unifying:
|
| 16 | 14 | • a0 -> b0 -> (# a0, b0 #)
|
| 17 | 15 | • a -> a -> (# a, a #)
|
| 18 | - Cannot unify ‘r’ with the type variable ‘w0’
|
|
| 19 | - because the former is not a concrete ‘RuntimeRep’.
|
|
| 20 | 16 | • In the expression: (#,#) @_ @_
|
| 21 | 17 | In an equation for ‘bar’: bar = (#,#) @_ @_
|
| 22 | 18 |
| ... | ... | @@ -2,11 +2,8 @@ T19709b.hs:11:15: error: [GHC-55287] |
| 2 | 2 | • The argument ‘(error @Any "e2")’ of ‘levfun’
|
| 3 | 3 | does not have a fixed runtime representation.
|
| 4 | 4 | Its type is:
|
| 5 | - a1 :: TYPE r0
|
|
| 6 | - When unifying:
|
|
| 7 | - • a0
|
|
| 8 | - • a1
|
|
| 9 | - Cannot unify ‘Any’ with the type variable ‘r0’
|
|
| 5 | + a1 :: TYPE c0
|
|
| 6 | + Cannot unify ‘Any’ with the type variable ‘c0’
|
|
| 10 | 7 | because the former is not a concrete ‘RuntimeRep’.
|
| 11 | 8 | • In the first argument of ‘levfun’, namely ‘(error @Any "e2")’
|
| 12 | 9 | In the first argument of ‘seq’, namely ‘levfun (error @Any "e2")’
|
| ... | ... | @@ -2,11 +2,8 @@ T23903.hs:21:1: error: [GHC-55287] |
| 2 | 2 | • The first pattern in the equation for ‘f’
|
| 3 | 3 | does not have a fixed runtime representation.
|
| 4 | 4 | Its type is:
|
| 5 | - t0 :: TYPE cx0
|
|
| 6 | - When unifying:
|
|
| 7 | - • t0 -> ()
|
|
| 8 | - • a #-> ()
|
|
| 9 | - Cannot unify ‘Rep a’ with the type variable ‘cx0’
|
|
| 5 | + t0 :: TYPE c0
|
|
| 6 | + Cannot unify ‘Rep a’ with the type variable ‘c0’
|
|
| 10 | 7 | because the former is not a concrete ‘RuntimeRep’.
|
| 11 | 8 | • The equation for ‘f’ has one visible argument,
|
| 12 | 9 | but its type ‘a #-> ()’ has none
|
| 1 | -simpl017.hs:55:12: error: [GHC-46956]
|
|
| 2 | - • Couldn't match type ‘v0’ with ‘v’
|
|
| 3 | - Expected: [E m i] -> E' v m a
|
|
| 4 | - Actual: [E m i] -> E' v0 m a
|
|
| 5 | - because type variable ‘v’ would escape its scope
|
|
| 6 | - This (rigid, skolem) type variable is bound by
|
|
| 7 | - a type expected by the context:
|
|
| 8 | - forall v. [E m i] -> E' v m a
|
|
| 9 | - at simpl017.hs:55:12
|
|
| 10 | - • In the first argument of ‘return’, namely ‘f’
|
|
| 11 | - In a stmt of a 'do' block: return f
|
|
| 1 | +simpl017.hs:55:5: error: [GHC-83865]
|
|
| 2 | + • Couldn't match type: [E m i] -> E' v0 m a
|
|
| 3 | + with: forall v. [E m i] -> E' v m a
|
|
| 4 | + Expected: m (forall v. [E m i] -> E' v m a)
|
|
| 5 | + Actual: m ([E m i] -> E' v0 m a)
|
|
| 6 | + • In a stmt of a 'do' block: return f
|
|
| 12 | 7 | In the first argument of ‘E’, namely
|
| 13 | 8 | ‘(do let ix :: [E m i] -> m i
|
| 14 | 9 | ix [i] = runE i
|
| 15 | 10 | {-# INLINE f #-}
|
| 16 | 11 | ....
|
| 17 | 12 | return f)’
|
| 13 | + In the expression:
|
|
| 14 | + E (do let ix :: [E m i] -> m i
|
|
| 15 | + ix [i] = runE i
|
|
| 16 | + {-# INLINE f #-}
|
|
| 17 | + ....
|
|
| 18 | + return f)
|
|
| 18 | 19 | • Relevant bindings include
|
| 19 | 20 | f :: [E m i] -> E' v0 m a (bound at simpl017.hs:54:9)
|
| 21 | + ix :: [E m i] -> m i (bound at simpl017.hs:52:9)
|
|
| 22 | + a :: arr i a (bound at simpl017.hs:50:11)
|
|
| 23 | + liftArray :: arr i a -> E m (forall v. [E m i] -> E' v m a)
|
|
| 24 | + (bound at simpl017.hs:50:1)
|
|
| 20 | 25 |
| 1 | +{-# LANGUAGE TypeFamilies #-}
|
|
| 2 | +{-# LANGUAGE GADTs #-}
|
|
| 3 | + |
|
| 4 | +-- This program was rejected by GHC 9.12 due to a bug with
|
|
| 5 | +-- unification in QuickLook.
|
|
| 6 | +module T26030 where
|
|
| 7 | + |
|
| 8 | +import Data.Kind
|
|
| 9 | + |
|
| 10 | +type S :: Type -> Type
|
|
| 11 | +data S a where
|
|
| 12 | + S1 :: S Bool
|
|
| 13 | + S2 :: S Char
|
|
| 14 | + |
|
| 15 | +type F :: Type -> Type
|
|
| 16 | +type family F a where
|
|
| 17 | + F Bool = Bool
|
|
| 18 | + F Char = Char
|
|
| 19 | + |
|
| 20 | +foo :: forall a. S a -> IO (F a)
|
|
| 21 | +foo sa1 = do
|
|
| 22 | + () <- return ()
|
|
| 23 | + case sa1 of
|
|
| 24 | + S1 -> return $ False
|
|
| 25 | + S2 -> return 'x' |
| ... | ... | @@ -887,6 +887,7 @@ test('T21909b', normal, compile, ['']) |
| 887 | 887 | test('T21443', normal, compile, [''])
|
| 888 | 888 | test('T22194', normal, compile, [''])
|
| 889 | 889 | test('T25744', normal, compile, [''])
|
| 890 | +test('T26030', normal, compile, [''])
|
|
| 890 | 891 | test('QualifiedRecordUpdate',
|
| 891 | 892 | [ extra_files(['QualifiedRecordUpdate_aux.hs']) ]
|
| 892 | 893 | , multimod_compile, ['QualifiedRecordUpdate', '-v0'])
|
| 1 | +{-# LANGUAGE PartialTypeSignatures #-}
|
|
| 2 | + |
|
| 3 | +module T25950 where
|
|
| 4 | + |
|
| 5 | +fails :: _ => a
|
|
| 6 | +fails = id $ () |
| 1 | +T25950.hs:6:9: error: [GHC-25897]
|
|
| 2 | + • Couldn't match expected type ‘a’ with actual type ‘()’
|
|
| 3 | + ‘a’ is a rigid type variable bound by
|
|
| 4 | + the inferred type of fails :: a
|
|
| 5 | + at T25950.hs:5:1-15
|
|
| 6 | + • In the expression: id $ ()
|
|
| 7 | + In an equation for ‘fails’: fails = id $ ()
|
|
| 8 | + • Relevant bindings include fails :: a (bound at T25950.hs:6:1)
|
|
| 9 | + |
| ... | ... | @@ -726,6 +726,7 @@ test('T17594c', normal, compile_fail, ['']) |
| 726 | 726 | test('T17594d', normal, compile_fail, [''])
|
| 727 | 727 | test('T17594g', normal, compile_fail, [''])
|
| 728 | 728 | |
| 729 | +test('T25950', normal, compile_fail, [''])
|
|
| 729 | 730 | test('T24470a', normal, compile_fail, [''])
|
| 730 | 731 | test('T24553', normal, compile_fail, [''])
|
| 731 | 732 | test('T23739b', normal, compile_fail, [''])
|