Vladislav Zavialov pushed to branch wip/int-index/iethingwith-subwc at Glasgow Haskell Compiler / GHC Commits: 35031a58 by Vladislav Zavialov at 2026-05-15T23:24:37+03:00 WIP: Add NamespaseSpecifier to IEThingWith - - - - - 25 changed files: - compiler/GHC/Hs/ImpExp.hs - compiler/GHC/Parser/Errors/Ppr.hs - compiler/GHC/Parser/PostProcess.hs - compiler/GHC/Parser/PostProcess/Haddock.hs - compiler/GHC/Rename/Names.hs - compiler/GHC/Tc/Gen/Export.hs - compiler/Language/Haskell/Syntax/ImpExp.hs - testsuite/tests/parser/should_compile/T14189.stderr - + testsuite/tests/rename/should_compile/T25901_sub_w2_ok.hs - testsuite/tests/rename/should_compile/all.T - − testsuite/tests/rename/should_fail/T25901_sub_w.stderr - testsuite/tests/rename/should_fail/T25901_sub_w.hs → testsuite/tests/rename/should_fail/T25901_sub_w0_fail.hs - + testsuite/tests/rename/should_fail/T25901_sub_w0_fail.stderr - + testsuite/tests/rename/should_fail/T25901_sub_w1.hs - + testsuite/tests/rename/should_fail/T25901_sub_w1.stderr - + testsuite/tests/rename/should_fail/T25901_sub_w1_helper.hs - + testsuite/tests/rename/should_fail/T25901_sub_w2_fail.hs - + testsuite/tests/rename/should_fail/T25901_sub_w2_fail.stderr - testsuite/tests/rename/should_fail/all.T - + testsuite/tests/warnings/should_compile/DodgyExports05.hs - + testsuite/tests/warnings/should_compile/DodgyExports05.stderr - + testsuite/tests/warnings/should_compile/DodgyImports05.hs - + testsuite/tests/warnings/should_compile/DodgyImports05.stderr - testsuite/tests/warnings/should_compile/all.T - utils/check-exact/ExactPrint.hs Changes: ===================================== compiler/GHC/Hs/ImpExp.hs ===================================== @@ -111,6 +111,14 @@ deriving instance Eq (NamespaceSpecifier GhcPs) deriving instance Eq (NamespaceSpecifier GhcRn) deriving instance Eq (NamespaceSpecifier GhcTc) +deriving instance Data (IEWildcard GhcPs) +deriving instance Data (IEWildcard GhcRn) +deriving instance Data (IEWildcard GhcTc) + +deriving instance Eq (IEWildcard GhcPs) +deriving instance Eq (IEWildcard GhcRn) +deriving instance Eq (IEWildcard GhcTc) + -- --------------------------------------------------------------------- -- API Annotations types @@ -396,9 +404,9 @@ instance OutputableBndrId p => Outputable (IE (GhcPass p)) where case wc of NoIEWildcard -> map (ppr . unLoc) withs - IEWildcard pos -> + IEWildcard pos ns_spec -> let (bs, as) = splitAt pos (map (ppr . unLoc) withs) - in bs ++ [text ".."] ++ as + in bs ++ [ppr ns_spec <+> text ".."] ++ as ppr ie@(IEModuleContents _ mod') = sep $ catMaybes [ppr <$> ieDeprecation ie, Just $ text "module" <+> ppr mod'] ppr (IEWholeNamespace _ ns_spec) = ppr ns_spec <+> text ".." ===================================== compiler/GHC/Parser/Errors/Ppr.hs ===================================== @@ -281,8 +281,8 @@ instance Diagnostic PsMessage where [ text "Unsupported use of keyword" <+> quotes kw_doc , case pos of UnsupportedNameSpaceInIEThingWith -> - text "A namespace-specified wildcard may not appear alongside other items" - $$ text "in a list of children." ] + text "A namespace-specified wildcard may not appear alongside" + $$ text "other wildcards in a list of children." ] where kw_doc = case kw of ExplicitTypeNamespace{} -> text "type" ===================================== compiler/GHC/Parser/PostProcess.hs ===================================== @@ -174,7 +174,7 @@ import GHC.Utils.Panic import qualified GHC.Data.Strict as Strict import Control.Monad -import Text.ParserCombinators.ReadP as ReadP +import Text.ParserCombinators.ReadP as ReadP hiding (count) import Data.Char import Data.Data ( dataTypeOf, fromConstr, dataTypeConstrs ) import Data.Kind ( Type ) @@ -3325,14 +3325,17 @@ mkModuleImpExp ctx warning (top, tcp) (L l specname) subs = do let withs = map unLoc xs pos = fromMaybe (panic "ImpExpAllWith with no wildcard") $ -- should've been ImpExpList findIndex isImpExpQcWildcard withs - (m_kw,td,tc) = case withs !! pos of - ImpExpQcWildcard m_kw td tc -> (m_kw,td,tc) + m_kw = asum (map getImpExpQcWcKw withs) + ns_spec = namespaceSpecifierFromKw m_kw + (td,tc) = case withs !! pos of + ImpExpQcWildcard _ td tc -> (td,tc) _ -> panic "mkModuleImpExp: item is not a wildcard" -- shouldn't have matched isImpExpQcWildcard ies :: [LocatedA (IEWrappedName GhcPs)] ies = wrapped $ filter (not . isImpExpQcWildcard . unLoc) xs newName <- nameT patSyns <- getBit PatternSynonymsBit if | Just kw <- m_kw -> + unless (count isImpExpQcWildcard withs == 1) $ unsupportedExplicitNamespaceKeyword kw UnsupportedNameSpaceInIEThingWith | InImportList <- ctx -> addFatalError $ mkPlainErrorMsgEnvelope (locA l) PsErrIllegalImportBundleForm @@ -3340,7 +3343,7 @@ mkModuleImpExp ctx warning (top, tcp) (L l specname) subs = do addError $ mkPlainErrorMsgEnvelope (locA l) $ PsErrIllegalPatSynExport | otherwise -> return () let x = IEThingWithExt warning top td tc tcp - return $ IEThingWith x (L l newName) (IEWildcard pos) ies noExportDoc + return $ IEThingWith x (L l newName) (IEWildcard pos ns_spec) ies noExportDoc where noExportDoc :: Maybe (LHsDoc GhcPs) noExportDoc = Nothing @@ -3459,6 +3462,10 @@ isImpExpQcWildcard :: ImpExpQcSpec -> Bool isImpExpQcWildcard ImpExpQcWildcard{} = True isImpExpQcWildcard _ = False +getImpExpQcWcKw :: ImpExpQcSpec -> Maybe ExplicitNamespaceKeyword +getImpExpQcWcKw (ImpExpQcWildcard m_kw _ _) = m_kw +getImpExpQcWcKw _ = Nothing + ----------------------------------------------------------------------------- -- Warnings and failures ===================================== compiler/GHC/Parser/PostProcess/Haddock.hs ===================================== @@ -322,7 +322,7 @@ instance HasHaddock (LocatedA (IE GhcPs)) where IEVar ext nm _ -> IEVar ext nm mb_ldoc IEThingAbs ext nm _ -> IEThingAbs ext nm mb_ldoc IEThingAll ext ns nm _ -> IEThingAll ext ns nm mb_ldoc - IEThingWith ext nm wild subs _ -> IEThingWith ext nm wild subs mb_ldoc + IEThingWith ext nm wc subs _ -> IEThingWith ext nm wc subs mb_ldoc x -> x pure $ L l_export ie' ===================================== compiler/GHC/Rename/Names.hs ===================================== @@ -25,7 +25,8 @@ module GHC.Rename.Names ( renamePkgQual, renameRawPkgQual, classifyGREs, ImportDeclUsage, - rnNamespaceSpecifier + rnNamespaceSpecifier, + rnIEWildcard ) where import GHC.Prelude hiding ( head, init, last, tail ) @@ -1182,6 +1183,10 @@ rnNamespaceSpecifier (NoNamespaceSpecifier _) = NoNamespaceSpecifier noExtFiel rnNamespaceSpecifier (TypeNamespaceSpecifier x) = TypeNamespaceSpecifier x rnNamespaceSpecifier (DataNamespaceSpecifier x) = DataNamespaceSpecifier x +rnIEWildcard :: IEWildcard GhcPs -> IEWildcard GhcRn +rnIEWildcard NoIEWildcard = NoIEWildcard +rnIEWildcard (IEWildcard n ns_spec) = IEWildcard n (rnNamespaceSpecifier ns_spec) + filterImports :: HasDebugCallStack => HscEnv @@ -1379,13 +1384,30 @@ filterImports hsc_env iface decl_spec (Just (want_hiding, L l import_items)) , maybeToList $ mk_depr_export_warning gre) IEThingWith x ltc@(L l rdr_tc) wc rdr_ns _ -> do - ImpOccItem { imp_item = gre, imp_bundled = subnames } + ImpOccItem { imp_item = gre + , imp_bundled = bundled_gres + , imp_is_parent = is_par + } <- lookup_parent (IEThingAbs Nothing ltc noDocstring) (ieWrappedName rdr_tc) - let name = greName gre + let name = greName gre + ns_spec = case wc of + NoIEWildcard -> NoNamespaceSpecifier noExtField + IEWildcard _ n -> n + has_wc = case wc of + NoIEWildcard -> False + IEWildcard{} -> True + + child_gres, wc_gres :: [GlobalRdrElt] + child_gres + | is_par = filterByNamespaceSpecifierGREs ns_spec bundled_gres + | otherwise = [] + wc_gres + | has_wc = child_gres + | otherwise = [] -- Look up the children in the sub-names of the parent -- See Note [Importing DuplicateRecordFields] - let (children_errs, childnames) = lookupChildren subnames rdr_ns + let (children_errs, childnames) = lookupChildren bundled_gres rdr_ns bad_import_warns <- if null children_errs then return [] else @@ -1400,17 +1422,22 @@ filterImports hsc_env iface decl_spec (Just (want_hiding, L l import_items)) let name' = replaceWrappedName rdr_tc name childnames' = map (to_ie_post_rn . fmap greName) childnames - gres = gre : map unLoc childnames + explicit_gres = gre : map unLoc childnames + imp_list_wc_warn + | not has_wc = [] + | null child_gres = [DodgyImport (DodgyImportsEmptyParent ie ns_spec gre)] + | not (is_qual decl_spec) = [MissingImportList] + | otherwise = [] export_depr_warns - | want_hiding == Exactly = mapMaybe mk_depr_export_warning gres + | want_hiding == Exactly = mapMaybe mk_depr_export_warning explicit_gres | otherwise = [] renamed_ie = IEThingWith (x { ietw_warning = Nothing }) (L l name') - wc + (rnIEWildcard wc) childnames' noDocstring - return ( [(renamed_ie, gres)] - , bad_import_warns ++ export_depr_warns) + return ( [(renamed_ie, explicit_gres ++ wc_gres)] + , bad_import_warns ++ imp_list_wc_warn ++ export_depr_warns) IEWholeNamespace x ns_spec -> do let mod_name = moduleName import_mod @@ -2017,8 +2044,8 @@ findImportUsage imports used_gres where pn = lieWrappedName p xs = map lieWrappedName ns add_wc_all = case wc of - NoIEWildcard -> id - IEWildcard _ -> add_unused_all pn + NoIEWildcard -> id + IEWildcard _ _ns_spec -> add_unused_all pn add_unused (IEWholeNamespace x ns_spec) acc = add_unused_wildcard ns_spec (iewn_names x) acc add_unused _ acc = acc ===================================== compiler/GHC/Tc/Gen/Export.hs ===================================== @@ -648,8 +648,8 @@ exports_from_avail (Just (L _ rdr_items)) rdr_env imports this_mod wc_kids <- case wc of - NoIEWildcard -> return [] - IEWildcard _ -> lookup_ie_kids_all ie (NoNamespaceSpecifier noExtField) l par + NoIEWildcard -> return [] + IEWildcard _ ns_spec -> lookup_ie_kids_all ie ns_spec l par let name = greName par all_kids = with_kids ++ wc_kids @@ -670,7 +670,10 @@ exports_from_avail (Just (L _ rdr_items)) rdr_env imports this_mod return ( expacc{ expacc_exp_occs = occs' , expacc_warn_spans = export_warn_spans' , expacc_dont_warn = dont_warn_export' } - , L loc (IEThingWith x' (replaceLWrappedName l name) wc subs doc') + , L loc (IEThingWith x' (replaceLWrappedName l name) + (rnIEWildcard wc) + subs + doc') , Just $ AvailTC name all_names ) lookup_ie _ _ = panic "lookup_ie" -- Other cases covered earlier ===================================== compiler/Language/Haskell/Syntax/ImpExp.hs ===================================== @@ -110,7 +110,7 @@ data IE pass -- See Note [Located RdrNames] in GHC.Hs.Expr | IEThingWith (XIEThingWith pass) (LIEWrappedName pass) - IEWildcard + (IEWildcard pass) [LIEWrappedName pass] (Maybe (ExportDoc pass)) -- ^ Imported or exported thing with explicit subordinate list. @@ -166,13 +166,14 @@ data IE pass | XIE !(XXIE pass) -- | Wildcard in an import or export sublist, like the @..@ in --- @import Mod ( T(Mk1, Mk2, ..) )@. -data IEWildcard +-- @import Mod ( T(Mk1, Mk2, ..) )@ or @import Mod ( T(Mk1, type ..) )@. +data IEWildcard pass = NoIEWildcard -- ^ no wildcard in this list - | IEWildcard Int -- ^ wildcard after the given \# of items in this list + | IEWildcard Int (NamespaceSpecifier pass) + -- ^ wildcard after the given \# of items in this list, + -- with an optional namespace specifier -- The @Int@ is in the range [0..n], where n is the length -- of the list. - deriving (Eq, Data) -- | A name in an import or export specification which may have -- adornments. Used primarily for accurate pretty printing of ===================================== testsuite/tests/parser/should_compile/T14189.stderr ===================================== @@ -303,15 +303,14 @@ (EpaComments [])) (IEThingWith - ((,) + (IEThingWithExt (Nothing) - ((,,,) - (EpTok - (EpaSpan { T14189.hs:3:10 })) - (NoEpTok) - (NoEpTok) - (EpTok - (EpaSpan { T14189.hs:3:15 })))) + (EpTok + (EpaSpan { T14189.hs:3:10 })) + (NoEpTok) + (NoEpTok) + (EpTok + (EpaSpan { T14189.hs:3:15 }))) (L (EpAnn (EpaSpan { T14189.hs:3:3-8 }) ===================================== testsuite/tests/rename/should_compile/T25901_sub_w2_ok.hs ===================================== @@ -0,0 +1,12 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ExplicitNamespaces #-} + +module T25901_sub_w2_ok where + +import Data.Bool (Bool(False, data ..)) + +true :: Bool +true = True -- ok: imported via subordinate wildcard `data ..` + +false :: Bool +false = False -- ok: imported via explicit subordinate item `False` ===================================== testsuite/tests/rename/should_compile/all.T ===================================== @@ -256,3 +256,4 @@ test('T25901_exp_2', [extra_files(['T25901_exp_2_helper.hs'])], multimod_compile test('T25901_sub_e', normal, compile, ['']) test('T25901_sub_f', normal, compile, ['-Wdodgy-exports -Wno-duplicate-exports']) test('T25901_sub_g', [extra_files(['T25901_sub_g_helper.hs'])], multimod_compile, ['T25901_sub_g', '-v0 -Wdodgy-imports']) +test('T25901_sub_w2_ok', normal, compile, ['']) ===================================== testsuite/tests/rename/should_fail/T25901_sub_w.stderr deleted ===================================== @@ -1,15 +0,0 @@ -T25901_sub_w.hs:3:29: error: [GHC-04611] - • Unsupported use of keyword ‘data’ - • A namespace-specified wildcard may not appear alongside other items - in a list of children. - -T25901_sub_w.hs:5:31: error: [GHC-04611] - • Unsupported use of keyword ‘data’ - • A namespace-specified wildcard may not appear alongside other items - in a list of children. - -T25901_sub_w.hs:6:25: error: [GHC-04611] - • Unsupported use of keyword ‘type’ - • A namespace-specified wildcard may not appear alongside other items - in a list of children. - ===================================== testsuite/tests/rename/should_fail/T25901_sub_w.hs → testsuite/tests/rename/should_fail/T25901_sub_w0_fail.hs ===================================== @@ -1,8 +1,7 @@ {-# LANGUAGE ExplicitNamespaces #-} -module T25901_sub_w (T(MkT, data ..)) where +module T25901_sub_w0_fail (T(.., data ..)) where -import Data.Bool (Bool(False, data ..)) import GHC.Exts (IsList(type .., data ..)) data T = MkT ===================================== testsuite/tests/rename/should_fail/T25901_sub_w0_fail.stderr ===================================== @@ -0,0 +1,10 @@ +T25901_sub_w0_fail.hs:3:34: error: [GHC-04611] + • Unsupported use of keyword ‘data’ + • A namespace-specified wildcard may not appear alongside + other wildcards in a list of children. + +T25901_sub_w0_fail.hs:5:25: error: [GHC-04611] + • Unsupported use of keyword ‘type’ + • A namespace-specified wildcard may not appear alongside + other wildcards in a list of children. + ===================================== testsuite/tests/rename/should_fail/T25901_sub_w1.hs ===================================== @@ -0,0 +1,26 @@ +{-# LANGUAGE TemplateHaskell #-} + +module T25901_sub_w1 where + +import Data.Kind (Type) +import T25901_sub_w1_helper + +-- This is OK +type F' :: Type -> Type -> Type +type F' a b = F a b + +-- This is OK +f', g', (#.) :: C a b => a -> b -> () +f' = f +g' = g +(#.) = (#) + +$(return []) -- ensure we check the term-level definitions above + +-- This should fail because 'G' is not exported by T25901_sub_w1_helper +type G' :: Type -> Type -> Type +type G' a b = G a b + +-- This should fail because (#) in the type namespace is not exported by T25901_sub_w1_helper +type (#.) :: Type -> Type -> Type +type a #. b = a # b ===================================== testsuite/tests/rename/should_fail/T25901_sub_w1.stderr ===================================== @@ -0,0 +1,6 @@ +T25901_sub_w1.hs:22:15: error: [GHC-76037] + Not in scope: type constructor or class ‘G’ + +T25901_sub_w1.hs:26:17: error: [GHC-76037] + Not in scope: type constructor or class ‘#’ + ===================================== testsuite/tests/rename/should_fail/T25901_sub_w1_helper.hs ===================================== @@ -0,0 +1,17 @@ +{-# LANGUAGE ExplicitNamespaces, TypeFamilies #-} + +-- Exported: +-- * class 'C' +-- * term operator (#) +-- * methods 'f' and 'g' +-- * associated type 'F' +-- Not exported: +-- * type operator (#) +-- * associated type 'G' +module T25901_sub_w1_helper (C(data .., F)) where + +class C a b where + type F a b + type G a b + type a # b + f, g, (#) :: a -> b -> () \ No newline at end of file ===================================== testsuite/tests/rename/should_fail/T25901_sub_w2_fail.hs ===================================== @@ -0,0 +1,12 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ExplicitNamespaces #-} + +module T25901_sub_w2_fail where + +import Data.Bool (Bool(False, type ..)) + +true :: Bool +true = True -- error: /not/ imported via subordinate wildcard `type ..` + +false :: Bool +false = False -- ok: imported via explicit subordinate item `False` ===================================== testsuite/tests/rename/should_fail/T25901_sub_w2_fail.stderr ===================================== @@ -0,0 +1,7 @@ +T25901_sub_w2_fail.hs:9:8: error: [GHC-88464] + Data constructor not in scope: True :: Bool + Suggested fixes: + • Perhaps use variable ‘true’ (line 9) + • Add ‘True’ to the import list in the import of ‘Data.Bool’ + (at T25901_sub_w2_fail.hs:6:1-39). + ===================================== testsuite/tests/rename/should_fail/all.T ===================================== @@ -262,5 +262,7 @@ test('T25901_sub_a', normal, compile_fail, ['']) test('T25901_sub_b', normal, compile_fail, ['']) test('T25901_sub_c', [extra_files(['T25901_sub_c_helper.hs'])], multimod_compile_fail, ['T25901_sub_c', '-v0']) test('T25901_sub_d', [extra_files(['T25901_sub_d_helper.hs'])], multimod_compile_fail, ['T25901_sub_d', '-v0']) -test('T25901_sub_w', normal, compile_fail, ['']) +test('T25901_sub_w0_fail', normal, compile_fail, ['']) +test('T25901_sub_w2_fail', normal, compile_fail, ['']) +test('T25901_sub_w1', [extra_files(['T25901_sub_w1_helper.hs'])], multimod_compile_fail, ['T25901_sub_w1', '-v0']) test('T26545', normal, compile_fail, ['']) ===================================== testsuite/tests/warnings/should_compile/DodgyExports05.hs ===================================== @@ -0,0 +1,5 @@ +{-# LANGUAGE ExplicitNamespaces #-} + +module DodgyExports05 + ( Bool(False, type ..) + ) where \ No newline at end of file ===================================== testsuite/tests/warnings/should_compile/DodgyExports05.stderr ===================================== @@ -0,0 +1,5 @@ +DodgyExports05.hs:4:5: warning: [GHC-75356] [-Wdodgy-exports (in -Wextra)] + The export item ‘Bool(False, type ..)’ suggests that + ‘Bool’ has associated types, + but it is not a class + ===================================== testsuite/tests/warnings/should_compile/DodgyImports05.hs ===================================== @@ -0,0 +1,6 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ExplicitNamespaces #-} + +module DodgyImports05 where + +import Data.Bool (Bool(False, type ..)) \ No newline at end of file ===================================== testsuite/tests/warnings/should_compile/DodgyImports05.stderr ===================================== @@ -0,0 +1,5 @@ +DodgyImports05.hs:6:19: warning: [GHC-99623] [-Wdodgy-imports (in -Wextra)] + The import item ‘Bool(False, type ..)’ suggests that + ‘GHC.Internal.Types.Bool’ has associated types, + but it is not a class + ===================================== testsuite/tests/warnings/should_compile/all.T ===================================== @@ -56,6 +56,7 @@ test('T19296', normal, compile, ['-fdiagnostics-show-caret -Wredundant-constrain test('DodgyExports01', normal, compile, ['-Wdodgy-exports']) test('DodgyExports02', normal, compile, ['-Wdodgy-exports']) test('DodgyExports03', normal, compile, ['-Wdodgy-exports']) +test('DodgyExports05', normal, compile, ['-Wdodgy-exports']) test('T25901_exp_dodgy', normal, compile, ['-Wdodgy-exports']) test('T25901_exp_dup_wc_1', normal, compile, ['-Wduplicate-exports']) test('T25901_exp_dup_wc_2', normal, compile, ['-Wduplicate-exports']) @@ -74,6 +75,7 @@ test('DodgyImports_hiding', normal, compile, ['-Wdodgy-imports']) test('DodgyImports02', normal, compile, ['-Wdodgy-imports']) test('DodgyImports03', [extra_files(["DodgyImports03_helper.hs"])], multimod_compile, ['DodgyImports03', '-Wdodgy-imports -v0']) test('DodgyImports04', normal, compile, ['-Wdodgy-imports']) +test('DodgyImports05', normal, compile, ['-Wdodgy-imports']) test('T22702a', normal, compile, ['']) test('T22702b', normal, compile, ['']) test('T22826', normal, compile, ['']) ===================================== utils/check-exact/ExactPrint.hs ===================================== @@ -4594,18 +4594,19 @@ instance ExactPrint (IE GhcPs) where depr' <- markAnnotated (ietw_warning x) thing' <- markAnnotated thing op' <- markEpToken (ietw_tok_lpar x) - (dd',c', wc', withs') <- + (dd', c', wc', withs') <- case wc of NoIEWildcard -> do withs'' <- markAnnotated withs return (ietw_tok_wc x, ietw_tok_comma x, wc, withs'') - IEWildcard pos -> do + IEWildcard pos ns_spec -> do let (bs, as) = splitAt pos withs bs' <- markAnnotated bs + ns_spec' <- markAnnotated ns_spec dd' <- markEpToken (ietw_tok_wc x) c' <- markEpToken (ietw_tok_comma x) as' <- markAnnotated as - return (dd',c', wc, bs'++as') + return (dd', c', IEWildcard pos ns_spec', bs'++as') cp' <- markEpToken (ietw_tok_rpar x) doc' <- markAnnotated doc let x' = IEThingWithExt depr' op' dd' c' cp' View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/35031a580fce3c12acd50cae27cac224... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/35031a580fce3c12acd50cae27cac224... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Vladislav Zavialov (@int-index)