[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 15 commits: JS: make some arithmetic primops faster (#22835)

Marge Bot (@marge-bot) gitlab at gitlab.haskell.org
Fri Feb 24 22:59:42 UTC 2023



Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC


Commits:
4eb9c234 by Sylvain Henry at 2023-02-24T17:27:45-05:00
JS: make some arithmetic primops faster (#22835)

Don't use BigInt for wordAdd2, mulWord32, and timesInt32.

Co-authored-by: Matthew Craven <5086-clyring at users.noreply.gitlab.haskell.org>

- - - - -
92e76483 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump terminfo submodule to 0.4.1.6

- - - - -
f229db14 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump unix submodule to 2.8.1.0

- - - - -
47bd48c1 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump deepseq submodule to 1.4.8.1

- - - - -
d2012594 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump directory submodule to 1.3.8.1

- - - - -
df6f70d1 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump process submodule to v1.6.17.0

- - - - -
4c869e48 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump hsc2hs submodule to 0.68.8

- - - - -
81d96642 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump array submodule to 0.5.4.0

- - - - -
6361f771 by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump Cabal submodule to 3.9 pre-release

- - - - -
4085fb6c by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump filepath submodule to 1.4.100.1

- - - - -
2bfad50f by Ben Gamari at 2023-02-24T17:28:20-05:00
Bump haskeline submodule to 0.8.2.1

- - - - -
915ccb6c by Ben Gamari at 2023-02-24T17:59:19-05:00
gitlab-ci: Run nix-build with -v0

This significantly cuts down on the amount of
noise in the job log.

Addresses #22861.
- - - - -
e55cac00 by Aaron Allen at 2023-02-24T17:59:24-05:00
Fix ParallelListComp out of scope suggestion

This patch makes it so vars from one block of a parallel list
comprehension are not in scope in a subsequent block during type
checking. This was causing GHC to emit a faulty suggestion when an out
of scope variable shared the occ name of a var from a different block.

Fixes #22940

- - - - -
c965d6b2 by Simon Peyton Jones at 2023-02-24T17:59:24-05:00
Fix shadowing bug in prepareAlts

As #23012 showed, GHC.Core.Opt.Simplify.Utils.prepareAlts was
using an OutType to construct an InAlt.  When shadowing is in play,
this is outright wrong.

See Note [Shadowing in prepareAlts].

- - - - -
dc6ee013 by Sylvain Henry at 2023-02-24T17:59:27-05:00
JS: Store CI perf results (fix #22923)

- - - - -


22 changed files:

- .gitlab/ci.sh
- compiler/GHC/Core/Opt/Simplify/Iteration.hs
- compiler/GHC/Core/Opt/Simplify/Utils.hs
- compiler/GHC/StgToJS/Prim.hs
- compiler/GHC/Tc/Gen/Match.hs
- libraries/Cabal
- libraries/array
- libraries/deepseq
- libraries/directory
- libraries/filepath
- libraries/haskeline
- libraries/process
- libraries/terminfo
- libraries/unix
- rts/js/arith.js
- testsuite/tests/numeric/should_run/all.T
- + testsuite/tests/simplCore/should_compile/T23012.hs
- testsuite/tests/simplCore/should_compile/all.T
- + testsuite/tests/typecheck/should_fail/T22940.hs
- + testsuite/tests/typecheck/should_fail/T22940.stderr
- testsuite/tests/typecheck/should_fail/all.T
- utils/hsc2hs


Changes:

=====================================
.gitlab/ci.sh
=====================================
@@ -210,7 +210,7 @@ function set_toolchain_paths() {
           *) fail "unknown NIX_SYSTEM" ;;
         esac
         info "Building toolchain for $NIX_SYSTEM"
-        nix-build .gitlab/darwin/toolchain.nix --argstr system "$NIX_SYSTEM" -o toolchain.sh
+        nix-build --quiet .gitlab/darwin/toolchain.nix --argstr system "$NIX_SYSTEM" -o toolchain.sh
         cat toolchain.sh
       fi
       source toolchain.sh
@@ -455,7 +455,7 @@ function push_perf_notes() {
     return
   fi
 
-  if [[ -n "${CROSS_TARGET:-}" ]]; then
+  if [ -n "${CROSS_TARGET:-}" ] && [ "${CROSS_EMULATOR:-}" != "js-emulator" ]; then
     info "Can't test cross-compiled build."
     return
   fi


=====================================
compiler/GHC/Core/Opt/Simplify/Iteration.hs
=====================================
@@ -3224,9 +3224,11 @@ simplAlts env0 scrut case_bndr alts cont'
         ; (alt_env', scrut', case_bndr') <- improveSeq fam_envs env2 scrut
                                                        case_bndr case_bndr2 alts
 
-        ; (imposs_deflt_cons, in_alts) <- prepareAlts scrut' case_bndr' alts
+        ; (imposs_deflt_cons, in_alts) <- prepareAlts scrut' case_bndr alts
           -- NB: it's possible that the returned in_alts is empty: this is handled
-          -- by the caller (rebuildCase) in the missingAlt function
+          --     by the caller (rebuildCase) in the missingAlt function
+          -- NB: pass case_bndr::InId, not case_bndr' :: OutId, to prepareAlts
+          --     See Note [Shadowing in prepareAlts] in GHC.Core.Opt.Simplify.Utils
 
         ; alts' <- mapM (simplAlt alt_env' (Just scrut') imposs_deflt_cons case_bndr' cont') in_alts
 --      ; pprTrace "simplAlts" (ppr case_bndr $$ ppr alts $$ ppr cont') $ return ()


=====================================
compiler/GHC/Core/Opt/Simplify/Utils.hs
=====================================
@@ -2270,26 +2270,37 @@ h y = case y of
 If we inline h into f, the default case of the inlined h can't happen.
 If we don't notice this, we may end up filtering out *all* the cases
 of the inner case y, which give us nowhere to go!
+
+Note [Shadowing in prepareAlts]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Note that we pass case_bndr::InId to prepareAlts; an /InId/, not an
+/OutId/.  This is vital, because `refineDefaultAlt` uses `tys` to build
+a new /InAlt/.  If you pass an OutId, we'll end up appling the
+substitution twice: disaster (#23012).
+
+However this does mean that filling in the default alt might be
+delayed by a simplifier cycle, because an InId has less info than an
+OutId.  Test simplCore/should_compile/simpl013 apparently shows this
+up, although I'm not sure exactly how..
 -}
 
-prepareAlts :: OutExpr -> OutId -> [InAlt] -> SimplM ([AltCon], [InAlt])
+prepareAlts :: OutExpr -> InId -> [InAlt] -> SimplM ([AltCon], [InAlt])
 -- The returned alternatives can be empty, none are possible
-prepareAlts scrut case_bndr' alts
-  | Just (tc, tys) <- splitTyConApp_maybe (varType case_bndr')
-           -- Case binder is needed just for its type. Note that as an
-           --   OutId, it has maximum information; this is important.
-           --   Test simpl013 is an example
+--
+-- Note that case_bndr is an InId; see Note [Shadowing in prepareAlts]
+prepareAlts scrut case_bndr alts
+  | Just (tc, tys) <- splitTyConApp_maybe (idType case_bndr)
   = do { us <- getUniquesM
-       ; let (idcs1, alts1)       = filterAlts tc tys imposs_cons alts
-             (yes2,  alts2)       = refineDefaultAlt us (idMult case_bndr') tc tys idcs1 alts1
-               -- the multiplicity on case_bndr's is the multiplicity of the
+       ; let (idcs1, alts1) = filterAlts tc tys imposs_cons alts
+             (yes2,  alts2) = refineDefaultAlt us (idMult case_bndr) tc tys idcs1 alts1
+               -- The multiplicity on case_bndr's is the multiplicity of the
                -- case expression The newly introduced patterns in
                -- refineDefaultAlt must be scaled by this multiplicity
              (yes3, idcs3, alts3) = combineIdenticalAlts idcs1 alts2
              -- "idcs" stands for "impossible default data constructors"
              -- i.e. the constructors that can't match the default case
-       ; when yes2 $ tick (FillInCaseDefault case_bndr')
-       ; when yes3 $ tick (AltMerge case_bndr')
+       ; when yes2 $ tick (FillInCaseDefault case_bndr)
+       ; when yes3 $ tick (AltMerge case_bndr)
        ; return (idcs3, alts3) }
 
   | otherwise  -- Not a data type, so nothing interesting happens


=====================================
compiler/GHC/StgToJS/Prim.hs
=====================================
@@ -59,7 +59,7 @@ genPrim prof bound ty op = case op of
 
   IntAddOp        -> \[r] [x,y] -> PrimInline $ r |= toI32 (Add x y)
   IntSubOp        -> \[r] [x,y] -> PrimInline $ r |= toI32 (Sub x y)
-  IntMulOp        -> \[r] [x,y] -> PrimInline $ r |= app "h$mulInt32" [x, y]
+  IntMulOp        -> \[r] [x,y] -> PrimInline $ r |= app "Math.imul" [x, y]
   IntMul2Op       -> \[c,hr,lr] [x,y] -> PrimInline $ appT [c,hr,lr] "h$hs_timesInt2" [x, y]
   IntMulMayOfloOp -> \[r] [x,y] -> PrimInline $ jVar \tmp -> mconcat
                                             [ tmp |= Mul x y
@@ -374,7 +374,7 @@ genPrim prof bound ty op = case op of
         ]
   WordAdd2Op    -> \[h,l] [x,y] -> PrimInline $ appT [h,l] "h$wordAdd2" [x,y]
   WordSubOp     -> \  [r] [x,y] -> PrimInline $ r |= toU32 (Sub x y)
-  WordMulOp     -> \  [r] [x,y] -> PrimInline $ r |= app "h$mulWord32" [x, y]
+  WordMulOp     -> \  [r] [x,y] -> PrimInline $ r |= toU32 (app "Math.imul" [x, y])
   WordMul2Op    -> \[h,l] [x,y] -> PrimInline $ appT [h,l] "h$mul2Word32" [x,y]
   WordQuotOp    -> \  [q] [x,y] -> PrimInline $ q |= app "h$quotWord32" [x,y]
   WordRemOp     -> \  [r] [x,y] -> PrimInline $ r |= app "h$remWord32" [x,y]


=====================================
compiler/GHC/Tc/Gen/Match.hs
=====================================
@@ -42,6 +42,7 @@ import {-# SOURCE #-}   GHC.Tc.Gen.Expr( tcSyntaxOp, tcInferRho, tcInferRhoNC
                                        , tcCheckMonoExpr, tcCheckMonoExprNC
                                        , tcCheckPolyExpr )
 
+import GHC.Rename.Utils ( bindLocalNames )
 import GHC.Tc.Errors.Types
 import GHC.Tc.Utils.Monad
 import GHC.Tc.Utils.Env
@@ -473,21 +474,28 @@ tcLcStmt _ _ (BodyStmt _ rhs _ _) elt_ty thing_inside
         ; thing <- thing_inside elt_ty
         ; return (BodyStmt boolTy rhs' noSyntaxExpr noSyntaxExpr, thing) }
 
--- ParStmt: See notes with tcMcStmt
+-- ParStmt: See notes with tcMcStmt and Note [Scoping in parallel list comprehensions]
 tcLcStmt m_tc ctxt (ParStmt _ bndr_stmts_s _ _) elt_ty thing_inside
-  = do  { (pairs', thing) <- loop bndr_stmts_s
+  = do  { env <- getLocalRdrEnv
+        ; (pairs', thing) <- loop env [] bndr_stmts_s
         ; return (ParStmt unitTy pairs' noExpr noSyntaxExpr, thing) }
   where
-    -- loop :: [([LStmt GhcRn], [GhcRn])]
+    -- loop :: LocalRdrEnv -- The original LocalRdrEnv
+    --      -> [Name]      -- Variables bound by earlier branches
+    --      -> [([LStmt GhcRn], [GhcRn])]
     --      -> TcM ([([LStmt GhcTc], [GhcTc])], thing)
-    loop [] = do { thing <- thing_inside elt_ty
-                 ; return ([], thing) }         -- matching in the branches
+    --
+    -- Invariant: on entry to `loop`, the LocalRdrEnv is set to
+    --            origEnv, the LocalRdrEnv for the entire comprehension
+    loop _ allBinds [] = do { thing <- bindLocalNames allBinds $ thing_inside elt_ty
+                            ; return ([], thing) }   -- matching in the branches
 
-    loop (ParStmtBlock x stmts names _ : pairs)
+    loop origEnv priorBinds (ParStmtBlock x stmts names _ : pairs)
       = do { (stmts', (ids, pairs', thing))
                 <- tcStmtsAndThen ctxt (tcLcStmt m_tc) stmts elt_ty $ \ _elt_ty' ->
                    do { ids <- tcLookupLocalIds names
-                      ; (pairs', thing) <- loop pairs
+                      ; (pairs', thing) <- setLocalRdrEnv origEnv $
+                          loop origEnv (names ++ priorBinds) pairs
                       ; return (ids, pairs', thing) }
            ; return ( ParStmtBlock x stmts' ids noSyntaxExpr : pairs', thing ) }
 
@@ -1012,6 +1020,21 @@ e_i   :: exp_ty_i
 <$>   :: (pat_ty_1 -> ... -> pat_ty_n -> body_ty) -> exp_ty_1 -> t_1
 <*>_i :: t_(i-1) -> exp_ty_i -> t_i
 join :: tn -> res_ty
+
+Note [Scoping in parallel list comprehensions]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In a parallel list comprehension like [ ebody | a <- blah1; e1 | b <- blah2; e2 ]
+we want to ensure that in the lexical environment, tcl_rdr :: LocalRdrEnv, we have
+  * 'a' in scope in e1, but not 'b'
+  * 'b' in scope in e2, but not 'a'
+  * Both in scope in ebody
+We don't want too /many/ variables in the LocalRdrEnv, else we make stupid
+suggestions for an out-of-scope variable (#22940).
+
+To achieve this we:
+  * At the start of each branch, reset the LocalRdrEnv to the outer scope.
+  * Before typechecking ebody, add to LocalRdrEnv all the variables bound in
+    all branches. This step is done with bindLocalNames.
 -}
 
 tcApplicativeStmts


=====================================
libraries/Cabal
=====================================
@@ -1 +1 @@
-Subproject commit 6cd29789ca866464dc3af89f62c98c41264ce3cd
+Subproject commit 280a7a71e495da8f25ae33dbc6e743526b9106f9


=====================================
libraries/array
=====================================
@@ -1 +1 @@
-Subproject commit f7a498b880a1fff833699d8417bac155d58ed59e
+Subproject commit f487b8de85f2b271a3831c14ab6439b9bc9b8343


=====================================
libraries/deepseq
=====================================
@@ -1 +1 @@
-Subproject commit 7e77698d6a78981bc2649df78021a6c33a5d3913
+Subproject commit 0bfe57809f8ecaf1921b82a6791d1ecc317d1998


=====================================
libraries/directory
=====================================
@@ -1 +1 @@
-Subproject commit 7f9066137c694ab7cef9a4ebd8c19a281fad42e4
+Subproject commit 3ae36d84e44737fa9800d74d55ae1e30b75628cf


=====================================
libraries/filepath
=====================================
@@ -1 +1 @@
-Subproject commit 7139cd3383a2aae440a57b5604a8182d9a983715
+Subproject commit bb0e5cd49655b41bd3209b100f7a5a74698cbe83


=====================================
libraries/haskeline
=====================================
@@ -1 +1 @@
-Subproject commit ad40faf532ca86ae6d0839a299234db2ce4fc424
+Subproject commit 1c2ad91edc936a9836d1ad80a26f8be03a7d8bb0


=====================================
libraries/process
=====================================
@@ -1 +1 @@
-Subproject commit d9a8e6e749d2d60422037f3ef4733d521f18a7fc
+Subproject commit e60ab049b92238b0111654589f17b6ee68249f01


=====================================
libraries/terminfo
=====================================
@@ -1 +1 @@
-Subproject commit 0a05f06bc8a56c43578ce06d4ef1339ee70fb3fc
+Subproject commit 98100776edcf33796ddf2e752233e6ef179b876d


=====================================
libraries/unix
=====================================
@@ -1 +1 @@
-Subproject commit 98adc732bfbfca4fef945d546ecbaae13952a950
+Subproject commit 720debbf5b89366007bac473e8d7fd18e4114f1a


=====================================
rts/js/arith.js
=====================================
@@ -203,38 +203,73 @@ function h$hs_uncheckedShiftRLInt64(h,l,n) {
   RETURN_UBX_TUP2(rh,rl);
 }
 
-var h$mulInt32 = Math.imul;
-
 // Compute product of two Ints. Returns (nh,ch,cl)
 // where (ch,cl) are the two parts of the 64-bit result
 // and nh is 0 if ch can be safely dropped (i.e. it's a sign-extension of cl).
 function h$hs_timesInt2(l1,l2) {
-  var a = I32(l1);
-  var b = I32(l2);
-  var r = BigInt.asIntN(64, a * b);
-  TRACE_ARITH("Int32: " + a + " * " + b + " ==> " + r + " (Int64)")
-
-  var rh = I64h(r);
-  var rl = I64l(r)|0;
-  var nh = ((rh === 0 && rl >= 0) || (rh === -1 && rl < 0)) ? 0 : 1;
-  RETURN_UBX_TUP3(nh, rh, rl);
+  var ah = l1 >> 16;
+  var al = l1 & 0xFFFF;
+  var bh = l2 >> 16;
+  var bl = l2 & 0xFFFF;
+
+  var r0 = al * bl;
+  var r1 = r0 >>> 16;
+  r0 &= 0xFFFF;
+
+  r1 += al * bh;
+  var r2 = r1 >> 16;
+  r1 &= 0xFFFF;
+
+  r1 += ah * bl;
+  r2 += r1 >> 16;
+  r1 &= 0xFFFF;
+
+  r2 += ah * bh;
+  var r3 = (r2 >> 16) & 0xFFFF;
+  r2 &= 0xFFFF;
+
+  const rh = r3 << 16 | r2;
+  const rl = r1 << 16 | r0;
+
+  var s = rl >> 31;
+  if (rh === s) {
+    TRACE_ARITH("Int32: " + l1 + " * " + l2 + " ==> " + rl + " (Int64)")
+    RETURN_UBX_TUP3(0, s, rl);
+  }
+  else {
+    TRACE_ARITH("Int32: " + l1 + " * " + l2 + " ==> " + rh + " " + rl + " (Int64)")
+    RETURN_UBX_TUP3(1, rh, rl);
+  }
 }
 
 
-function h$mulWord32(l1,l2) {
-  var a = W32(l1);
-  var b = W32(l2);
-  var r = BigInt.asUintN(32, a * b);
-  TRACE_ARITH("Word32: " + a + " * " + b + " ==> " + r)
-  RETURN_W32(r);
-}
-
 function h$mul2Word32(l1,l2) {
-  var a = W32(l1);
-  var b = W32(l2);
-  var r = BigInt.asUintN(64, a * b);
-  TRACE_ARITH("Word32: " + a + " * " + b + " ==> " + r + " (Word64)")
-  RETURN_W64(r);
+  var ah = l1 >>> 16;
+  var al = l1 & 0xFFFF;
+  var bh = l2 >>> 16;
+  var bl = l2 & 0xFFFF;
+
+  var r0 = al * bl;
+  var r1 = r0 >>> 16;
+  r0 &= 0xFFFF;
+
+  r1 += al * bh;
+  var r2 = r1 >>> 16;
+  r1 &= 0xFFFF;
+
+  r1 += ah * bl;
+  r2 += r1 >>> 16;
+  r1 &= 0xFFFF;
+
+  r2 += ah * bh;
+  var r3 = (r2 >>> 16) & 0xFFFF;
+  r2 &= 0xFFFF;
+
+  const rh = (r3 << 16 | r2) >>> 0;
+  const rl = (r1 << 16 | r0) >>> 0;
+
+  TRACE_ARITH("Word32: " + l1 + " * " + l2 + " ==> " + rh + " " + rl + " (Word64)")
+  RETURN_UBX_TUP2(rh,rl);
 }
 
 function h$quotWord32(n,d) {
@@ -272,11 +307,11 @@ function h$quotRem2Word32(nh,nl,d) {
 }
 
 function h$wordAdd2(l1,l2) {
-  var a = W32(l1);
-  var b = W32(l2);
-  var r = BigInt.asUintN(64, a + b);
-  TRACE_ARITH("Word32: " + a + " + " + b + " ==> " + r + " (Word64)")
-  RETURN_W64(r);
+  var r = (l1 >>> 1) + (l2 >>> 1) + (1 & l1 & l2);
+  var h = r >>> 31;
+  var l = (l1 + l2) >>> 0;
+  TRACE_ARITH("Word32: " + a + " + " + b + " ==> " + h + " " + l + " (Word64)")
+  RETURN_UBX_TUP2(h,l);
 }
 
 function h$isDoubleNegativeZero(d) {


=====================================
testsuite/tests/numeric/should_run/all.T
=====================================
@@ -63,7 +63,7 @@ test('T9407', normal, compile_and_run, [''])
 test('T9810', normal, compile_and_run, [''])
 test('T10011', normal, compile_and_run, [''])
 test('T10962', omit_ways(['ghci']), compile_and_run, ['-O2'])
-test('T11702', [unless(arch("javascript"),extra_ways(['optasm']))], compile_and_run, [''])
+test('T11702', [unless(js_arch(),extra_ways(['optasm']))], compile_and_run, [''])
 test('T12136', normal, compile_and_run, [''])
 test('T15301', normal, compile_and_run, ['-O2'])
 test('T497', normal, compile_and_run, ['-O'])
@@ -79,5 +79,5 @@ test('IntegerToFloat', normal, compile_and_run, [''])
 
 test('T20291', normal, compile_and_run, [''])
 test('T22282', normal, compile_and_run, [''])
-test('T22671', js_broken(22835), compile_and_run, [''])
-test('foundation', js_broken(22576), compile_and_run, ['-O -package transformers'])
+test('T22671', normal, compile_and_run, [''])
+test('foundation', [when(js_arch(), run_timeout_multiplier(2))], compile_and_run, ['-O -package transformers'])


=====================================
testsuite/tests/simplCore/should_compile/T23012.hs
=====================================
@@ -0,0 +1,30 @@
+{-# LANGUAGE BangPatterns, FlexibleInstances, MultiParamTypeClasses #-}
+
+module T23012 where
+
+import Data.Kind (Type)
+
+class Vector v a where
+  nothing :: v a
+  just :: a -> v a
+
+data Proxy (a :: Type) = P
+
+instance Vector Proxy a where
+  nothing = P
+  just _ = P
+
+step :: Maybe a
+step = Nothing
+{-# INLINE[0] step #-}
+
+stream :: Vector v a => v a
+stream = case step of
+           Nothing -> nothing
+           Just !x -> just x
+{-# INLINE[1] stream #-}
+
+data Id a = MkId a
+
+f :: (Proxy (Id a), Proxy a)
+f = (stream, stream)


=====================================
testsuite/tests/simplCore/should_compile/all.T
=====================================
@@ -472,5 +472,6 @@ test('T22715_2', normal, multimod_compile, ['T22715_2', '-v0 -O -fspecialise-agg
 test('T22802', normal, compile, ['-O'])
 test('T15205', normal, compile, ['-O -ddump-simpl -dno-typeable-binds -dsuppress-uniques'])
 test('T22761', normal, multimod_compile, ['T22761', '-O2 -v0'])
+test('T23012', normal, compile, ['-O'])
 
 test('RewriteHigherOrderPatterns', normal, compile, ['-O -ddump-rule-rewrites -dsuppress-all -dsuppress-uniques'])


=====================================
testsuite/tests/typecheck/should_fail/T22940.hs
=====================================
@@ -0,0 +1,4 @@
+{-# LANGUAGE ParallelListComp #-}
+
+x :: [(Int, Char)]
+x = [ (a, b) | a <- [0 ..] | b <- "abcd", even a ]


=====================================
testsuite/tests/typecheck/should_fail/T22940.stderr
=====================================
@@ -0,0 +1,3 @@
+
+T22940.hs:4:48: error: [GHC-88464]
+    Variable not in scope: a


=====================================
testsuite/tests/typecheck/should_fail/all.T
=====================================
@@ -669,4 +669,4 @@ test('T20666', normal, compile, [''])   # To become compile_fail after migration
 test('T20666a', normal, compile, [''])  # To become compile_fail after migration period (see #22912)
 test('T22924a', normal, compile_fail, [''])
 test('T22924b', normal, compile_fail, [''])
-
+test('T22940', normal, compile_fail, [''])


=====================================
utils/hsc2hs
=====================================
@@ -1 +1 @@
-Subproject commit 0811ae8f29d0cc2591bbe89bc034ae14143d0443
+Subproject commit 1ba092932f86c1fda15091d355ba7975b8554437



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3fcf3e0b0964e2b88d13eced5c37c280b6fd2a02...dc6ee013a082d6f0385b14b7b89a1350dba0b4b8

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/3fcf3e0b0964e2b88d13eced5c37c280b6fd2a02...dc6ee013a082d6f0385b14b7b89a1350dba0b4b8
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/20230224/8bec2afa/attachment-0001.html>


More information about the ghc-commits mailing list