summaryrefslogtreecommitdiff
path: root/compiler/rename
diff options
context:
space:
mode:
authorRyan Scott <ryan.gl.scott@gmail.com>2019-01-15 08:08:43 -0500
committerRyan Scott <ryan.gl.scott@gmail.com>2019-01-15 08:08:43 -0500
commit83a22066fbe136e4a984e8c90c1d3fd72b6ec4b9 (patch)
treeabd9df501e567f4b8c11318604828ff692437983 /compiler/rename
parent69947d58c29cc0b047cc34fb4873e12f47e9674c (diff)
downloadhaskell-83a22066fbe136e4a984e8c90c1d3fd72b6ec4b9.tar.gz
Fix #16114 by adding a validity check to rnClsInstDecl
Diffstat (limited to 'compiler/rename')
-rw-r--r--compiler/rename/RnSource.hs26
-rw-r--r--compiler/rename/RnTypes.hs7
2 files changed, 20 insertions, 13 deletions
diff --git a/compiler/rename/RnSource.hs b/compiler/rename/RnSource.hs
index ca35e941fb..e5fe3a3a31 100644
--- a/compiler/rename/RnSource.hs
+++ b/compiler/rename/RnSource.hs
@@ -648,13 +648,27 @@ rnClsInstDecl (ClsInstDecl { cid_poly_ty = inst_ty, cid_binds = mbinds
, cid_sigs = uprags, cid_tyfam_insts = ats
, cid_overlap_mode = oflag
, cid_datafam_insts = adts })
- = do { (inst_ty', inst_fvs) <- rnLHsInstType (text "an instance declaration") inst_ty
+ = do { (inst_ty', inst_fvs)
+ <- rnHsSigType (GenericCtx $ text "an instance declaration") inst_ty
; let (ktv_names, _, head_ty') = splitLHsInstDeclTy inst_ty'
- ; let cls = case hsTyGetAppHead_maybe head_ty' of
- Nothing -> mkUnboundName (mkTcOccFS (fsLit "<class>"))
- Just (dL->L _ cls) -> cls
- -- rnLHsInstType has added an error message
- -- if hsTyGetAppHead_maybe fails
+ ; cls <-
+ case hsTyGetAppHead_maybe head_ty' of
+ Just (dL->L _ cls) -> pure cls
+ Nothing -> do
+ -- The instance is malformed. We'd still like
+ -- to make *some* progress (rather than failing outright), so
+ -- we report an error and continue for as long as we can.
+ -- Importantly, this error should be thrown before we reach the
+ -- typechecker, lest we encounter different errors that are
+ -- hopelessly confusing (such as the one in Trac #16114).
+ addErrAt (getLoc (hsSigType inst_ty)) $
+ hang (text "Illegal class instance:" <+> quotes (ppr inst_ty))
+ 2 (vcat [ text "Class instances must be of the form"
+ , nest 2 $ text "context => C ty_1 ... ty_n"
+ , text "where" <+> quotes (char 'C')
+ <+> text "is a class"
+ ])
+ pure $ mkUnboundName (mkTcOccFS (fsLit "<class>"))
-- Rename the bindings
-- The typechecker (not the renamer) checks that all
diff --git a/compiler/rename/RnTypes.hs b/compiler/rename/RnTypes.hs
index f66c1bd29f..3703f1ac63 100644
--- a/compiler/rename/RnTypes.hs
+++ b/compiler/rename/RnTypes.hs
@@ -15,7 +15,6 @@ module RnTypes (
rnHsKind, rnLHsKind, rnLHsTypeArgs,
rnHsSigType, rnHsWcType,
HsSigWcTypeScoping(..), rnHsSigWcType, rnHsSigWcTypeScoped,
- rnLHsInstType,
newTyVarNameRn,
rnConDeclFields,
rnLTyVar,
@@ -374,12 +373,6 @@ rnImplicitBndrs bind_free_tvs
, text "Suggested fix: add" <+>
quotes (text "forall" <+> hsep (map ppr kvs) <> char '.') ]
-rnLHsInstType :: SDoc -> LHsSigType GhcPs -> RnM (LHsSigType GhcRn, FreeVars)
--- Rename the type in an instance.
--- The 'doc_str' is "an instance declaration".
--- Do not try to decompose the inst_ty in case it is malformed
-rnLHsInstType doc inst_ty = rnHsSigType (GenericCtx doc) inst_ty
-
{- ******************************************************
* *
LHsType and HsType