summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2016-05-10 12:48:29 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2016-05-10 14:25:08 +0100
commite24b50c3a70a247a4695a80aceba0cf351eb1e9e (patch)
tree707b551361a9e440b59d6c0d6c8f6ed92f0fce72
parente7e5939d80f05cfc52e98af50d0e0227aeee826d (diff)
downloadhaskell-e24b50c3a70a247a4695a80aceba0cf351eb1e9e.tar.gz
Use partial-sig constraints as givens
In TcSimplify.simplifyInfer, use the context of a partial type signature as 'givens' when simplifying the inferred constraints of the group. This way we get maximum benefit from them. See Note [Add signature contexts as givens]. This (finally) fixes test EqualityConstraints in Trac #9478. And it's a nice tidy-up.
-rw-r--r--compiler/typecheck/TcBinds.hs11
-rw-r--r--compiler/typecheck/TcSimplify.hs130
-rw-r--r--compiler/typecheck/TcType.hs36
-rw-r--r--testsuite/tests/partial-sigs/should_compile/SuperCls.hs7
-rw-r--r--testsuite/tests/partial-sigs/should_compile/SuperCls.stderr4
-rw-r--r--testsuite/tests/partial-sigs/should_compile/WarningWildcardInstantiations.stderr120
-rw-r--r--testsuite/tests/partial-sigs/should_compile/all.T1
-rw-r--r--testsuite/tests/partial-sigs/should_fail/WildcardInstantiations.stderr116
8 files changed, 227 insertions, 198 deletions
diff --git a/compiler/typecheck/TcBinds.hs b/compiler/typecheck/TcBinds.hs
index 1b16da101e..19b503400b 100644
--- a/compiler/typecheck/TcBinds.hs
+++ b/compiler/typecheck/TcBinds.hs
@@ -777,10 +777,10 @@ chooseInferredQuantifiers :: TcThetaType -- inferred
-> Maybe TcIdSigInfo
-> TcM ([TcTyBinder], TcThetaType)
chooseInferredQuantifiers inferred_theta tau_tvs qtvs Nothing
- = -- No type signature for this binder
+ = -- No type signature (partial or complete) for this binder,
do { let free_tvs = closeOverKinds (growThetaTyVars inferred_theta tau_tvs)
-- Include kind variables! Trac #7916
- my_theta = pickQuantifiablePreds free_tvs [] inferred_theta
+ my_theta = pickCapturedPreds free_tvs inferred_theta
binders = [ mkNamedBinder Invisible tv
| tv <- qtvs
, tv `elemVarSet` free_tvs ]
@@ -804,16 +804,15 @@ chooseInferredQuantifiers inferred_theta tau_tvs qtvs
= do { annotated_theta <- zonkTcTypes annotated_theta
; let free_tvs = closeOverKinds (tyCoVarsOfTypes annotated_theta
`unionVarSet` tau_tvs)
- my_theta = pickQuantifiablePreds free_tvs annotated_theta inferred_theta
+ my_theta = pickCapturedPreds free_tvs inferred_theta
-- Report the inferred constraints for an extra-constraints wildcard/hole as
-- an error message, unless the PartialTypeSignatures flag is enabled. In this
-- case, the extra inferred constraints are accepted without complaining.
- -- Returns the annotated constraints combined with the inferred constraints.
+ -- NB: inferred_theta already includes all the annotated constraints
inferred_diff = [ pred
| pred <- my_theta
, all (not . (`eqType` pred)) annotated_theta ]
- final_theta = annotated_theta ++ inferred_diff
; partial_sigs <- xoptM LangExt.PartialTypeSignatures
; warn_partial_sigs <- woptM Opt_WarnPartialTypeSignatures
; msg <- mkLongErrAt loc (mk_msg inferred_diff partial_sigs hs_ty) empty
@@ -827,7 +826,7 @@ chooseInferredQuantifiers inferred_theta tau_tvs qtvs
| otherwise -> return ()
False -> reportError msg
- ; return (mk_binders free_tvs, final_theta) }
+ ; return (mk_binders free_tvs, my_theta) }
| otherwise -- A complete type signature is dealt with in mkInferredPolyId
= pprPanic "chooseInferredQuantifiers" (ppr bndr_info)
diff --git a/compiler/typecheck/TcSimplify.hs b/compiler/typecheck/TcSimplify.hs
index 19d04abae1..07c0a234f4 100644
--- a/compiler/typecheck/TcSimplify.hs
+++ b/compiler/typecheck/TcSimplify.hs
@@ -539,6 +539,9 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
, text "(unzonked) wanted =" <+> ppr wanteds
]
+ ; let partial_sigs = filter isPartialSig sigs
+ psig_theta = concatMap sig_theta partial_sigs
+
-- First do full-blown solving
-- NB: we must gather up all the bindings from doing
-- this solving; hence (runTcSWithEvBinds ev_binds_var).
@@ -547,20 +550,26 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
-- bindings, so we can't just revert to the input
-- constraint.
- ; ev_binds_var <- TcM.newTcEvBinds
- ; wanted_transformed_incl_derivs <- setTcLevel rhs_tclvl $
- do { sig_derived <- concatMapM mkSigDerivedWanteds sigs
- -- the False says we don't really need to solve all Deriveds
- ; runTcSWithEvBinds False (Just ev_binds_var) $
- solveWanteds (wanteds `addSimples` listToBag sig_derived) }
+ ; tc_lcl_env <- TcM.getLclEnv
+ ; ev_binds_var <- TcM.newTcEvBinds
+ ; psig_theta_vars <- mapM TcM.newEvVar psig_theta
+ ; wanted_transformed_incl_derivs
+ <- setTcLevel rhs_tclvl $
+ runTcSWithEvBinds False (Just ev_binds_var) $
+ do { let loc = mkGivenLoc rhs_tclvl UnkSkol tc_lcl_env
+ ; psig_givens <- mkGivensWithSuperClasses loc psig_theta_vars
+ ; _ <- solveSimpleGivens psig_givens
+ -- See Note [Add signature contexts as givens]
+ ; solveWanteds wanteds }
; wanted_transformed_incl_derivs <- TcM.zonkWC wanted_transformed_incl_derivs
-- Find quant_pred_candidates, the predicates that
-- we'll consider quantifying over
- -- NB: We do not do any defaulting when inferring a type, this can lead
- -- to less polymorphic types, see Note [Default while Inferring]
+ -- NB1: wanted_transformed does not include anything provable from
+ -- the psig_theta; it's just the extra bit
+ -- NB2: We do not do any defaulting when inferring a type, this can lead
+ -- to less polymorphic types, see Note [Default while Inferring]
- ; tc_lcl_env <- TcM.getLclEnv
; let wanted_transformed = dropDerivedWC wanted_transformed_incl_derivs
; quant_pred_candidates -- Fully zonked
<- if insolubleWC rhs_tclvl wanted_transformed_incl_derivs
@@ -604,15 +613,10 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
-- NB: quant_pred_candidates is already fully zonked
-- Decide what type variables and constraints to quantify
- ; let (bndrs, taus) = unzip name_taus
- partial_sigs = filter isPartialSig sigs
- psig_theta = concatMap sig_theta partial_sigs
- -- psig_theta: see Note [Quantification and partial signatures]
- ; zonked_taus <- mapM TcM.zonkTcType (psig_theta ++ taus)
- ; let zonked_tau_dvs = splitDepVarsOfTypes zonked_taus
- ; (qtvs, bound_theta)
- <- decideQuantification apply_mr bndrs psig_theta
- quant_pred_candidates zonked_tau_dvs
+ -- NB: bound_theta are constraints we want to quantify over,
+ -- /apart from/ the psig_theta, which we always quantify over
+ ; (qtvs, bound_theta) <- decideQuantification apply_mr name_taus psig_theta
+ quant_pred_candidates
-- Promote any type variables that are free in the inferred type
-- of the function:
@@ -626,15 +630,12 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
-- we don't quantify over beta (since it is fixed by envt)
-- so we must promote it! The inferred type is just
-- f :: beta -> beta
- ; zonked_tau_tkvs <- TcM.zonkTyCoVarsAndFV $
- dVarSetToVarSet (dv_kvs zonked_tau_dvs)
- `unionVarSet`
- dVarSetToVarSet (dv_tvs zonked_tau_dvs)
+ ; zonked_taus <- mapM (TcM.zonkTcType . snd) name_taus
-- decideQuantification turned some meta tyvars into
-- quantified skolems, so we have to zonk again
; let phi_tkvs = tyCoVarsOfTypes bound_theta -- Already zonked
- `unionVarSet` zonked_tau_tkvs
+ `unionVarSet` tyCoVarsOfTypes zonked_taus
promote_tkvs = closeOverKinds phi_tkvs `delVarSetList` qtvs
; MASSERT2( closeOverKinds promote_tkvs `subVarSet` promote_tkvs
@@ -651,7 +652,10 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
-- Emit an implication constraint for the
-- remaining constraints from the RHS
; bound_theta_vars <- mapM TcM.newEvVar bound_theta
- ; let skol_info = InferSkol [ (name, mkSigmaTy [] bound_theta ty)
+ ; psig_theta_vars <- mapM zonkId psig_theta_vars
+ ; let full_theta = psig_theta ++ bound_theta
+ full_theta_vars = psig_theta_vars ++ bound_theta_vars
+ skol_info = InferSkol [ (name, mkSigmaTy [] full_theta ty)
| (name, ty) <- name_taus ]
-- Don't add the quantified variables here, because
-- they are also bound in ic_skols and we want them
@@ -665,7 +669,7 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
implic = Implic { ic_tclvl = rhs_tclvl
, ic_skols = extra_qtvs ++ qtvs
, ic_no_eqs = False
- , ic_given = bound_theta_vars
+ , ic_given = full_theta_vars
, ic_wanted = wanted_transformed
, ic_status = IC_Unsolved
, ic_binds = Just ev_binds_var
@@ -676,40 +680,40 @@ simplifyInfer rhs_tclvl apply_mr sigs name_taus wanteds
-- All done!
; traceTc "} simplifyInfer/produced residual implication for quantification" $
vcat [ text "quant_pred_candidates =" <+> ppr quant_pred_candidates
- , text "zonked_taus" <+> ppr zonked_taus
- , text "zonked_tau_dvs=" <+> ppr zonked_tau_dvs
, text "promote_tvs=" <+> ppr promote_tkvs
+ , text "psig_theta =" <+> ppr psig_theta
, text "bound_theta =" <+> ppr bound_theta
+ , text "full_theta =" <+> ppr full_theta
, text "qtvs =" <+> ppr qtvs
, text "implic =" <+> ppr implic ]
- ; return ( qtvs, bound_theta_vars, TcEvBinds ev_binds_var ) }
-
-mkSigDerivedWanteds :: TcIdSigInfo -> TcM [Ct]
--- See Note [Add deriveds for signature contexts]
-mkSigDerivedWanteds (TISI { sig_bndr = PartialSig { sig_name = name }
- , sig_theta = theta, sig_tau = tau })
- = do { let skol_info = InferSkol [(name, mkSigmaTy [] theta tau)]
- ; loc <- getCtLocM (GivenOrigin skol_info) (Just TypeLevel)
- ; return [ mkNonCanonical (CtDerived { ctev_pred = pred
- , ctev_loc = loc })
- | pred <- theta ] }
-mkSigDerivedWanteds _ = return []
-
-{- Note [Add deriveds for signature contexts]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ; return ( qtvs, full_theta_vars, TcEvBinds ev_binds_var ) }
+
+{- Note [Add signature contexts as givens]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Consider this (Trac #11016):
f2 :: (?x :: Int) => _
f2 = ?x
-We'll use plan InferGen because there are holes in the type. But we want
-to have the (?x :: Int) constraint floating around so that the functional
-dependencies kick in. Otherwise the occurrence of ?x on the RHS produces
-constraint (?x :: alpha), and we wont unify alpha:=Int.
+or this
+ f3 :: a ~ Bool => (a, _)
+ f3 = (True, False)
+or theis
+ f4 :: (Ord a, _) => a -> Bool
+ f4 x = x==x
+
+We'll use plan InferGen because there are holes in the type. But:
+ * For f2 we want to have the (?x :: Int) constraint floating around
+ so that the functional dependencies kick in. Otherwise the
+ occurrence of ?x on the RHS produces constraint (?x :: alpha), and
+ we won't unify alpha:=Int.
+ * For f3 we want the (a ~ Bool) available to solve the wanted (a ~ Bool)
+ in the RHS
+ * For f4 we want to use the (Ord a) in the signature to solve the Eq a
+ constraint.
Solution: in simplifyInfer, just before simplifying the constraints
-gathered from the RHS, add Derived constraints for the context of any
-type signatures. This is rare; if there is a type signature we'll usually
-be doing CheckGen. But it happens for signatures with holes.
+gathered from the RHS, add Given constraints for the context of any
+type signatures.
************************************************************************
* *
@@ -746,22 +750,23 @@ including all covars -- and the quantified constraints are empty/insoluble.
decideQuantification
:: Bool -- try the MR restriction?
- -> [Name] -- variables to be generalised (for errors only)
+ -> [(Name, TcTauType)] -- Variables to be generalised
-> [PredType] -- All annotated constraints from signatures
-> [PredType] -- Candidate theta
- -> TcDepVars
-> TcM ( [TcTyVar] -- Quantify over these (skolems)
, [PredType] ) -- and this context (fully zonked)
-- See Note [Deciding quantification]
-decideQuantification apply_mr bndrs ann_theta constraints
- zonked_dvs@(DV { dv_kvs = zonked_tau_kvs, dv_tvs = zonked_tau_tvs })
+decideQuantification apply_mr name_taus psig_theta constraints
| apply_mr -- Apply the Monomorphism restriction
= do { gbl_tvs <- tcGetGlobalTyCoVars
- ; let zonked_tkvs = dVarSetToVarSet zonked_tau_kvs `unionVarSet`
- dVarSetToVarSet zonked_tau_tvs
+ ; zonked_taus <- mapM TcM.zonkTcType (psig_theta ++ taus)
+ -- psig_theta: see Note [Quantification and partial signatures]
+ ; let zonked_dvs = splitDepVarsOfTypes zonked_taus
+ zonked_tkvs = tcDepVarSet zonked_dvs
constrained_tvs = tyCoVarsOfTypes constraints `unionVarSet`
filterVarSet isCoVar zonked_tkvs
mono_tvs = gbl_tvs `unionVarSet` constrained_tvs
+
; qtvs <- quantifyZonkedTyVars mono_tvs zonked_dvs
-- Warn about the monomorphism restriction
@@ -781,9 +786,12 @@ decideQuantification apply_mr bndrs ann_theta constraints
| otherwise
= do { gbl_tvs <- tcGetGlobalTyCoVars
- ; let mono_tvs = growThetaTyVars equality_constraints gbl_tvs
- tau_tvs_plus = growThetaTyVarsDSet constraints zonked_tau_tvs
- dvs_plus = DV { dv_kvs = zonked_tau_kvs, dv_tvs = tau_tvs_plus }
+ ; zonked_taus <- mapM TcM.zonkTcType (psig_theta ++ taus)
+ -- psig_theta: see Note [Quantification and partial signatures]
+ ; let DV { dv_kvs = zkvs, dv_tvs = ztvs} = splitDepVarsOfTypes zonked_taus
+ mono_tvs = growThetaTyVars equality_constraints gbl_tvs
+ tau_tvs_plus = growThetaTyVarsDSet constraints ztvs
+ dvs_plus = DV { dv_kvs = zkvs, dv_tvs = tau_tvs_plus }
; qtvs <- quantifyZonkedTyVars mono_tvs dvs_plus
-- We don't grow the kvs, as there's no real need to. Recall
-- that quantifyTyVars uses the separation between kvs and tvs
@@ -794,8 +802,8 @@ decideQuantification apply_mr bndrs ann_theta constraints
-- quantifyTyVars turned some meta tyvars into
-- quantified skolems, so we have to zonk again
- ; let qtv_set = mkVarSet qtvs
- theta = pickQuantifiablePreds qtv_set ann_theta constraints
+ ; let qtv_set = mkVarSet qtvs
+ theta = pickQuantifiablePreds qtv_set constraints
min_theta = mkMinimalBySCs theta
-- See Note [Minimize by Superclasses]
@@ -803,7 +811,6 @@ decideQuantification apply_mr bndrs ann_theta constraints
(vcat [ text "constraints:" <+> ppr constraints
, text "gbl_tvs:" <+> ppr gbl_tvs
, text "mono_tvs:" <+> ppr mono_tvs
- , text "zonked_kvs:" <+> ppr zonked_tau_kvs
, text "tau_tvs_plus:" <+> ppr tau_tvs_plus
, text "qtvs:" <+> ppr qtvs
, text "min_theta:" <+> ppr min_theta ])
@@ -811,6 +818,7 @@ decideQuantification apply_mr bndrs ann_theta constraints
where
pp_bndrs = pprWithCommas (quotes . ppr) bndrs
equality_constraints = filter isEqPred constraints
+ (bndrs, taus) = unzip name_taus
------------------
growThetaTyVars :: ThetaType -> TyCoVarSet -> TyVarSet
diff --git a/compiler/typecheck/TcType.hs b/compiler/typecheck/TcType.hs
index 94ab0bc0cf..fbb80bda47 100644
--- a/compiler/typecheck/TcType.hs
+++ b/compiler/typecheck/TcType.hs
@@ -91,7 +91,7 @@ module TcType (
---------------------------------
-- Predicate types
mkMinimalBySCs, transSuperClasses,
- pickQuantifiablePreds,
+ pickQuantifiablePreds, pickCapturedPreds,
immSuperClasses,
isImprovementPred,
@@ -100,7 +100,7 @@ module TcType (
-- * Finding "exact" (non-dead) type variables
exactTyCoVarsOfType, exactTyCoVarsOfTypes,
- splitDepVarsOfType, splitDepVarsOfTypes, TcDepVars(..), depVarsTyVars,
+ splitDepVarsOfType, splitDepVarsOfTypes, TcDepVars(..), tcDepVarSet,
-- * Extracting bound variables
allBoundVariables, allBoundVariabless,
@@ -861,8 +861,10 @@ data TcDepVars -- See Note [Dependent type variables]
-- See Note [Dependent type variables]
}
-depVarsTyVars :: TcDepVars -> DTyVarSet
-depVarsTyVars = dv_tvs
+tcDepVarSet :: TcDepVars -> TyVarSet
+-- Actually can contain CoVars, but never mind
+tcDepVarSet (DV { dv_kvs = kvs, dv_tvs = tvs })
+ = dVarSetToVarSet kvs `unionVarSet` dVarSetToVarSet tvs
instance Monoid TcDepVars where
mempty = DV { dv_kvs = emptyDVarSet, dv_tvs = emptyDVarSet }
@@ -1832,12 +1834,11 @@ evVarPred var
-- [Inheriting implicit parameters] and [Quantifying over equality constraints]
pickQuantifiablePreds
:: TyVarSet -- Quantifying over these
- -> TcThetaType -- Context from PartialTypeSignatures
-> TcThetaType -- Proposed constraints to quantify
-> TcThetaType -- A subset that we can actually quantify
-- This function decides whether a particular constraint should be
-- quantified over, given the type variables that are being quantified
-pickQuantifiablePreds qtvs annotated_theta theta
+pickQuantifiablePreds qtvs theta
= let flex_ctxt = True in -- Quantify over non-tyvar constraints, even without
-- -XFlexibleContexts: see Trac #10608, #10351
-- flex_ctxt <- xoptM Opt_FlexibleContexts
@@ -1847,14 +1848,13 @@ pickQuantifiablePreds qtvs annotated_theta theta
= case classifyPredType pred of
ClassPred cls tys
- | Just str <- isCallStackPred pred
- -- NEVER infer a CallStack constraint, unless we were
- -- given one in a partial type signatures.
+ | Just {} <- isCallStackPred pred
+ -- NEVER infer a CallStack constraint
-- Otherwise, we let the constraints bubble up to be
-- solved from the outer context, or be defaulted when we
-- reach the top-level.
-- see Note [Overview of implicit CallStacks]
- -> str `elem` givenStks
+ -> False
| isIPClass cls -> True -- See note [Inheriting implicit parameters]
@@ -1867,9 +1867,6 @@ pickQuantifiablePreds qtvs annotated_theta theta
EqPred NomEq ty1 ty2 -> quant_fun ty1 || quant_fun ty2
IrredPred ty -> tyCoVarsOfType ty `intersectsVarSet` qtvs
- givenStks = [ str | (str, ty) <- mapMaybe isIPPred_maybe annotated_theta
- , isCallStackTy ty ]
-
pick_cls_pred flex_ctxt cls tys
= tyCoVarsOfTypes tys `intersectsVarSet` qtvs
&& (checkValidClsArgs flex_ctxt cls tys)
@@ -1883,6 +1880,19 @@ pickQuantifiablePreds qtvs annotated_theta theta
-> tyCoVarsOfTypes tys `intersectsVarSet` qtvs
_ -> False
+pickCapturedPreds
+ :: TyVarSet -- Quantifying over these
+ -> TcThetaType -- Proposed constraints to quantify
+ -> TcThetaType -- A subset that we can actually quantify
+-- A simpler version of pickQuantifiablePreds, used to winnow down
+-- the inferred constrains of a group of bindings, into those for
+-- one particular identifier
+pickCapturedPreds qtvs theta
+ = filter captured theta
+ where
+ captured pred = isIPPred pred || (tyCoVarsOfType pred `intersectsVarSet` qtvs)
+
+
-- Superclasses
type PredWithSCs = (PredType, [PredType])
diff --git a/testsuite/tests/partial-sigs/should_compile/SuperCls.hs b/testsuite/tests/partial-sigs/should_compile/SuperCls.hs
new file mode 100644
index 0000000000..62bc1ba224
--- /dev/null
+++ b/testsuite/tests/partial-sigs/should_compile/SuperCls.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE PartialTypeSignatures, NamedWildCards #-}
+module SuperCls where
+
+f :: (Ord a, _) => a -> Bool
+-- We'd like to see that the wildcard _ unifies with ()
+f x = x == x
+
diff --git a/testsuite/tests/partial-sigs/should_compile/SuperCls.stderr b/testsuite/tests/partial-sigs/should_compile/SuperCls.stderr
new file mode 100644
index 0000000000..d6fda4e8f5
--- /dev/null
+++ b/testsuite/tests/partial-sigs/should_compile/SuperCls.stderr
@@ -0,0 +1,4 @@
+
+SuperCls.hs:4:14: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ Found constraint wildcard ‘_’ standing for ‘()’
+ In the type signature: f :: (Ord a, _) => a -> Bool
diff --git a/testsuite/tests/partial-sigs/should_compile/WarningWildcardInstantiations.stderr b/testsuite/tests/partial-sigs/should_compile/WarningWildcardInstantiations.stderr
index 19ed2e1745..fe80ce4b7b 100644
--- a/testsuite/tests/partial-sigs/should_compile/WarningWildcardInstantiations.stderr
+++ b/testsuite/tests/partial-sigs/should_compile/WarningWildcardInstantiations.stderr
@@ -1,60 +1,60 @@
-TYPE SIGNATURES
- bar :: forall t t1. t1 -> (t1 -> t) -> t
- foo :: forall a. (Show a, Enum a) => a -> String
-TYPE CONSTRUCTORS
-COERCION AXIOMS
-Dependent modules: []
-Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
- integer-gmp-1.0.0.1]
-
-WarningWildcardInstantiations.hs:5:14: warning: [-Wpartial-type-signatures (in -Wdefault)]
- • Found type wildcard ‘_a’ standing for ‘a’
- Where: ‘a’ is a rigid type variable bound by
- the inferred type of foo :: (Enum a, Show a) => a -> String
- at WarningWildcardInstantiations.hs:6:1
- • In the type signature: foo :: (Show _a, _) => _a -> _
- • Relevant bindings include
- foo :: a -> String (bound at WarningWildcardInstantiations.hs:6:1)
-
-WarningWildcardInstantiations.hs:5:18: warning: [-Wpartial-type-signatures (in -Wdefault)]
- Found constraint wildcard ‘_’ standing for ‘Enum a’
- In the type signature: foo :: (Show _a, _) => _a -> _
-
-WarningWildcardInstantiations.hs:5:30: warning: [-Wpartial-type-signatures (in -Wdefault)]
- • Found type wildcard ‘_’ standing for ‘String’
- • In the type signature: foo :: (Show _a, _) => _a -> _
- • Relevant bindings include
- foo :: a -> String (bound at WarningWildcardInstantiations.hs:6:1)
-
-WarningWildcardInstantiations.hs:8:8: warning: [-Wpartial-type-signatures (in -Wdefault)]
- • Found type wildcard ‘_’ standing for ‘t1’
- Where: ‘t1’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WarningWildcardInstantiations.hs:9:1
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WarningWildcardInstantiations.hs:9:1)
-
-WarningWildcardInstantiations.hs:8:13: warning: [-Wpartial-type-signatures (in -Wdefault)]
- • Found type wildcard ‘_’ standing for ‘t1 -> t’
- Where: ‘t’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WarningWildcardInstantiations.hs:9:1
- ‘t1’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WarningWildcardInstantiations.hs:9:1
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WarningWildcardInstantiations.hs:9:1)
-
-WarningWildcardInstantiations.hs:8:18: warning: [-Wpartial-type-signatures (in -Wdefault)]
- • Found type wildcard ‘_’ standing for ‘t’
- Where: ‘t’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WarningWildcardInstantiations.hs:9:1
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WarningWildcardInstantiations.hs:9:1)
+TYPE SIGNATURES
+ bar :: forall t t1. t1 -> (t1 -> t) -> t
+ foo :: forall a. (Show a, Enum a) => a -> String
+TYPE CONSTRUCTORS
+COERCION AXIOMS
+Dependent modules: []
+Dependent packages: [base-4.9.0.0, ghc-prim-0.5.0.0,
+ integer-gmp-1.0.0.1]
+
+WarningWildcardInstantiations.hs:5:14: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ • Found type wildcard ‘_a’ standing for ‘a’
+ Where: ‘a’ is a rigid type variable bound by
+ the inferred type of foo :: (Show a, Enum a) => a -> String
+ at WarningWildcardInstantiations.hs:6:1
+ • In the type signature: foo :: (Show _a, _) => _a -> _
+ • Relevant bindings include
+ foo :: a -> String (bound at WarningWildcardInstantiations.hs:6:1)
+
+WarningWildcardInstantiations.hs:5:18: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ Found constraint wildcard ‘_’ standing for ‘Enum a’
+ In the type signature: foo :: (Show _a, _) => _a -> _
+
+WarningWildcardInstantiations.hs:5:30: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ • Found type wildcard ‘_’ standing for ‘String’
+ • In the type signature: foo :: (Show _a, _) => _a -> _
+ • Relevant bindings include
+ foo :: a -> String (bound at WarningWildcardInstantiations.hs:6:1)
+
+WarningWildcardInstantiations.hs:8:8: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ • Found type wildcard ‘_’ standing for ‘t1’
+ Where: ‘t1’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WarningWildcardInstantiations.hs:9:1
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WarningWildcardInstantiations.hs:9:1)
+
+WarningWildcardInstantiations.hs:8:13: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ • Found type wildcard ‘_’ standing for ‘t1 -> t’
+ Where: ‘t’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WarningWildcardInstantiations.hs:9:1
+ ‘t1’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WarningWildcardInstantiations.hs:9:1
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WarningWildcardInstantiations.hs:9:1)
+
+WarningWildcardInstantiations.hs:8:18: warning: [-Wpartial-type-signatures (in -Wdefault)]
+ • Found type wildcard ‘_’ standing for ‘t’
+ Where: ‘t’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WarningWildcardInstantiations.hs:9:1
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WarningWildcardInstantiations.hs:9:1)
diff --git a/testsuite/tests/partial-sigs/should_compile/all.T b/testsuite/tests/partial-sigs/should_compile/all.T
index a30c0578f1..57b0e3a68d 100644
--- a/testsuite/tests/partial-sigs/should_compile/all.T
+++ b/testsuite/tests/partial-sigs/should_compile/all.T
@@ -60,3 +60,4 @@ test('T10463', normal, compile, [''])
test('ExprSigLocal', normal, compile, [''])
test('T11016', normal, compile, [''])
test('T11192', normal, compile, [''])
+test('SuperCls', normal, compile, ['']) \ No newline at end of file
diff --git a/testsuite/tests/partial-sigs/should_fail/WildcardInstantiations.stderr b/testsuite/tests/partial-sigs/should_fail/WildcardInstantiations.stderr
index e72ee6654f..e134fbbcd3 100644
--- a/testsuite/tests/partial-sigs/should_fail/WildcardInstantiations.stderr
+++ b/testsuite/tests/partial-sigs/should_fail/WildcardInstantiations.stderr
@@ -1,58 +1,58 @@
-
-WildcardInstantiations.hs:5:14: error:
- • Found type wildcard ‘_a’ standing for ‘a’
- Where: ‘a’ is a rigid type variable bound by
- the inferred type of foo :: (Enum a, Show a) => a -> String
- at WildcardInstantiations.hs:6:1
- To use the inferred type, enable PartialTypeSignatures
- • In the type signature: foo :: (Show _a, _) => _a -> _
- • Relevant bindings include
- foo :: a -> String (bound at WildcardInstantiations.hs:6:1)
-
-WildcardInstantiations.hs:5:18: error:
- Found constraint wildcard ‘_’ standing for ‘Enum a’
- To use the inferred type, enable PartialTypeSignatures
- In the type signature: foo :: (Show _a, _) => _a -> _
-
-WildcardInstantiations.hs:5:30: error:
- • Found type wildcard ‘_’ standing for ‘String’
- To use the inferred type, enable PartialTypeSignatures
- • In the type signature: foo :: (Show _a, _) => _a -> _
- • Relevant bindings include
- foo :: a -> String (bound at WildcardInstantiations.hs:6:1)
-
-WildcardInstantiations.hs:8:8: error:
- • Found type wildcard ‘_’ standing for ‘t1’
- Where: ‘t1’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WildcardInstantiations.hs:9:1
- To use the inferred type, enable PartialTypeSignatures
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WildcardInstantiations.hs:9:1)
-
-WildcardInstantiations.hs:8:13: error:
- • Found type wildcard ‘_’ standing for ‘t1 -> t’
- Where: ‘t’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WildcardInstantiations.hs:9:1
- ‘t1’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WildcardInstantiations.hs:9:1
- To use the inferred type, enable PartialTypeSignatures
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WildcardInstantiations.hs:9:1)
-
-WildcardInstantiations.hs:8:18: error:
- • Found type wildcard ‘_’ standing for ‘t’
- Where: ‘t’ is a rigid type variable bound by
- the inferred type of bar :: t1 -> (t1 -> t) -> t
- at WildcardInstantiations.hs:9:1
- To use the inferred type, enable PartialTypeSignatures
- • In the type signature: bar :: _ -> _ -> _
- • Relevant bindings include
- bar :: t1 -> (t1 -> t) -> t
- (bound at WildcardInstantiations.hs:9:1)
+
+WildcardInstantiations.hs:5:14: error:
+ • Found type wildcard ‘_a’ standing for ‘a’
+ Where: ‘a’ is a rigid type variable bound by
+ the inferred type of foo :: (Show a, Enum a) => a -> String
+ at WildcardInstantiations.hs:6:1
+ To use the inferred type, enable PartialTypeSignatures
+ • In the type signature: foo :: (Show _a, _) => _a -> _
+ • Relevant bindings include
+ foo :: a -> String (bound at WildcardInstantiations.hs:6:1)
+
+WildcardInstantiations.hs:5:18: error:
+ Found constraint wildcard ‘_’ standing for ‘Enum a’
+ To use the inferred type, enable PartialTypeSignatures
+ In the type signature: foo :: (Show _a, _) => _a -> _
+
+WildcardInstantiations.hs:5:30: error:
+ • Found type wildcard ‘_’ standing for ‘String’
+ To use the inferred type, enable PartialTypeSignatures
+ • In the type signature: foo :: (Show _a, _) => _a -> _
+ • Relevant bindings include
+ foo :: a -> String (bound at WildcardInstantiations.hs:6:1)
+
+WildcardInstantiations.hs:8:8: error:
+ • Found type wildcard ‘_’ standing for ‘t1’
+ Where: ‘t1’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WildcardInstantiations.hs:9:1
+ To use the inferred type, enable PartialTypeSignatures
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WildcardInstantiations.hs:9:1)
+
+WildcardInstantiations.hs:8:13: error:
+ • Found type wildcard ‘_’ standing for ‘t1 -> t’
+ Where: ‘t’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WildcardInstantiations.hs:9:1
+ ‘t1’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WildcardInstantiations.hs:9:1
+ To use the inferred type, enable PartialTypeSignatures
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WildcardInstantiations.hs:9:1)
+
+WildcardInstantiations.hs:8:18: error:
+ • Found type wildcard ‘_’ standing for ‘t’
+ Where: ‘t’ is a rigid type variable bound by
+ the inferred type of bar :: t1 -> (t1 -> t) -> t
+ at WildcardInstantiations.hs:9:1
+ To use the inferred type, enable PartialTypeSignatures
+ • In the type signature: bar :: _ -> _ -> _
+ • Relevant bindings include
+ bar :: t1 -> (t1 -> t) -> t
+ (bound at WildcardInstantiations.hs:9:1)