Andrei Borzenkov pushed to branch wip/sand-witch/make-set-field at Glasgow Haskell Compiler / GHC
Commits:
-
88d6c414
by Andrei Borzenkov at 2025-07-02T22:10:04+04:00
7 changed files:
- compiler/GHC/Builtin/Names.hs
- compiler/GHC/Core/Make.hs
- compiler/GHC/Tc/Instance/Class.hs
- compiler/GHC/Tc/Module.hs
- compiler/GHC/Tc/TyCl/Utils.hs
- compiler/GHC/Tc/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Exception/Base.hs
Changes:
| ... | ... | @@ -2308,7 +2308,7 @@ wildCardKey, absentErrorIdKey, absentConstraintErrorIdKey, augmentIdKey, appendI |
| 2308 | 2308 | noMethodBindingErrorIdKey, nonExhaustiveGuardsErrorIdKey,
|
| 2309 | 2309 | impossibleErrorIdKey, impossibleConstraintErrorIdKey,
|
| 2310 | 2310 | patErrorIdKey, voidPrimIdKey,
|
| 2311 | - realWorldPrimIdKey, recConErrorIdKey,
|
|
| 2311 | + realWorldPrimIdKey, recConErrorIdKey, recUpdErrorIdKey,
|
|
| 2312 | 2312 | unpackCStringUtf8IdKey, unpackCStringAppendUtf8IdKey, unpackCStringFoldrUtf8IdKey,
|
| 2313 | 2313 | unpackCStringIdKey, unpackCStringAppendIdKey, unpackCStringFoldrIdKey,
|
| 2314 | 2314 | typeErrorIdKey, divIntIdKey, modIntIdKey,
|
| ... | ... | @@ -2409,6 +2409,7 @@ rationalToFloatIdKey = mkPreludeMiscIdUnique 132 |
| 2409 | 2409 | rationalToDoubleIdKey = mkPreludeMiscIdUnique 133
|
| 2410 | 2410 | |
| 2411 | 2411 | seqHashKey = mkPreludeMiscIdUnique 134
|
| 2412 | +recUpdErrorIdKey = mkPreludeMiscIdUnique 135
|
|
| 2412 | 2413 | |
| 2413 | 2414 | coerceKey :: Unique
|
| 2414 | 2415 | coerceKey = mkPreludeMiscIdUnique 157
|
| ... | ... | @@ -42,7 +42,7 @@ module GHC.Core.Make ( |
| 42 | 42 | |
| 43 | 43 | -- * Error Ids
|
| 44 | 44 | mkRuntimeErrorApp, mkImpossibleExpr, mkAbsentErrorApp, errorIds,
|
| 45 | - rEC_CON_ERROR_ID,
|
|
| 45 | + rEC_CON_ERROR_ID, rEC_UPD_ERROR_ID,
|
|
| 46 | 46 | nON_EXHAUSTIVE_GUARDS_ERROR_ID, nO_METHOD_BINDING_ERROR_ID,
|
| 47 | 47 | pAT_ERROR_ID, rEC_SEL_ERROR_ID,
|
| 48 | 48 | tYPE_ERROR_ID, aBSENT_SUM_FIELD_ERROR_ID
|
| ... | ... | @@ -897,6 +897,7 @@ errorIds |
| 897 | 897 | nO_METHOD_BINDING_ERROR_ID,
|
| 898 | 898 | pAT_ERROR_ID,
|
| 899 | 899 | rEC_CON_ERROR_ID,
|
| 900 | + rEC_UPD_ERROR_ID,
|
|
| 900 | 901 | rEC_SEL_ERROR_ID,
|
| 901 | 902 | iMPOSSIBLE_ERROR_ID, iMPOSSIBLE_CONSTRAINT_ERROR_ID,
|
| 902 | 903 | aBSENT_ERROR_ID, aBSENT_CONSTRAINT_ERROR_ID,
|
| ... | ... | @@ -904,13 +905,14 @@ errorIds |
| 904 | 905 | tYPE_ERROR_ID -- Used with Opt_DeferTypeErrors, see #10284
|
| 905 | 906 | ]
|
| 906 | 907 | |
| 907 | -recSelErrorName, recConErrorName, patErrorName :: Name
|
|
| 908 | +recSelErrorName, recConErrorName, patErrorName, recUpdErrorName :: Name
|
|
| 908 | 909 | nonExhaustiveGuardsErrorName, noMethodBindingErrorName :: Name
|
| 909 | 910 | typeErrorName :: Name
|
| 910 | 911 | absentSumFieldErrorName :: Name
|
| 911 | 912 | |
| 912 | 913 | recSelErrorName = err_nm "recSelError" recSelErrorIdKey rEC_SEL_ERROR_ID
|
| 913 | 914 | recConErrorName = err_nm "recConError" recConErrorIdKey rEC_CON_ERROR_ID
|
| 915 | +recUpdErrorName = err_nm "recUpdError" recUpdErrorIdKey rEC_UPD_ERROR_ID
|
|
| 914 | 916 | patErrorName = err_nm "patError" patErrorIdKey pAT_ERROR_ID
|
| 915 | 917 | typeErrorName = err_nm "typeError" typeErrorIdKey tYPE_ERROR_ID
|
| 916 | 918 | |
| ... | ... | @@ -922,11 +924,12 @@ nonExhaustiveGuardsErrorName = err_nm "nonExhaustiveGuardsError" |
| 922 | 924 | err_nm :: String -> Unique -> Id -> Name
|
| 923 | 925 | err_nm str uniq id = mkWiredInIdName gHC_INTERNAL_CONTROL_EXCEPTION_BASE (fsLit str) uniq id
|
| 924 | 926 | |
| 925 | -rEC_SEL_ERROR_ID, rEC_CON_ERROR_ID :: Id
|
|
| 927 | +rEC_SEL_ERROR_ID, rEC_CON_ERROR_ID, rEC_UPD_ERROR_ID :: Id
|
|
| 926 | 928 | pAT_ERROR_ID, nO_METHOD_BINDING_ERROR_ID, nON_EXHAUSTIVE_GUARDS_ERROR_ID :: Id
|
| 927 | 929 | tYPE_ERROR_ID, aBSENT_SUM_FIELD_ERROR_ID :: Id
|
| 928 | 930 | rEC_SEL_ERROR_ID = mkRuntimeErrorId TypeLike recSelErrorName
|
| 929 | 931 | rEC_CON_ERROR_ID = mkRuntimeErrorId TypeLike recConErrorName
|
| 932 | +rEC_UPD_ERROR_ID = mkRuntimeErrorId TypeLike recUpdErrorName
|
|
| 930 | 933 | pAT_ERROR_ID = mkRuntimeErrorId TypeLike patErrorName
|
| 931 | 934 | nO_METHOD_BINDING_ERROR_ID = mkRuntimeErrorId TypeLike noMethodBindingErrorName
|
| 932 | 935 | nON_EXHAUSTIVE_GUARDS_ERROR_ID = mkRuntimeErrorId TypeLike nonExhaustiveGuardsErrorName
|
| ... | ... | @@ -1340,7 +1340,7 @@ matchSetField dflags short_cut clas tys mb_ct_loc |
| 1340 | 1340 | -- Use the equality proof to cast the selector Id to
|
| 1341 | 1341 | -- type (r -> a), then use the newtype coercion to cast
|
| 1342 | 1342 | -- it to a HasField dictionary.
|
| 1343 | - mk_ev (ev1:ev2:evs) = evDFunApp (dataConWrapId dCon) (tys ++ tvs)
|
|
| 1343 | + mk_ev (ev1:ev2:evs) = evDFunApp (dataConWrapId dCon) tys
|
|
| 1344 | 1344 | [ evSelector modifier_id tvs evs `Cast` co ev2
|
| 1345 | 1345 | , evSelector setter_id tvs evs `Cast` co ev1
|
| 1346 | 1346 | ]
|
| ... | ... | @@ -1395,7 +1395,7 @@ matchSetField dflags short_cut clas tys mb_ct_loc |
| 1395 | 1395 | pure (setter, modifier)
|
| 1396 | 1396 | Nothing -> do
|
| 1397 | 1397 | binds@((setter, _), (modifier,_)) <- mkSetFieldBinds tycon fl
|
| 1398 | - writeTcRef req_flds ((fl, binds) : reqs)
|
|
| 1398 | + updTcRef req_flds ((fl, binds) : )
|
|
| 1399 | 1399 | pure (setter, modifier)
|
| 1400 | 1400 |
|
| 1401 | 1401 | tc_inst_setfield_binds setter_id modifier_id
|
| ... | ... | @@ -579,12 +579,13 @@ tcRnSrcDecls explicit_mod_hdr export_ies decls |
| 579 | 579 | -- Emit Typeable bindings
|
| 580 | 580 | ; tcg_env <- setGblEnv tcg_env $
|
| 581 | 581 | mkTypeableBinds
|
| 582 | + |
|
| 582 | 583 | ; (tcg_env, recs_lie) <- setGblEnv tcg_env $
|
| 583 | 584 | captureTopConstraints $
|
| 584 | 585 | tcRecSetterBinds
|
| 585 | 586 | |
| 586 | 587 | ; rec_ev_binds <- restoreEnvs (tcg_env, tcl_env) $
|
| 587 | - simplifyTop recs_lie -- Is that required?
|
|
| 588 | + simplifyTop recs_lie -- TODO sand-witch: Is that required?
|
|
| 588 | 589 | |
| 589 | 590 | ; let new_ev_binds = main_ev_binds `mappend` rec_ev_binds
|
| 590 | 591 |
| ... | ... | @@ -42,7 +42,7 @@ import GHC.Hs |
| 42 | 42 | import GHC.Core.TyCo.Rep( Type(..), Coercion(..), MCoercion(..) )
|
| 43 | 43 | import GHC.Core.Multiplicity
|
| 44 | 44 | import GHC.Core.Predicate
|
| 45 | -import GHC.Core.Make( rEC_SEL_ERROR_ID )
|
|
| 45 | +import GHC.Core.Make( rEC_SEL_ERROR_ID, rEC_UPD_ERROR_ID )
|
|
| 46 | 46 | import GHC.Core.Class
|
| 47 | 47 | import GHC.Core.Type
|
| 48 | 48 | import GHC.Core.TyCon
|
| ... | ... | @@ -868,19 +868,22 @@ mkRecSelBind (tycon, fl) |
| 868 | 868 | mkOneRecordSelector :: [ConLike] -> RecSelParent -> FieldLabel -> FieldSelectors
|
| 869 | 869 | -> (Id, LHsBind GhcRn)
|
| 870 | 870 | mkOneRecordSelector all_cons idDetails fl has_sel
|
| 871 | - = collectFieldLabelInfo all_cons idDetails fl has_sel mkRecordSelectorBind
|
|
| 871 | + = collectFieldLabelInfo all_cons idDetails fl has_sel mkRecordSelectorBind
|
|
| 872 | 872 | |
| 873 | 873 | mkRecordSelectorBind :: RecordBindBuilder (Id, LHsBind GhcRn)
|
| 874 | -mkRecordSelectorBind = mk_record_bind mk_sel_ty mk_match where
|
|
| 874 | +mkRecordSelectorBind fl = mk_record_bind 1 err_expr mk_sel_ty mk_match fl where
|
|
| 875 | + |
|
| 876 | + err_expr = make_rec_error_expr fl rEC_SEL_ERROR_ID
|
|
| 877 | + |
|
| 875 | 878 | mk_sel_ty :: Type -> Type -> Type
|
| 876 | - mk_sel_ty data_ty field_ty =
|
|
| 879 | + mk_sel_ty data_ty field_ty =
|
|
| 877 | 880 | mkVisFunTyMany data_ty $
|
| 878 | 881 | -- Record selectors are always typed with Many. We
|
| 879 | 882 | -- could improve on it in the case where all the
|
| 880 | 883 | -- fields in all the constructor have multiplicity Many.
|
| 881 | 884 | field_ty
|
| 882 | 885 | |
| 883 | - mk_match sel_name match_ctxt con =
|
|
| 886 | + mk_match sel_name match_ctxt con =
|
|
| 884 | 887 | mkSimpleMatch match_ctxt
|
| 885 | 888 | (L loc [L loc (mk_sel_pat con)])
|
| 886 | 889 | (L loc (mkHsVar (L loc field_var)))
|
| ... | ... | @@ -915,7 +918,7 @@ tcRecSetterBinds = do |
| 915 | 918 | where
|
| 916 | 919 | remove_binds (n, ((setter, _), (modifier, _))) = (flSelector n, (setter, modifier))
|
| 917 | 920 | get_ids_to_check [] = []
|
| 918 | - get_ids_to_check ( (_, (setter, modifier)) : flds) =
|
|
| 921 | + get_ids_to_check ( (_, (setter, modifier)) : flds) =
|
|
| 919 | 922 | setter : modifier : get_ids_to_check flds
|
| 920 | 923 | |
| 921 | 924 | |
| ... | ... | @@ -928,41 +931,44 @@ mkSetFieldBinds tycon fl = |
| 928 | 931 | idDetails = RecSelData tycon
|
| 929 | 932 | |
| 930 | 933 | mk_field_lbl prefix uniq =
|
| 931 | - let
|
|
| 934 | + let
|
|
| 932 | 935 | lbl = flLabel fl
|
| 933 | 936 | newOcc = mkOccNameFS varName (mkFastString prefix `mappend` field_label lbl)
|
| 934 | - in fl {flSelector = flSelector fl `setNameUnique` uniq `tidyNameOcc` newOcc}
|
|
| 937 | + in fl { flSelector = flSelector fl `setNameUnique` uniq `tidyNameOcc` newOcc }
|
|
| 935 | 938 | |
| 936 | 939 | mk_binds cons_w_field rec_details ty_builder = do
|
| 937 | 940 | setter_fl <- mk_field_lbl "setter_" <$> newUnique
|
| 938 | - modifier_fd <- mk_field_lbl "modifier_" <$> newUnique
|
|
| 941 | + modifier_fl <- mk_field_lbl "modifier_" <$> newUnique
|
|
| 939 | 942 | let setter_bind = mkRecordSetterBind fl setter_fl all_cons cons_w_field rec_details ty_builder
|
| 940 | - modifier_bind = mkRecordModifierBind fl modifier_fd all_cons cons_w_field rec_details ty_builder
|
|
| 943 | + modifier_bind = mkRecordModifierBind fl modifier_fl all_cons cons_w_field rec_details ty_builder
|
|
| 941 | 944 | pure (setter_bind, modifier_bind)
|
| 942 | 945 | |
| 943 | - |
|
| 944 | 946 | mkRecordSetterBind :: FieldLabel -> RecordBindBuilder (Id, LHsBind GhcRn)
|
| 945 | -mkRecordSetterBind origFl fl = mk_record_bind mkRecordSetterType mk_match fl where
|
|
| 947 | +mkRecordSetterBind origFl fl = mk_record_bind 2 err_expr mkRecordSetterType mk_match fl where
|
|
| 946 | 948 | |
| 947 | - mk_match =
|
|
| 948 | - mk_set_fld_match (getOccName $ flSelector fl) origFl $
|
|
| 949 | + err_expr = make_rec_error_expr origFl rEC_UPD_ERROR_ID
|
|
| 950 | + |
|
| 951 | + mk_match =
|
|
| 952 | + mk_set_fld_match (getOccName $ flSelector origFl) origFl $
|
|
| 949 | 953 | \_ field_var -> (genWildPat, genLHsVar field_var)
|
| 950 | 954 | |
| 951 | 955 | mkRecordSetterType :: Type -> Type -> Type
|
| 952 | -mkRecordSetterType data_ty field_ty =
|
|
| 956 | +mkRecordSetterType data_ty field_ty =
|
|
| 953 | 957 | mkVisFunTyMany field_ty $
|
| 954 | 958 | mkVisFunTyMany data_ty data_ty
|
| 955 | 959 | |
| 956 | 960 | mkRecordModifierBind :: FieldLabel -> RecordBindBuilder (Id, LHsBind GhcRn)
|
| 957 | -mkRecordModifierBind origFl fl = mk_record_bind mkRecordModifierType mk_match fl where
|
|
| 961 | +mkRecordModifierBind origFl fl = mk_record_bind 2 err_expr mkRecordModifierType mk_match fl where
|
|
| 962 | + |
|
| 963 | + err_expr = make_rec_error_expr origFl rEC_UPD_ERROR_ID
|
|
| 958 | 964 | |
| 959 | - mk_match = mk_set_fld_match (mkOccName varName "f") origFl $ \i fun_var ->
|
|
| 965 | + mk_match = mk_set_fld_match (mkOccName varName "f") origFl $ \i fun_var ->
|
|
| 960 | 966 | let fld_nm = mk_set_fld_bind i fl
|
| 961 | 967 | expr = wrapGenSpan $ HsPar noExtField $ genLHsApp (genHsVar fun_var) (genLHsVar fld_nm)
|
| 962 | 968 | in (genVarPat fld_nm, expr)
|
| 963 | 969 | |
| 964 | 970 | mkRecordModifierType :: Type -> Type -> Type
|
| 965 | -mkRecordModifierType data_ty field_ty =
|
|
| 971 | +mkRecordModifierType data_ty field_ty =
|
|
| 966 | 972 | mkVisFunTyMany (mkVisFunTyMany field_ty field_ty) $
|
| 967 | 973 | mkVisFunTyMany data_ty data_ty
|
| 968 | 974 | |
| ... | ... | @@ -981,11 +987,11 @@ mk_set_fld_match occ_name fl on_fld setter_name match_ctxt con = |
| 981 | 987 | loc = noAnnSrcSpan (getSrcSpan setter_name)
|
| 982 | 988 | |
| 983 | 989 | |
| 984 | - mk_con_arg i fld_lbl
|
|
| 990 | + mk_con_arg i fld_lbl
|
|
| 985 | 991 | | fl == fld_lbl = on_fld i arg_var
|
| 986 | 992 | | otherwise =
|
| 987 | 993 | let fld_nm = mk_set_fld_bind i fld_lbl
|
| 988 | - in (genVarPat fld_nm, genLHsVar fld_nm)
|
|
| 994 | + in (genVarPat fld_nm, genLHsVar fld_nm)
|
|
| 989 | 995 | |
| 990 | 996 | arg_var = mkInternalName (mkBuiltinUnique 1) occ_name loc
|
| 991 | 997 | |
| ... | ... | @@ -993,14 +999,14 @@ mk_set_fld_bind :: Int -> FieldLabel -> Name |
| 993 | 999 | mk_set_fld_bind i fld_lbl =
|
| 994 | 1000 | mkInternalName (mkBuiltinUnique i)
|
| 995 | 1001 | (nameOccName $ flSelector $ fld_lbl)
|
| 996 | - generatedSrcSpan
|
|
| 1002 | + generatedSrcSpan
|
|
| 997 | 1003 | |
| 998 | 1004 | type ConLikeWithField = ConLike
|
| 999 | 1005 | |
| 1000 | -type RecordBindBuilder r =
|
|
| 1006 | +type RecordBindBuilder r =
|
|
| 1001 | 1007 | FieldLabel -> [ConLike] -> [ConLikeWithField] -> IdDetails -> ((Type -> Type -> Type) -> Type) -> r
|
| 1002 | 1008 | |
| 1003 | -type FldBindMatchBuilder =
|
|
| 1009 | +type FldBindMatchBuilder =
|
|
| 1004 | 1010 | Name -> HsMatchContext (LocatedN Name) -> ConLikeWithField -> LMatch GhcRn (LHsExpr GhcRn)
|
| 1005 | 1011 | |
| 1006 | 1012 | collectFieldLabelInfo :: [ConLike] ->
|
| ... | ... | @@ -1052,7 +1058,7 @@ collectFieldLabelInfo all_cons idDetails fl has_sel k |
| 1052 | 1058 | -- A slight hack!
|
| 1053 | 1059 | |
| 1054 | 1060 | sel_ty | is_naughty = \_ -> unitTy -- See Note [Naughty record selectors]
|
| 1055 | - | otherwise = \mk_ty ->
|
|
| 1061 | + | otherwise = \mk_ty ->
|
|
| 1056 | 1062 | mkForAllTys (tyVarSpecToBinders sel_tvbs) $
|
| 1057 | 1063 | -- Urgh! See Note [The stupid context] in GHC.Core.DataCon
|
| 1058 | 1064 | mkPhiTy (conLikeStupidTheta con1) $
|
| ... | ... | @@ -1060,11 +1066,21 @@ collectFieldLabelInfo all_cons idDetails fl has_sel k |
| 1060 | 1066 | mkPhiTy req_theta $
|
| 1061 | 1067 | mk_ty data_ty field_ty
|
| 1062 | 1068 | |
| 1063 | -mk_record_bind ::
|
|
| 1069 | +make_rec_error_expr :: FieldLabel -> Id -> LHsExpr GhcRn
|
|
| 1070 | +make_rec_error_expr fl err_id =
|
|
| 1071 | + genLHsApp
|
|
| 1072 | + (genHsVar (getName err_id))
|
|
| 1073 | + (genLHsLit msg_lit)
|
|
| 1074 | + where
|
|
| 1075 | + msg_lit = HsStringPrim NoSourceText (bytesFS (field_label (flLabel fl)))
|
|
| 1076 | + |
|
| 1077 | +mk_record_bind ::
|
|
| 1078 | + Int ->
|
|
| 1079 | + LHsExpr GhcRn ->
|
|
| 1064 | 1080 | (Type -> Type -> Type) ->
|
| 1065 | 1081 | FldBindMatchBuilder ->
|
| 1066 | 1082 | RecordBindBuilder (Id, LHsBind GhcRn)
|
| 1067 | -mk_record_bind mk_ty mk_match fl all_cons cons_w_field rec_details ty_builder
|
|
| 1083 | +mk_record_bind num_args err_expr mk_ty mk_match fl all_cons cons_w_field rec_details ty_builder
|
|
| 1068 | 1084 | = (sel_id, L loc sel_bind)
|
| 1069 | 1085 | where
|
| 1070 | 1086 | sel_ty = ty_builder mk_ty
|
| ... | ... | @@ -1092,10 +1108,8 @@ mk_record_bind mk_ty mk_match fl all_cons cons_w_field rec_details ty_builder |
| 1092 | 1108 | -- We do this explicitly so that we get a nice error message that
|
| 1093 | 1109 | -- mentions this particular record selector
|
| 1094 | 1110 | deflt | all dealt_with all_cons = []
|
| 1095 | - | otherwise = [mkSimpleMatch match_ctxt (wrapGenSpan [genWildPat])
|
|
| 1096 | - (genLHsApp
|
|
| 1097 | - (genHsVar (getName rEC_SEL_ERROR_ID))
|
|
| 1098 | - (genLHsLit msg_lit))]
|
|
| 1111 | + | otherwise = [mkSimpleMatch match_ctxt (wrapGenSpan (replicate num_args genWildPat))
|
|
| 1112 | + err_expr]
|
|
| 1099 | 1113 | |
| 1100 | 1114 | -- Do not add a default case unless there are unmatched
|
| 1101 | 1115 | -- constructors. We must take account of GADTs, else we
|
| ... | ... | @@ -1114,7 +1128,6 @@ mk_record_bind mk_ty mk_match fl all_cons cons_w_field rec_details ty_builder |
| 1114 | 1128 | inst_tys = dataConResRepTyArgs dc
|
| 1115 | 1129 | |
| 1116 | 1130 | unit_rhs = mkLHsTupleExpr [] noExtField
|
| 1117 | - msg_lit = HsStringPrim NoSourceText (bytesFS (field_label (flLabel fl)))
|
|
| 1118 | 1131 | |
| 1119 | 1132 | {-
|
| 1120 | 1133 | Note [Polymorphic selectors]
|
| ... | ... | @@ -561,7 +561,7 @@ data TcGblEnv |
| 561 | 561 | -- they all have a non-empty gre_imp field.
|
| 562 | 562 | tcg_keep :: TcRef NameSet,
|
| 563 | 563 | |
| 564 | - tcg_requested_fields :: TcRef [(FieldLabel, ((Id, LHsBind GhcRn), (Id, LHsBind GhcRn)))],
|
|
| 564 | + tcg_requested_fields :: TcRef [(FieldLabel, (FieldBind, FieldBind))],
|
|
| 565 | 565 | |
| 566 | 566 | tcg_th_used :: TcRef Bool,
|
| 567 | 567 | -- ^ @True@ \<=> Template Haskell syntax used.
|
| ... | ... | @@ -706,7 +706,8 @@ data TcGblEnv |
| 706 | 706 | -- ^ See Note [Generating fresh names for FFI wrappers]
|
| 707 | 707 | }
|
| 708 | 708 | |
| 709 | -type FieldInstEnv = NameEnv (Id, Id)
|
|
| 709 | +type FieldInstEnv = NameEnv (Id, Id)
|
|
| 710 | +type FieldBind = (Id, LHsBind GhcRn)
|
|
| 710 | 711 | |
| 711 | 712 | -- NB: topModIdentity, not topModSemantic!
|
| 712 | 713 | -- Definition sites of orphan identities will be identity modules, not semantic
|
| ... | ... | @@ -104,7 +104,7 @@ module GHC.Internal.Control.Exception.Base ( |
| 104 | 104 | finally,
|
| 105 | 105 | |
| 106 | 106 | -- * Calls for GHC runtime
|
| 107 | - recSelError, recConError,
|
|
| 107 | + recSelError, recConError, recUpdError,
|
|
| 108 | 108 | impossibleError, impossibleConstraintError,
|
| 109 | 109 | nonExhaustiveGuardsError, patError, noMethodBindingError,
|
| 110 | 110 | typeError,
|
| ... | ... | @@ -422,12 +422,14 @@ instance Exception NoMatchingContinuationPrompt |
| 422 | 422 | -----
|
| 423 | 423 | |
| 424 | 424 | -- See Note [Compiler error functions] in ghc-internal:GHC.Internal.Prim.Panic
|
| 425 | -recSelError, recConError, typeError,
|
|
| 425 | +recSelError, recUpdError, recConError, typeError,
|
|
| 426 | 426 | nonExhaustiveGuardsError, patError, noMethodBindingError
|
| 427 | 427 | :: Addr# -> a -- All take a UTF8-encoded C string
|
| 428 | 428 | |
| 429 | 429 | recSelError s = throw (RecSelError ("No match in record selector "
|
| 430 | 430 | ++ unpackCStringUtf8# s)) -- No location info unfortunately
|
| 431 | +recUpdError s = throw (RecUpdError ("No match in record update "
|
|
| 432 | + ++ unpackCStringUtf8# s)) -- No location info unfortunately
|
|
| 431 | 433 | nonExhaustiveGuardsError s = throw (PatternMatchFail (untangle s "Non-exhaustive guards in"))
|
| 432 | 434 | recConError s = throw (RecConError (untangle s "Missing field in record construction"))
|
| 433 | 435 | noMethodBindingError s = throw (NoMethodError (untangle s "No instance nor default method for class operation"))
|