#include "HsVersions.h"
-import {-# SOURCE #-} TcExpr( tcExpr )
-
import HsSyn ( InPat(..), OutPat(..), HsLit(..), HsExpr(..), Sig(..) )
import RnHsSyn ( RenamedPat )
import TcHsSyn ( TcPat, TcId )
tcLookupValueByKey, newLocalId, badCon
)
import TcType ( TcType, TcTyVar, tcInstTyVars, newTyVarTy )
-import TcMonoType ( tcHsType )
-import TcUnify ( unifyTauTy, unifyListTy,
- unifyTupleTy, unifyUnboxedTupleTy
- )
+import TcMonoType ( tcHsSigType )
+import TcUnify ( unifyTauTy, unifyListTy, unifyTupleTy )
-import Bag ( Bag )
import CmdLineOpts ( opt_IrrefutableTuples )
import DataCon ( DataCon, dataConSig, dataConFieldLabels,
dataConSourceArity
doublePrimTy, addrPrimTy
)
import TysWiredIn ( charTy, stringTy, intTy )
-import SrcLoc ( SrcLoc )
import Unique ( eqClassOpKey, geClassOpKey, minusClassOpKey,
cCallableClassKey
)
+import BasicTypes ( isBoxed )
import Bag
import Util ( zipEqual )
import Outputable
= tcPat tc_bndr parend_pat pat_ty
tcPat tc_bndr (SigPatIn pat sig) pat_ty
- = tcHsType sig `thenTc` \ sig_ty ->
+ = tcHsSigType sig `thenTc` \ sig_ty ->
-- Check that the signature isn't a polymorphic one, which
-- we don't permit (at present, anyway)
tcPats tc_bndr pats (repeat elem_ty) `thenTc` \ (pats', lie_req, tvs, ids, lie_avail) ->
returnTc (ListPat elem_ty pats', lie_req, tvs, ids, lie_avail)
-tcPat tc_bndr pat_in@(TuplePatIn pats boxed) pat_ty
+tcPat tc_bndr pat_in@(TuplePatIn pats boxity) pat_ty
= tcAddErrCtxt (patCtxt pat_in) $
- (if boxed
- then unifyTupleTy arity pat_ty
- else unifyUnboxedTupleTy arity pat_ty) `thenTc` \ arg_tys ->
-
- tcPats tc_bndr pats arg_tys `thenTc` \ (pats', lie_req, tvs, ids, lie_avail) ->
+ unifyTupleTy boxity arity pat_ty `thenTc` \ arg_tys ->
+ tcPats tc_bndr pats arg_tys `thenTc` \ (pats', lie_req, tvs, ids, lie_avail) ->
-- possibly do the "make all tuple-pats irrefutable" test:
let
- unmangled_result = TuplePat pats' boxed
+ unmangled_result = TuplePat pats' boxity
-- Under flag control turn a pattern (x,y,z) into ~(x,y,z)
-- so that we can experiment with lazy tuple-matching.
-- it was easy to do.
possibly_mangled_result
- | opt_IrrefutableTuples && boxed = LazyPat unmangled_result
- | otherwise = unmangled_result
+ | opt_IrrefutableTuples && isBoxed boxity = LazyPat unmangled_result
+ | otherwise = unmangled_result
in
returnTc (possibly_mangled_result, lie_req, tvs, ids, lie_avail)
where
-- Check the constructor itself
tcConstructor pat name pat_ty `thenTc` \ (data_con, ex_tvs, dicts, lie_avail1, arg_tys) ->
let
- field_tys = zipEqual "tcPat"
- (map fieldLabelName (dataConFieldLabels data_con))
- arg_tys
+ -- not zipEqual: if the constructor isn't really a record, then
+ -- dataConFieldLabels will be empty (and each field in the pattern
+ -- will generate an error below).
+ field_tys = zip (map fieldLabelName (dataConFieldLabels data_con))
+ arg_tys
in
-- Check the fields
-- Instantiate it
let
- (tvs, theta, ex_tvs, ex_theta, arg_tys, tycon) = dataConSig data_con
+ (tvs, _, ex_tvs, ex_theta, arg_tys, tycon) = dataConSig data_con
-- Ignore the theta; overloaded constructors only
-- behave differently when called, not when used for
-- matching.
polyPatSig :: TcType -> SDoc
polyPatSig sig_ty
- = hang (ptext SLIT("Polymorphic type signature in pattern"))
+ = hang (ptext SLIT("Illegal polymorphic type signature in pattern:"))
4 (ppr sig_ty)
\end{code}