[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 4 commits: Fix #18052 by using pprPrefixOcc in more places
Marge Bot
gitlab at gitlab.haskell.org
Fri Apr 17 09:35:11 UTC 2020
Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
22cc8e51 by Ryan Scott at 2020-04-15T17:48:47-04:00
Fix #18052 by using pprPrefixOcc in more places
This fixes several small oversights in the choice of pretty-printing
function to use. Fixes #18052.
- - - - -
ec77b2f1 by Daniel Gröber at 2020-04-15T17:49:24-04:00
rts: ProfHeap: Fix wrong time in last heap profile sample
We've had this longstanding issue in the heap profiler, where the time of
the last sample in the profile is sometimes way off causing the rendered
graph to be quite useless for long runs.
It seems to me the problem is that we use mut_user_time() for the last
sample as opposed to getRTSStats(), which we use when calling heapProfile()
in GC.c.
The former is equivalent to getProcessCPUTime() but the latter does
some additional stuff:
getProcessCPUTime() - end_init_cpu - stats.gc_cpu_ns -
stats.nonmoving_gc_cpu_ns
So to fix this just use getRTSStats() in both places.
- - - - -
5952a9dd by Sylvain Henry at 2020-04-17T05:35:00-04:00
Hadrian: fix dyn_o/dyn_hi rule (#17534)
- - - - -
eefc926c by Ryan Scott at 2020-04-17T05:35:01-04:00
Fix #18065 by fixing an InstCo oversight in Core Lint
There was a small thinko in Core Lint's treatment of `InstCo`
coercions that ultimately led to #18065. The fix: add an apostrophe.
That's it!
Fixes #18065.
Co-authored-by: Simon Peyton Jones <simonpj at microsoft.com>
- - - - -
14 changed files:
- compiler/GHC/Core/Lint.hs
- compiler/GHC/Core/Ppr.hs
- compiler/GHC/Tc/Module.hs
- hadrian/src/Rules/Compile.hs
- rts/ProfHeap.c
- + testsuite/tests/ghci/should_fail/T18052b.script
- + testsuite/tests/ghci/should_fail/T18052b.stderr
- testsuite/tests/ghci/should_fail/all.T
- + testsuite/tests/indexed-types/should_compile/T18065.hs
- testsuite/tests/indexed-types/should_compile/all.T
- testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr
- + testsuite/tests/printer/T18052a.hs
- + testsuite/tests/printer/T18052a.stderr
- testsuite/tests/printer/all.T
Changes:
=====================================
compiler/GHC/Core/Lint.hs
=====================================
@@ -2030,21 +2030,21 @@ lintCoercion the_co@(LRCo lr co)
lintCoercion (InstCo co arg)
= do { co' <- lintCoercion co
; arg' <- lintCoercion arg
- ; let Pair t1' t2' = coercionKind co'
- Pair s1 s2 = coercionKind arg
+ ; let Pair t1 t2 = coercionKind co'
+ Pair s1 s2 = coercionKind arg'
; lintRole arg Nominal (coercionRole arg')
- ; case (splitForAllTy_ty_maybe t1', splitForAllTy_ty_maybe t2') of
+ ; case (splitForAllTy_ty_maybe t1, splitForAllTy_ty_maybe t2) of
-- forall over tvar
{ (Just (tv1,_), Just (tv2,_))
| typeKind s1 `eqType` tyVarKind tv1
, typeKind s2 `eqType` tyVarKind tv2
-> return (InstCo co' arg')
| otherwise
- -> failWithL (text "Kind mis-match in inst coercion")
+ -> failWithL (text "Kind mis-match in inst coercion1" <+> ppr co)
- ; _ -> case (splitForAllTy_co_maybe t1', splitForAllTy_co_maybe t2') of
+ ; _ -> case (splitForAllTy_co_maybe t1, splitForAllTy_co_maybe t2) of
-- forall over covar
{ (Just (cv1, _), Just (cv2, _))
| typeKind s1 `eqType` varType cv1
@@ -2053,7 +2053,7 @@ lintCoercion (InstCo co arg)
, CoercionTy _ <- s2
-> return (InstCo co' arg')
| otherwise
- -> failWithL (text "Kind mis-match in inst coercion")
+ -> failWithL (text "Kind mis-match in inst coercion2" <+> ppr co)
; _ -> failWithL (text "Bad argument of inst") }}}
=====================================
compiler/GHC/Core/Ppr.hs
=====================================
@@ -123,11 +123,13 @@ ppr_binding ann (val_bdr, expr)
, pp_bind
]
where
+ pp_val_bdr = pprPrefixOcc val_bdr
+
pp_bind = case bndrIsJoin_maybe val_bdr of
Nothing -> pp_normal_bind
Just ar -> pp_join_bind ar
- pp_normal_bind = hang (ppr val_bdr) 2 (equals <+> pprCoreExpr expr)
+ pp_normal_bind = hang pp_val_bdr 2 (equals <+> pprCoreExpr expr)
-- For a join point of join arity n, we want to print j = \x1 ... xn -> e
-- as "j x1 ... xn = e" to differentiate when a join point returns a
@@ -135,7 +137,7 @@ ppr_binding ann (val_bdr, expr)
-- an n-argument function).
pp_join_bind join_arity
| bndrs `lengthAtLeast` join_arity
- = hang (ppr val_bdr <+> sep (map (pprBndr LambdaBind) lhs_bndrs))
+ = hang (pp_val_bdr <+> sep (map (pprBndr LambdaBind) lhs_bndrs))
2 (equals <+> pprCoreExpr rhs)
| otherwise -- Yikes! A join-binding with too few lambda
-- Lint will complain, but we don't want to crash
@@ -164,8 +166,10 @@ ppr_expr :: OutputableBndr b => (SDoc -> SDoc) -> Expr b -> SDoc
-- an atomic value (e.g. function args)
ppr_expr add_par (Var name)
- | isJoinId name = add_par ((text "jump") <+> ppr name)
- | otherwise = ppr name
+ | isJoinId name = add_par ((text "jump") <+> pp_name)
+ | otherwise = pp_name
+ where
+ pp_name = pprPrefixOcc name
ppr_expr add_par (Type ty) = add_par (text "TYPE:" <+> ppr ty) -- Weird
ppr_expr add_par (Coercion co) = add_par (text "CO:" <+> ppr co)
ppr_expr add_par (Lit lit) = pprLiteral add_par lit
@@ -429,7 +433,7 @@ pprKindedTyVarBndr tyvar
-- pprIdBndr does *not* print the type
-- When printing any Id binder in debug mode, we print its inline pragma and one-shot-ness
pprIdBndr :: Id -> SDoc
-pprIdBndr id = ppr id <+> pprIdBndrInfo (idInfo id)
+pprIdBndr id = pprPrefixOcc id <+> pprIdBndrInfo (idInfo id)
pprIdBndrInfo :: IdInfo -> SDoc
pprIdBndrInfo info
=====================================
compiler/GHC/Tc/Module.hs
=====================================
@@ -2122,7 +2122,7 @@ tcRnStmt hsc_env rdr_stmt
}
where
bad_unboxed id = addErr (sep [text "GHCi can't bind a variable of unlifted type:",
- nest 2 (ppr id <+> dcolon <+> ppr (idType id))])
+ nest 2 (pprPrefixOcc id <+> dcolon <+> ppr (idType id))])
{-
--------------------------------------------------------------------------
@@ -2903,7 +2903,7 @@ ppr_types debug type_env
-- etc are suppressed (unless -dppr-debug),
-- because they appear elsewhere
- ppr_sig id = hang (ppr id <+> dcolon) 2 (ppr (tidyTopType (idType id)))
+ ppr_sig id = hang (pprPrefixOcc id <+> dcolon) 2 (ppr (tidyTopType (idType id)))
ppr_tycons :: Bool -> [FamInst] -> TypeEnv -> SDoc
ppr_tycons debug fam_insts type_env
@@ -2921,7 +2921,7 @@ ppr_tycons debug fam_insts type_env
| otherwise = isExternalName (tyConName tycon) &&
not (tycon `elem` fi_tycons)
ppr_tc tc
- = vcat [ hang (ppr (tyConFlavour tc) <+> ppr tc
+ = vcat [ hang (ppr (tyConFlavour tc) <+> pprPrefixOcc (tyConName tc)
<> braces (ppr (tyConArity tc)) <+> dcolon)
2 (ppr (tidyTopType (tyConKind tc)))
, nest 2 $
@@ -2955,7 +2955,7 @@ ppr_patsyns type_env
= ppr_things "PATTERN SYNONYMS" ppr_ps
(typeEnvPatSyns type_env)
where
- ppr_ps ps = ppr ps <+> dcolon <+> pprPatSynType ps
+ ppr_ps ps = pprPrefixOcc ps <+> dcolon <+> pprPatSynType ps
ppr_insts :: [ClsInst] -> SDoc
ppr_insts ispecs
=====================================
hadrian/src/Rules/Compile.hs
=====================================
@@ -55,7 +55,22 @@ compilePackage rs = do
&%> \ [dyn_o, _dyn_hi] -> do
p <- platformSupportsSharedLibs
if p
- then need [dyn_o -<.> "o", dyn_o -<.> "hi"]
+ then do
+ -- We `need` ".o/.hi" because GHC is called with `-dynamic-too`
+ -- and builds ".dyn_o/.dyn_hi" too.
+ changed <- needHasChanged [dyn_o -<.> "o", dyn_o -<.> "hi"]
+
+ -- If for some reason a previous Hadrian execution has been
+ -- interrupted after the rule for .o/.hi generation has completed
+ -- but before the current rule for .dyn_o/.dyn_hi has completed,
+ -- or if some of the dynamic artifacts have been removed by the
+ -- user, "needing" the non dynamic artifacts is not enough as
+ -- Shake won't execute the associated action. Hence we detect
+ -- this case and we explictly build the dynamic artifacts here:
+ case changed of
+ [] -> compileHsObjectAndHi rs dyn_o
+ _ -> pure ()
+
else compileHsObjectAndHi rs dyn_o
forM_ ((,) <$> hsExts <*> wayPats) $ \ ((oExt, hiExt), wayPat) ->
=====================================
rts/ProfHeap.c
=====================================
@@ -552,8 +552,6 @@ initHeapProfiling(void)
void
endHeapProfiling(void)
{
- StgDouble seconds;
-
if (! RtsFlags.ProfFlags.doHeapProfile) {
return;
}
@@ -596,7 +594,10 @@ endHeapProfiling(void)
stgFree(censuses);
- seconds = mut_user_time();
+ RTSStats stats;
+ getRTSStats(&stats);
+ Time mut_time = stats.mutator_cpu_ns;
+ StgDouble seconds = TimeToSecondsDbl(mut_time);
printSample(true, seconds);
printSample(false, seconds);
fclose(hp_file);
=====================================
testsuite/tests/ghci/should_fail/T18052b.script
=====================================
@@ -0,0 +1,2 @@
+:set -XMagicHash
+let (%%%) = 1#
=====================================
testsuite/tests/ghci/should_fail/T18052b.stderr
=====================================
@@ -0,0 +1,3 @@
+
+<interactive>:1:1: error:
+ GHCi can't bind a variable of unlifted type: (%%%) :: GHC.Prim.Int#
=====================================
testsuite/tests/ghci/should_fail/all.T
=====================================
@@ -3,3 +3,4 @@ test('T10549a', [], ghci_script, ['T10549a.script'])
test('T15055', normalise_version('ghc'), ghci_script, ['T15055.script'])
test('T16013', [], ghci_script, ['T16013.script'])
test('T16287', [], ghci_script, ['T16287.script'])
+test('T18052b', [], ghci_script, ['T18052b.script'])
=====================================
testsuite/tests/indexed-types/should_compile/T18065.hs
=====================================
@@ -0,0 +1,108 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+module T18065 where
+
+import Data.Kind
+import Data.List.NonEmpty (NonEmpty(..))
+
+type family Sing :: k -> Type
+data TyFun :: Type -> Type -> Type
+type a ~> b = TyFun a b -> Type
+infixr 0 ~>
+type family Apply (f :: a ~> b) (x :: a) :: b
+
+type SingFunction1 f = forall t. Sing t -> Sing (f `Apply` t)
+singFun1 :: forall f. SingFunction1 f -> Sing f
+singFun1 f = SLambda f
+
+type SingFunction2 f = forall t1 t2. Sing t1 -> Sing t2 -> Sing (f `Apply` t1 `Apply` t2)
+singFun2 :: forall f. SingFunction2 f -> Sing f
+singFun2 f = SLambda (\x -> singFun1 (f x))
+
+newtype SLambda (f :: a ~> b) =
+ SLambda { applySing :: forall t. Sing t -> Sing (f `Apply` t) }
+type instance Sing = SLambda
+
+data SList :: forall a. [a] -> Type where
+ SNil :: SList '[]
+ SCons :: Sing x -> Sing xs -> SList (x:xs)
+type instance Sing = SList
+
+data SNonEmpty :: forall a. NonEmpty a -> Type where
+ (:%|) :: Sing x -> Sing xs -> SNonEmpty (x:|xs)
+type instance Sing = SNonEmpty
+
+type family Id (x :: a) :: a where
+ Id x = x
+data IdSym0 :: a ~> a
+type instance Apply IdSym0 x = Id x
+sId :: forall a (x :: a). Sing x -> Sing (Id x)
+sId sx = sx
+
+type family (.) (f :: b ~> c) (g :: a ~> b) (x :: a) :: c where
+ (f . g) x = f `Apply` (g `Apply` x)
+data (.@#@$) :: (b ~> c) ~> (a ~> b) ~> a ~> c
+data (.@#@$$) :: (b ~> c) -> (a ~> b) ~> a ~> c
+data (.@#@$$$) :: (b ~> c) -> (a ~> b) -> a ~> c
+type instance Apply (.@#@$) f = (.@#@$$) f
+type instance Apply ((.@#@$$) f) g = (.@#@$$$) f g
+type instance Apply ((.@#@$$$) f g) x = (f . g) x
+(%.) :: forall b c a (f :: b ~> c) (g :: a ~> b) (x :: a).
+ Sing f -> Sing g -> Sing x -> Sing ((f . g) x)
+(%.) sf sg sx = sf `applySing` (sg `applySing` sx)
+
+type family Go (k :: a ~> b ~> b) (z :: b) (l :: [a]) :: b where
+ Go _ z '[] = z
+ Go k z (y:ys) = k `Apply` y `Apply` Go k z ys
+data GoSym :: (a ~> b ~> b) -> b -> [a] ~> b
+type instance Apply (GoSym k z) l = Go k z l
+type family Listfoldr (k :: a ~> b ~> b) (z :: b) (l :: [a]) :: b where
+ Listfoldr k z l = Go k z l
+sListfoldr :: forall a b (k :: a ~> b ~> b) (z :: b) (l :: [a]).
+ Sing k -> Sing z -> Sing l -> Sing (Listfoldr k z l)
+sListfoldr sk sz = sGo
+ where
+ sGo :: forall l'. Sing l' -> Sing (GoSym k z `Apply` l')
+ sGo SNil = sz
+ sGo (sy `SCons` sys) = sk `applySing` sy `applySing` sGo sys
+
+class PMonoid a where
+ type Mempty :: a
+ type Mappend (x :: a) (y :: a) :: a
+data MappendSym0 :: a ~> a ~> a
+data MappendSym1 :: a -> a ~> a
+type instance Apply MappendSym0 x = MappendSym1 x
+type instance Apply (MappendSym1 x) y = Mappend x y
+class SMonoid a where
+ sMempty :: Sing (Mempty :: a)
+ sMappend :: forall (x :: a) (y :: a). Sing x -> Sing y -> Sing (Mappend x y)
+
+class PFoldable t where
+ type Foldr (f :: a ~> b ~> b) (z :: b) (l :: t a) :: b
+instance PFoldable [] where
+ type Foldr f z l = Listfoldr f z l
+class SFoldable t where
+ sFoldr :: forall a b (f :: a ~> b ~> b) (z :: b) (l :: t a).
+ Sing f -> Sing z -> Sing l -> Sing (Foldr f z l)
+instance SFoldable [] where
+ sFoldr = sListfoldr
+
+type family FoldMap (f :: a ~> m) (l :: t a) :: m where
+ FoldMap f l = Foldr (MappendSym0 .@#@$$$ f) Mempty l
+sFoldMap :: forall t a m (f :: a ~> m) (l :: t a).
+ (SFoldable t, SMonoid m)
+ => Sing f -> Sing l -> Sing (FoldMap f l)
+sFoldMap sf = sFoldr (singFun2 @((.@#@$$) MappendSym0) (singFun2 @MappendSym0 sMappend %.) `applySing` sf) sMempty
+
+type family NEFold (l :: NonEmpty m) :: m where
+ NEFold (a :| as) = a `Mappend` FoldMap IdSym0 as
+sNEFold :: forall m (l :: NonEmpty m). SMonoid m
+ => Sing l -> Sing (NEFold l)
+sNEFold (sa :%| sas) = sa `sMappend` sFoldMap (singFun1 @IdSym0 sId) sas
=====================================
testsuite/tests/indexed-types/should_compile/all.T
=====================================
@@ -295,3 +295,4 @@ test('T17008b', normal, compile, [''])
test('T17056', normal, compile, [''])
test('T17405', normal, multimod_compile, ['T17405c', '-v0'])
test('T17923', normal, compile, [''])
+test('T18065', normal, compile, ['-O'])
=====================================
testsuite/tests/partial-sigs/should_compile/ExtraConstraints3.stderr
=====================================
@@ -1,28 +1,28 @@
TYPE SIGNATURES
- !! :: forall {a}. [a] -> Int -> a
- $ :: forall {a} {b}. (a -> b) -> a -> b
- $! :: forall {a} {b}. (a -> b) -> a -> b
- && :: Bool -> Bool -> Bool
- * :: forall {a}. Num a => a -> a -> a
- ** :: forall {a}. Floating a => a -> a -> a
- + :: forall {a}. Num a => a -> a -> a
- ++ :: forall {a}. [a] -> [a] -> [a]
- - :: forall {a}. Num a => a -> a -> a
- . :: forall {b} {c} {a}. (b -> c) -> (a -> b) -> a -> c
- / :: forall {a}. Fractional a => a -> a -> a
- /= :: forall {a}. Eq a => a -> a -> Bool
- < :: forall {a}. Ord a => a -> a -> Bool
- <= :: forall {a}. Ord a => a -> a -> Bool
- =<< ::
+ (!!) :: forall {a}. [a] -> Int -> a
+ ($) :: forall {a} {b}. (a -> b) -> a -> b
+ ($!) :: forall {a} {b}. (a -> b) -> a -> b
+ (&&) :: Bool -> Bool -> Bool
+ (*) :: forall {a}. Num a => a -> a -> a
+ (**) :: forall {a}. Floating a => a -> a -> a
+ (+) :: forall {a}. Num a => a -> a -> a
+ (++) :: forall {a}. [a] -> [a] -> [a]
+ (-) :: forall {a}. Num a => a -> a -> a
+ (.) :: forall {b} {c} {a}. (b -> c) -> (a -> b) -> a -> c
+ (/) :: forall {a}. Fractional a => a -> a -> a
+ (/=) :: forall {a}. Eq a => a -> a -> Bool
+ (<) :: forall {a}. Ord a => a -> a -> Bool
+ (<=) :: forall {a}. Ord a => a -> a -> Bool
+ (=<<) ::
forall {m :: * -> *} {a} {b}. Monad m => (a -> m b) -> m a -> m b
- == :: forall {a}. Eq a => a -> a -> Bool
- > :: forall {a}. Ord a => a -> a -> Bool
- >= :: forall {a}. Ord a => a -> a -> Bool
- >> :: forall {m :: * -> *} {a} {b}. Monad m => m a -> m b -> m b
- >>= ::
+ (==) :: forall {a}. Eq a => a -> a -> Bool
+ (>) :: forall {a}. Ord a => a -> a -> Bool
+ (>=) :: forall {a}. Ord a => a -> a -> Bool
+ (>>) :: forall {m :: * -> *} {a} {b}. Monad m => m a -> m b -> m b
+ (>>=) ::
forall {m :: * -> *} {a} {b}. Monad m => m a -> (a -> m b) -> m b
- ^ :: forall {b} {a}. (Integral b, Num a) => a -> b -> a
- ^^ :: forall {a} {b}. (Fractional a, Integral b) => a -> b -> a
+ (^) :: forall {b} {a}. (Integral b, Num a) => a -> b -> a
+ (^^) :: forall {a} {b}. (Fractional a, Integral b) => a -> b -> a
abs :: forall {a}. Num a => a -> a
acos :: forall {a}. Floating a => a -> a
acosh :: forall {a}. Floating a => a -> a
@@ -234,7 +234,7 @@ TYPE SIGNATURES
zipWith3 ::
forall {a} {b} {c} {d}.
(a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
- || :: Bool -> Bool -> Bool
+ (||) :: Bool -> Bool -> Bool
Dependent modules: []
-Dependent packages: [base-4.13.0.0, ghc-prim-0.6.1,
- integer-gmp-1.0.2.0]
+Dependent packages: [base-4.14.0.0, ghc-prim-0.6.1,
+ integer-gmp-1.0.3.0]
=====================================
testsuite/tests/printer/T18052a.hs
=====================================
@@ -0,0 +1,8 @@
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE TypeOperators #-}
+module T18052a where
+
+(+++) = (++)
+pattern x :||: y = (x,y)
+type (^^^) = Either
+data (&&&)
=====================================
testsuite/tests/printer/T18052a.stderr
=====================================
@@ -0,0 +1,42 @@
+TYPE SIGNATURES
+ (+++) :: forall {a}. [a] -> [a] -> [a]
+TYPE CONSTRUCTORS
+ data type (&&&){0} :: *
+ type synonym (^^^){0} :: * -> * -> *
+PATTERN SYNONYMS
+ (:||:) :: forall {a} {b}. a -> b -> (a, b)
+Dependent modules: []
+Dependent packages: [base-4.14.0.0, ghc-prim-0.6.1,
+ integer-gmp-1.0.3.0]
+
+==================== Tidy Core ====================
+Result size of Tidy Core
+ = {terms: 18, types: 53, coercions: 0, joins: 0/0}
+
+-- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0}
+T18052a.$b:||: :: forall {a} {b}. a -> b -> (a, b)
+[GblId, Arity=2, Unf=OtherCon []]
+T18052a.$b:||: = GHC.Tuple.(,)
+
+-- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0}
+(+++) :: forall {a}. [a] -> [a] -> [a]
+[GblId]
+(+++) = (++)
+
+-- RHS size: {terms: 13, types: 20, coercions: 0, joins: 0/0}
+T18052a.$m:||:
+ :: forall {rep :: GHC.Types.RuntimeRep} {r :: TYPE rep} {a} {b}.
+ (a, b) -> (a -> b -> r) -> (GHC.Prim.Void# -> r) -> r
+[GblId, Arity=3, Unf=OtherCon []]
+T18052a.$m:||:
+ = \ (@(rep :: GHC.Types.RuntimeRep))
+ (@(r :: TYPE rep))
+ (@a)
+ (@b)
+ (scrut :: (a, b))
+ (cont :: a -> b -> r)
+ _ [Occ=Dead] ->
+ case scrut of { (x, y) -> cont x y }
+
+
+
=====================================
testsuite/tests/printer/all.T
=====================================
@@ -57,3 +57,5 @@ test('T14306', ignore_stderr, makefile_test, ['T14306'])
test('T14343', normal, compile_fail, [''])
test('T14343b', normal, compile_fail, [''])
test('T15761', normal, compile_fail, [''])
+test('T18052a', normal, compile,
+ ['-ddump-simpl -ddump-types -dno-typeable-binds -dsuppress-uniques'])
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a5fddb249ce819c5d3aa9a33a63e99f8042a0ced...eefc926c0871224d2679e8eb6534c5335a3409d6
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a5fddb249ce819c5d3aa9a33a63e99f8042a0ced...eefc926c0871224d2679e8eb6534c5335a3409d6
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20200417/69d2ff7d/attachment-0001.html>
More information about the ghc-commits
mailing list