[Git][ghc/ghc][wip/9.12.3-backports] 6 commits: Fix EmptyCase panic in tcMatches (#25960)
Zubin pushed to branch wip/9.12.3-backports at Glasgow Haskell Compiler / GHC Commits: a8ce2f00 by Vladislav Zavialov at 2025-10-22T12:39:41+05:30 Fix EmptyCase panic in tcMatches (#25960) Due to faulty reasoning in Note [Pattern types for EmptyCase], tcMatches was too keen to panic. * Old (incorrect) assumption: pat_tys is a singleton list. This does not hold when \case{} is checked against a function type preceded by invisible forall. See the new T25960 test case. * New (hopefully correct) assumption: vis_pat_tys is a singleton list. This should follow from: checkArgCounts :: MatchGroup GhcRn ... -> TcM VisArity checkArgCounts (MG { mg_alts = L _ [] }) = return 1 ... (cherry picked from commit b34890c7d4803041caff060391eec298e2b0a098) - - - - - 72e32447 by Ben Gamari at 2025-10-22T12:42:06+05:30 StgToByteCode: Don't assume that data con workers are nullary Previously StgToByteCode assumed that all data-con workers were of a nullary representation. This is not a valid assumption, as seen in #23210, where an unsaturated application of a unary data constructor's worker resulted in invalid bytecode. Sadly, I have not yet been able to reduce a minimal testcase for this. Fixes #23210. (cherry picked from commit d1d9e39ec293cd1d2b539b8246a349b539c6a61a) - - - - - dc9e7c4e by Ben Gamari at 2025-10-22T12:42:20+05:30 testsuite: Mark T23146* as unbroken (cherry picked from commit 3eeecd508ef80812bc8ee84ab83f496f5030d59b) - - - - - 08179480 by sheaf at 2025-10-22T12:42:31+05:30 Add test for #26216 (cherry picked from commit 2e73f3426ab6e3cf1938b53831005593f3fd351c) - - - - - 38d49c64 by Brandon Chinn at 2025-10-22T12:43:24+05:30 Fix tabs in string gaps (#26415) Tabs in string gaps were broken in bb030d0d because previously, string gaps were manually parsed, but now it's lexed by the usual Alex grammar and post-processed after successful lexing. It broke because of a discrepancy between GHC's lexer grammar and the Haskell Report. The Haskell Report includes tabs in whitechar: whitechar → newline | vertab | space | tab | uniWhite $whitechar used to include tabs until 18 years ago, when it was removed in order to exclude tabs from $white_no_nl in order to warn on tabs: 6e202120. In this MR, I'm adding \t back into $whitechar, and explicitly excluding \t from the $white_no_nl+ rule ignoring all whitespace in source code, which more accurately colocates the "ignore all whitespace except tabs, which is handled in the next line" logic. As a side effect of this MR, tabs are now allowed in pragmas; currently, a pragma written as {-# \t LANGUAGE ... #-} is interpreted as the tab character being the pragma name, and GHC warns "Unrecognized pragma". With this change, tabs are ignored as whitespace, which more closely matches the Report anyway. (cherry picked from commit e9c5e46ffdb3cd8725e2ffdc2c440ea57af97bac) - - - - - 10a82889 by Ben Gamari at 2025-10-23T17:35:29+05:30 rts: Dynamically initialize built-in closures To resolve #26166 we need to eliminate references to undefined symbols in the runtime system. One such source of these is the runtime's static references to `I#` and `C#` due the `stg_INTLIKE` and `stg_CHARLIKE` arrays. To avoid this we make these dynamic, initializing them during RTS start-up. (cherry picked from commit 39eaaaba5356e3fc9218d8e27375d6de24778cbc) - - - - - 26 changed files: - compiler/GHC/Parser/Lexer.x - compiler/GHC/Parser/Lexer/String.x - compiler/GHC/StgToByteCode.hs - compiler/GHC/Tc/Gen/Match.hs - + rts/BuiltinClosures.c - + rts/BuiltinClosures.h - rts/Interpreter.c - rts/RtsStartup.c - rts/StgMiscClosures.cmm - rts/include/rts/Constants.h - rts/include/stg/MiscClosures.h - rts/rts.cabal - + testsuite/tests/bytecode/T26216.hs - + testsuite/tests/bytecode/T26216.script - + testsuite/tests/bytecode/T26216.stdout - + testsuite/tests/bytecode/T26216_aux.hs - testsuite/tests/bytecode/all.T - testsuite/tests/codeGen/should_run/T23146/all.T - + testsuite/tests/parser/should_run/T26415.hs - + testsuite/tests/parser/should_run/T26415.stdout - testsuite/tests/parser/should_run/all.T - + testsuite/tests/typecheck/should_compile/T25960.hs - testsuite/tests/typecheck/should_compile/all.T - + testsuite/tests/typecheck/should_fail/T25004k.hs - + testsuite/tests/typecheck/should_fail/T25004k.stderr - testsuite/tests/typecheck/should_fail/all.T Changes: ===================================== compiler/GHC/Parser/Lexer.x ===================================== @@ -145,7 +145,7 @@ import GHC.Parser.String $unispace = \x05 -- Trick Alex into handling Unicode. See Note [Unicode in Alex]. $nl = [\n\r\f] $space = [\ $unispace] -$whitechar = [$nl \v $space] +$whitechar = [$nl \t \v $space] $white_no_nl = $whitechar # \n -- TODO #8424 $tab = \t @@ -248,7 +248,7 @@ haskell :- -- Alex "Rules" -- everywhere: skip whitespace -$white_no_nl+ ; +($white_no_nl # \t)+ ; $tab { warnTab } -- Everywhere: deal with nested comments. We explicitly rule out ===================================== compiler/GHC/Parser/Lexer/String.x ===================================== @@ -25,7 +25,7 @@ import GHC.Utils.Panic (panic) $unispace = \x05 -- Trick Alex into handling Unicode. See Note [Unicode in Alex]. $nl = [\n\r\f] $space = [\ $unispace] -$whitechar = [$nl \v $space] +$whitechar = [$nl \t \v $space] $tab = \t $ascdigit = 0-9 ===================================== compiler/GHC/StgToByteCode.hs ===================================== @@ -1930,11 +1930,12 @@ pushAtom d p (StgVarArg var) -- PUSH_G doesn't tag constructors. So we use PACK here -- if we are dealing with nullary constructor. case isDataConWorkId_maybe var of - Just con -> do - massert (isNullaryRepDataCon con) - return (unitOL (PACK con 0), szb) + Just con + -- See Note [LFInfo of DataCon workers and wrappers] in GHC.Types.Id.Make. + | isNullaryRepDataCon con -> + return (unitOL (PACK con 0), szb) - Nothing + _ -- see Note [Generating code for top-level string literal bindings] | isUnliftedType (idType var) -> do massert (idType var `eqType` addrPrimTy) ===================================== compiler/GHC/Tc/Gen/Match.hs ===================================== @@ -240,7 +240,9 @@ tcMatches ctxt tc_body pat_tys rhs_ty (MG { mg_alts = L l matches -- when in inference mode, so we must do it ourselves, -- here, using expTypeToType = do { tcEmitBindingUsage bottomUE - ; pat_ty <- case pat_tys of -- See Note [Pattern types for EmptyCase] + -- See Note [Pattern types for EmptyCase] + ; let vis_pat_tys = filter isVisibleExpPatType pat_tys + ; pat_ty <- case vis_pat_tys of [ExpFunPatTy t] -> scaledExpTypeToType t [ExpForAllPatTy tvb] -> failWithTc $ TcRnEmptyCase ctxt (EmptyCaseForall tvb) [] -> panic "tcMatches: no arguments in EmptyCase" @@ -275,8 +277,15 @@ tcMatches ctxt tc_body pat_tys rhs_ty (MG { mg_alts = L l matches In tcMatches, we might encounter an empty list of matches if the user wrote `case x of {}` or `\case {}`. -* First of all, both `case x of {}` and `\case {}` match on exactly one - argument, so we expect pat_tys to be a singleton list [pat_ty] and panic otherwise. +* First of all, both `case x of {}` and `\case {}` match on exactly one visible + argument, which follows from + + checkArgCounts :: MatchGroup GhcRn ... -> TcM VisArity + checkArgCounts (MG { mg_alts = L _ [] }) + = return 1 + ... + + So we expect vis_pat_tys to be a singleton list [pat_ty] and panic otherwise. Multi-case `\cases {}` can't violate this assumption in `tcMatches` because it must have been rejected earlier in `rnMatchGroup`. @@ -293,7 +302,7 @@ In tcMatches, we might encounter an empty list of matches if the user wrote This is not valid and it used to trigger a panic in pmcMatches (#25004). We reject it by inspecting the expected pattern type: - ; pat_ty <- case pat_tys of + ; pat_ty <- case vis_pat_tys of [ExpFunPatTy t] -> ... -- value argument, ok [ExpForAllPatTy tvb] -> ... -- type argument, error! ===================================== rts/BuiltinClosures.c ===================================== @@ -0,0 +1,30 @@ +#include "Rts.h" +#include "Prelude.h" +#include "BuiltinClosures.h" + +/* + * Note [CHARLIKE and INTLIKE closures] + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * These are static representations of Chars and small Ints, so that + * we can remove dynamic Chars and Ints during garbage collection and + * replace them with references to the static objects. + */ + +StgIntCharlikeClosure stg_INTLIKE_closure[MAX_INTLIKE - MIN_INTLIKE + 1]; +StgIntCharlikeClosure stg_CHARLIKE_closure[MAX_CHARLIKE - MIN_CHARLIKE + 1]; + +void initBuiltinClosures(void) { + // INTLIKE closures + for (int i = MIN_INTLIKE; i <= MAX_INTLIKE; i++) { + StgIntCharlikeClosure *c = &stg_INTLIKE_closure[i - MIN_INTLIKE]; + SET_HDR((StgClosure* ) c, Izh_con_info, CCS_SYSTEM_OR_NULL); + c->data = i; + } + + // CHARLIKE closures + for (int i = MIN_CHARLIKE; i <= MAX_CHARLIKE; i++) { + StgIntCharlikeClosure *c = &stg_CHARLIKE_closure[i - MIN_CHARLIKE]; + SET_HDR((StgClosure* ) c, Czh_con_info, CCS_SYSTEM_OR_NULL); + c->data = i; + } +} ===================================== rts/BuiltinClosures.h ===================================== @@ -0,0 +1,14 @@ +/* + * (c) The GHC Team, 2025-2026 + * + * RTS/ghc-internal interface + * + */ + +#pragma once + +#include "BeginPrivate.h" + +void initBuiltinClosures(void); + +#include "EndPrivate.h" ===================================== rts/Interpreter.c ===================================== @@ -1874,7 +1874,6 @@ run_BCO: // n_nptrs=1, n_ptrs=0. ASSERT(n_ptrs + n_nptrs == n_words || (n_nptrs == 1 && n_ptrs == 0)); ASSERT(n_ptrs + n_nptrs > 0); - //ASSERT(n_words > 0); // We shouldn't ever need to allocate nullary constructors for (W_ i = 0; i < n_words; i++) { con->payload[i] = (StgClosure*)ReadSpW(i); } ===================================== rts/RtsStartup.c ===================================== @@ -14,6 +14,7 @@ #include "linker/MMap.h" #include "RtsFlags.h" #include "RtsUtils.h" +#include "BuiltinClosures.h" #include "Prelude.h" #include "Printer.h" /* DEBUG_LoadSymbols */ #include "Schedule.h" /* initScheduler */ @@ -378,6 +379,9 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config) traceInitEvent(traceOSProcessInfo); flushTrace(); + /* initialize INTLIKE and CHARLIKE closures */ + initBuiltinClosures(); + /* initialize the storage manager */ initStorage(); ===================================== rts/StgMiscClosures.cmm ===================================== @@ -13,8 +13,6 @@ #include "Cmm.h" import pthread_mutex_lock; -import ghczmprim_GHCziTypes_Czh_info; -import ghczmprim_GHCziTypes_Izh_info; import AcquireSRWLockExclusive; import ReleaseSRWLockExclusive; @@ -968,571 +966,6 @@ INFO_TABLE( stg_COMPACT_NFDATA_DIRTY, 0, 9, COMPACT_NFDATA, "COMPACT_NFDATA", "C () { foreign "C" barf("COMPACT_NFDATA_DIRTY object (%p) entered!", R1) never returns; } -/* ---------------------------------------------------------------------------- - Note [CHARLIKE and INTLIKE closures] - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - These are static representations of Chars and small Ints, so that - we can remove dynamic Chars and Ints during garbage collection and - replace them with references to the static objects. ------------------------------------------------------------------------- */ -#if defined(COMPILING_WINDOWS_DLL) -/* - * When sticking the RTS in a Windows DLL, we delay populating the - * Charlike and Intlike tables until load-time, which is only - * when we've got the real addresses to the C# and I# closures. - * - * -- this is currently broken BL 2009/11/14. - * we don't rewrite to static closures at all with Windows DLLs. - */ -// #warning Is this correct? _imp is a pointer! -#define Char_hash_con_info _imp__ghczmprim_GHCziTypes_Czh_con_info -#define Int_hash_con_info _imp__ghczmprim_GHCziTypes_Izh_con_info -#else -#define Char_hash_con_info ghczmprim_GHCziTypes_Czh_con_info -#define Int_hash_con_info ghczmprim_GHCziTypes_Izh_con_info -#endif - - -#define CHARLIKE_HDR(n) CLOSURE(Char_hash_con_info, n) -#define INTLIKE_HDR(n) CLOSURE(Int_hash_con_info, n) - -#if !(defined(COMPILING_WINDOWS_DLL)) -section "data" { - stg_CHARLIKE_closure: - CHARLIKE_HDR(0) - CHARLIKE_HDR(1) - CHARLIKE_HDR(2) - CHARLIKE_HDR(3) - CHARLIKE_HDR(4) - CHARLIKE_HDR(5) - CHARLIKE_HDR(6) - CHARLIKE_HDR(7) - CHARLIKE_HDR(8) - CHARLIKE_HDR(9) - CHARLIKE_HDR(10) - CHARLIKE_HDR(11) - CHARLIKE_HDR(12) - CHARLIKE_HDR(13) - CHARLIKE_HDR(14) - CHARLIKE_HDR(15) - CHARLIKE_HDR(16) - CHARLIKE_HDR(17) - CHARLIKE_HDR(18) - CHARLIKE_HDR(19) - CHARLIKE_HDR(20) - CHARLIKE_HDR(21) - CHARLIKE_HDR(22) - CHARLIKE_HDR(23) - CHARLIKE_HDR(24) - CHARLIKE_HDR(25) - CHARLIKE_HDR(26) - CHARLIKE_HDR(27) - CHARLIKE_HDR(28) - CHARLIKE_HDR(29) - CHARLIKE_HDR(30) - CHARLIKE_HDR(31) - CHARLIKE_HDR(32) - CHARLIKE_HDR(33) - CHARLIKE_HDR(34) - CHARLIKE_HDR(35) - CHARLIKE_HDR(36) - CHARLIKE_HDR(37) - CHARLIKE_HDR(38) - CHARLIKE_HDR(39) - CHARLIKE_HDR(40) - CHARLIKE_HDR(41) - CHARLIKE_HDR(42) - CHARLIKE_HDR(43) - CHARLIKE_HDR(44) - CHARLIKE_HDR(45) - CHARLIKE_HDR(46) - CHARLIKE_HDR(47) - CHARLIKE_HDR(48) - CHARLIKE_HDR(49) - CHARLIKE_HDR(50) - CHARLIKE_HDR(51) - CHARLIKE_HDR(52) - CHARLIKE_HDR(53) - CHARLIKE_HDR(54) - CHARLIKE_HDR(55) - CHARLIKE_HDR(56) - CHARLIKE_HDR(57) - CHARLIKE_HDR(58) - CHARLIKE_HDR(59) - CHARLIKE_HDR(60) - CHARLIKE_HDR(61) - CHARLIKE_HDR(62) - CHARLIKE_HDR(63) - CHARLIKE_HDR(64) - CHARLIKE_HDR(65) - CHARLIKE_HDR(66) - CHARLIKE_HDR(67) - CHARLIKE_HDR(68) - CHARLIKE_HDR(69) - CHARLIKE_HDR(70) - CHARLIKE_HDR(71) - CHARLIKE_HDR(72) - CHARLIKE_HDR(73) - CHARLIKE_HDR(74) - CHARLIKE_HDR(75) - CHARLIKE_HDR(76) - CHARLIKE_HDR(77) - CHARLIKE_HDR(78) - CHARLIKE_HDR(79) - CHARLIKE_HDR(80) - CHARLIKE_HDR(81) - CHARLIKE_HDR(82) - CHARLIKE_HDR(83) - CHARLIKE_HDR(84) - CHARLIKE_HDR(85) - CHARLIKE_HDR(86) - CHARLIKE_HDR(87) - CHARLIKE_HDR(88) - CHARLIKE_HDR(89) - CHARLIKE_HDR(90) - CHARLIKE_HDR(91) - CHARLIKE_HDR(92) - CHARLIKE_HDR(93) - CHARLIKE_HDR(94) - CHARLIKE_HDR(95) - CHARLIKE_HDR(96) - CHARLIKE_HDR(97) - CHARLIKE_HDR(98) - CHARLIKE_HDR(99) - CHARLIKE_HDR(100) - CHARLIKE_HDR(101) - CHARLIKE_HDR(102) - CHARLIKE_HDR(103) - CHARLIKE_HDR(104) - CHARLIKE_HDR(105) - CHARLIKE_HDR(106) - CHARLIKE_HDR(107) - CHARLIKE_HDR(108) - CHARLIKE_HDR(109) - CHARLIKE_HDR(110) - CHARLIKE_HDR(111) - CHARLIKE_HDR(112) - CHARLIKE_HDR(113) - CHARLIKE_HDR(114) - CHARLIKE_HDR(115) - CHARLIKE_HDR(116) - CHARLIKE_HDR(117) - CHARLIKE_HDR(118) - CHARLIKE_HDR(119) - CHARLIKE_HDR(120) - CHARLIKE_HDR(121) - CHARLIKE_HDR(122) - CHARLIKE_HDR(123) - CHARLIKE_HDR(124) - CHARLIKE_HDR(125) - CHARLIKE_HDR(126) - CHARLIKE_HDR(127) - CHARLIKE_HDR(128) - CHARLIKE_HDR(129) - CHARLIKE_HDR(130) - CHARLIKE_HDR(131) - CHARLIKE_HDR(132) - CHARLIKE_HDR(133) - CHARLIKE_HDR(134) - CHARLIKE_HDR(135) - CHARLIKE_HDR(136) - CHARLIKE_HDR(137) - CHARLIKE_HDR(138) - CHARLIKE_HDR(139) - CHARLIKE_HDR(140) - CHARLIKE_HDR(141) - CHARLIKE_HDR(142) - CHARLIKE_HDR(143) - CHARLIKE_HDR(144) - CHARLIKE_HDR(145) - CHARLIKE_HDR(146) - CHARLIKE_HDR(147) - CHARLIKE_HDR(148) - CHARLIKE_HDR(149) - CHARLIKE_HDR(150) - CHARLIKE_HDR(151) - CHARLIKE_HDR(152) - CHARLIKE_HDR(153) - CHARLIKE_HDR(154) - CHARLIKE_HDR(155) - CHARLIKE_HDR(156) - CHARLIKE_HDR(157) - CHARLIKE_HDR(158) - CHARLIKE_HDR(159) - CHARLIKE_HDR(160) - CHARLIKE_HDR(161) - CHARLIKE_HDR(162) - CHARLIKE_HDR(163) - CHARLIKE_HDR(164) - CHARLIKE_HDR(165) - CHARLIKE_HDR(166) - CHARLIKE_HDR(167) - CHARLIKE_HDR(168) - CHARLIKE_HDR(169) - CHARLIKE_HDR(170) - CHARLIKE_HDR(171) - CHARLIKE_HDR(172) - CHARLIKE_HDR(173) - CHARLIKE_HDR(174) - CHARLIKE_HDR(175) - CHARLIKE_HDR(176) - CHARLIKE_HDR(177) - CHARLIKE_HDR(178) - CHARLIKE_HDR(179) - CHARLIKE_HDR(180) - CHARLIKE_HDR(181) - CHARLIKE_HDR(182) - CHARLIKE_HDR(183) - CHARLIKE_HDR(184) - CHARLIKE_HDR(185) - CHARLIKE_HDR(186) - CHARLIKE_HDR(187) - CHARLIKE_HDR(188) - CHARLIKE_HDR(189) - CHARLIKE_HDR(190) - CHARLIKE_HDR(191) - CHARLIKE_HDR(192) - CHARLIKE_HDR(193) - CHARLIKE_HDR(194) - CHARLIKE_HDR(195) - CHARLIKE_HDR(196) - CHARLIKE_HDR(197) - CHARLIKE_HDR(198) - CHARLIKE_HDR(199) - CHARLIKE_HDR(200) - CHARLIKE_HDR(201) - CHARLIKE_HDR(202) - CHARLIKE_HDR(203) - CHARLIKE_HDR(204) - CHARLIKE_HDR(205) - CHARLIKE_HDR(206) - CHARLIKE_HDR(207) - CHARLIKE_HDR(208) - CHARLIKE_HDR(209) - CHARLIKE_HDR(210) - CHARLIKE_HDR(211) - CHARLIKE_HDR(212) - CHARLIKE_HDR(213) - CHARLIKE_HDR(214) - CHARLIKE_HDR(215) - CHARLIKE_HDR(216) - CHARLIKE_HDR(217) - CHARLIKE_HDR(218) - CHARLIKE_HDR(219) - CHARLIKE_HDR(220) - CHARLIKE_HDR(221) - CHARLIKE_HDR(222) - CHARLIKE_HDR(223) - CHARLIKE_HDR(224) - CHARLIKE_HDR(225) - CHARLIKE_HDR(226) - CHARLIKE_HDR(227) - CHARLIKE_HDR(228) - CHARLIKE_HDR(229) - CHARLIKE_HDR(230) - CHARLIKE_HDR(231) - CHARLIKE_HDR(232) - CHARLIKE_HDR(233) - CHARLIKE_HDR(234) - CHARLIKE_HDR(235) - CHARLIKE_HDR(236) - CHARLIKE_HDR(237) - CHARLIKE_HDR(238) - CHARLIKE_HDR(239) - CHARLIKE_HDR(240) - CHARLIKE_HDR(241) - CHARLIKE_HDR(242) - CHARLIKE_HDR(243) - CHARLIKE_HDR(244) - CHARLIKE_HDR(245) - CHARLIKE_HDR(246) - CHARLIKE_HDR(247) - CHARLIKE_HDR(248) - CHARLIKE_HDR(249) - CHARLIKE_HDR(250) - CHARLIKE_HDR(251) - CHARLIKE_HDR(252) - CHARLIKE_HDR(253) - CHARLIKE_HDR(254) - CHARLIKE_HDR(255) -} - -section "data" { - stg_INTLIKE_closure: - INTLIKE_HDR(-16) /* MIN_INTLIKE == -16 */ - INTLIKE_HDR(-15) - INTLIKE_HDR(-14) - INTLIKE_HDR(-13) - INTLIKE_HDR(-12) - INTLIKE_HDR(-11) - INTLIKE_HDR(-10) - INTLIKE_HDR(-9) - INTLIKE_HDR(-8) - INTLIKE_HDR(-7) - INTLIKE_HDR(-6) - INTLIKE_HDR(-5) - INTLIKE_HDR(-4) - INTLIKE_HDR(-3) - INTLIKE_HDR(-2) - INTLIKE_HDR(-1) - INTLIKE_HDR(0) - INTLIKE_HDR(1) - INTLIKE_HDR(2) - INTLIKE_HDR(3) - INTLIKE_HDR(4) - INTLIKE_HDR(5) - INTLIKE_HDR(6) - INTLIKE_HDR(7) - INTLIKE_HDR(8) - INTLIKE_HDR(9) - INTLIKE_HDR(10) - INTLIKE_HDR(11) - INTLIKE_HDR(12) - INTLIKE_HDR(13) - INTLIKE_HDR(14) - INTLIKE_HDR(15) - INTLIKE_HDR(16) - INTLIKE_HDR(17) - INTLIKE_HDR(18) - INTLIKE_HDR(19) - INTLIKE_HDR(20) - INTLIKE_HDR(21) - INTLIKE_HDR(22) - INTLIKE_HDR(23) - INTLIKE_HDR(24) - INTLIKE_HDR(25) - INTLIKE_HDR(26) - INTLIKE_HDR(27) - INTLIKE_HDR(28) - INTLIKE_HDR(29) - INTLIKE_HDR(30) - INTLIKE_HDR(31) - INTLIKE_HDR(32) - INTLIKE_HDR(33) - INTLIKE_HDR(34) - INTLIKE_HDR(35) - INTLIKE_HDR(36) - INTLIKE_HDR(37) - INTLIKE_HDR(38) - INTLIKE_HDR(39) - INTLIKE_HDR(40) - INTLIKE_HDR(41) - INTLIKE_HDR(42) - INTLIKE_HDR(43) - INTLIKE_HDR(44) - INTLIKE_HDR(45) - INTLIKE_HDR(46) - INTLIKE_HDR(47) - INTLIKE_HDR(48) - INTLIKE_HDR(49) - INTLIKE_HDR(50) - INTLIKE_HDR(51) - INTLIKE_HDR(52) - INTLIKE_HDR(53) - INTLIKE_HDR(54) - INTLIKE_HDR(55) - INTLIKE_HDR(56) - INTLIKE_HDR(57) - INTLIKE_HDR(58) - INTLIKE_HDR(59) - INTLIKE_HDR(60) - INTLIKE_HDR(61) - INTLIKE_HDR(62) - INTLIKE_HDR(63) - INTLIKE_HDR(64) - INTLIKE_HDR(65) - INTLIKE_HDR(66) - INTLIKE_HDR(67) - INTLIKE_HDR(68) - INTLIKE_HDR(69) - INTLIKE_HDR(70) - INTLIKE_HDR(71) - INTLIKE_HDR(72) - INTLIKE_HDR(73) - INTLIKE_HDR(74) - INTLIKE_HDR(75) - INTLIKE_HDR(76) - INTLIKE_HDR(77) - INTLIKE_HDR(78) - INTLIKE_HDR(79) - INTLIKE_HDR(80) - INTLIKE_HDR(81) - INTLIKE_HDR(82) - INTLIKE_HDR(83) - INTLIKE_HDR(84) - INTLIKE_HDR(85) - INTLIKE_HDR(86) - INTLIKE_HDR(87) - INTLIKE_HDR(88) - INTLIKE_HDR(89) - INTLIKE_HDR(90) - INTLIKE_HDR(91) - INTLIKE_HDR(92) - INTLIKE_HDR(93) - INTLIKE_HDR(94) - INTLIKE_HDR(95) - INTLIKE_HDR(96) - INTLIKE_HDR(97) - INTLIKE_HDR(98) - INTLIKE_HDR(99) - INTLIKE_HDR(100) - INTLIKE_HDR(101) - INTLIKE_HDR(102) - INTLIKE_HDR(103) - INTLIKE_HDR(104) - INTLIKE_HDR(105) - INTLIKE_HDR(106) - INTLIKE_HDR(107) - INTLIKE_HDR(108) - INTLIKE_HDR(109) - INTLIKE_HDR(110) - INTLIKE_HDR(111) - INTLIKE_HDR(112) - INTLIKE_HDR(113) - INTLIKE_HDR(114) - INTLIKE_HDR(115) - INTLIKE_HDR(116) - INTLIKE_HDR(117) - INTLIKE_HDR(118) - INTLIKE_HDR(119) - INTLIKE_HDR(120) - INTLIKE_HDR(121) - INTLIKE_HDR(122) - INTLIKE_HDR(123) - INTLIKE_HDR(124) - INTLIKE_HDR(125) - INTLIKE_HDR(126) - INTLIKE_HDR(127) - INTLIKE_HDR(128) - INTLIKE_HDR(129) - INTLIKE_HDR(130) - INTLIKE_HDR(131) - INTLIKE_HDR(132) - INTLIKE_HDR(133) - INTLIKE_HDR(134) - INTLIKE_HDR(135) - INTLIKE_HDR(136) - INTLIKE_HDR(137) - INTLIKE_HDR(138) - INTLIKE_HDR(139) - INTLIKE_HDR(140) - INTLIKE_HDR(141) - INTLIKE_HDR(142) - INTLIKE_HDR(143) - INTLIKE_HDR(144) - INTLIKE_HDR(145) - INTLIKE_HDR(146) - INTLIKE_HDR(147) - INTLIKE_HDR(148) - INTLIKE_HDR(149) - INTLIKE_HDR(150) - INTLIKE_HDR(151) - INTLIKE_HDR(152) - INTLIKE_HDR(153) - INTLIKE_HDR(154) - INTLIKE_HDR(155) - INTLIKE_HDR(156) - INTLIKE_HDR(157) - INTLIKE_HDR(158) - INTLIKE_HDR(159) - INTLIKE_HDR(160) - INTLIKE_HDR(161) - INTLIKE_HDR(162) - INTLIKE_HDR(163) - INTLIKE_HDR(164) - INTLIKE_HDR(165) - INTLIKE_HDR(166) - INTLIKE_HDR(167) - INTLIKE_HDR(168) - INTLIKE_HDR(169) - INTLIKE_HDR(170) - INTLIKE_HDR(171) - INTLIKE_HDR(172) - INTLIKE_HDR(173) - INTLIKE_HDR(174) - INTLIKE_HDR(175) - INTLIKE_HDR(176) - INTLIKE_HDR(177) - INTLIKE_HDR(178) - INTLIKE_HDR(179) - INTLIKE_HDR(180) - INTLIKE_HDR(181) - INTLIKE_HDR(182) - INTLIKE_HDR(183) - INTLIKE_HDR(184) - INTLIKE_HDR(185) - INTLIKE_HDR(186) - INTLIKE_HDR(187) - INTLIKE_HDR(188) - INTLIKE_HDR(189) - INTLIKE_HDR(190) - INTLIKE_HDR(191) - INTLIKE_HDR(192) - INTLIKE_HDR(193) - INTLIKE_HDR(194) - INTLIKE_HDR(195) - INTLIKE_HDR(196) - INTLIKE_HDR(197) - INTLIKE_HDR(198) - INTLIKE_HDR(199) - INTLIKE_HDR(200) - INTLIKE_HDR(201) - INTLIKE_HDR(202) - INTLIKE_HDR(203) - INTLIKE_HDR(204) - INTLIKE_HDR(205) - INTLIKE_HDR(206) - INTLIKE_HDR(207) - INTLIKE_HDR(208) - INTLIKE_HDR(209) - INTLIKE_HDR(210) - INTLIKE_HDR(211) - INTLIKE_HDR(212) - INTLIKE_HDR(213) - INTLIKE_HDR(214) - INTLIKE_HDR(215) - INTLIKE_HDR(216) - INTLIKE_HDR(217) - INTLIKE_HDR(218) - INTLIKE_HDR(219) - INTLIKE_HDR(220) - INTLIKE_HDR(221) - INTLIKE_HDR(222) - INTLIKE_HDR(223) - INTLIKE_HDR(224) - INTLIKE_HDR(225) - INTLIKE_HDR(226) - INTLIKE_HDR(227) - INTLIKE_HDR(228) - INTLIKE_HDR(229) - INTLIKE_HDR(230) - INTLIKE_HDR(231) - INTLIKE_HDR(232) - INTLIKE_HDR(233) - INTLIKE_HDR(234) - INTLIKE_HDR(235) - INTLIKE_HDR(236) - INTLIKE_HDR(237) - INTLIKE_HDR(238) - INTLIKE_HDR(239) - INTLIKE_HDR(240) - INTLIKE_HDR(241) - INTLIKE_HDR(242) - INTLIKE_HDR(243) - INTLIKE_HDR(244) - INTLIKE_HDR(245) - INTLIKE_HDR(246) - INTLIKE_HDR(247) - INTLIKE_HDR(248) - INTLIKE_HDR(249) - INTLIKE_HDR(250) - INTLIKE_HDR(251) - INTLIKE_HDR(252) - INTLIKE_HDR(253) - INTLIKE_HDR(254) - INTLIKE_HDR(255) /* MAX_INTLIKE == 255 - See #16961 for why 255 */ -} - -#endif +CLOSURE(stg_TIMEOUT_QUEUE_EMPTY_closure,stg_TIMEOUT_QUEUE_EMPTY); ===================================== rts/include/rts/Constants.h ===================================== @@ -57,11 +57,12 @@ #define MAX_SPEC_CONSTR_SIZE 2 /* Range of built-in table of static small int-like and char-like closures. + * Range is inclusive of both minimum and maximum. * * NB. This corresponds with the number of actual INTLIKE/CHARLIKE * closures defined in rts/StgMiscClosures.cmm. */ -#define MAX_INTLIKE 255 +#define MAX_INTLIKE 255 /* See #16961 for why 255 */ #define MIN_INTLIKE (-16) #define MAX_CHARLIKE 255 ===================================== rts/include/stg/MiscClosures.h ===================================== @@ -268,8 +268,8 @@ RTS_ENTRY(stg_NO_FINALIZER); extern DLL_IMPORT_RTS StgWordArray stg_CHARLIKE_closure; extern DLL_IMPORT_RTS StgWordArray stg_INTLIKE_closure; #else -extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_CHARLIKE_closure[]; -extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_INTLIKE_closure[]; +extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_CHARLIKE_closure[MAX_CHARLIKE - MIN_CHARLIKE + 1]; +extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_INTLIKE_closure[MAX_INTLIKE - MIN_INTLIKE + 1]; #endif /* StgStartup */ ===================================== rts/rts.cabal ===================================== @@ -381,6 +381,7 @@ library adjustor/AdjustorPool.c ExecPage.c Arena.c + BuiltinClosures.c Capability.c CheckUnload.c CheckVectorSupport.c ===================================== testsuite/tests/bytecode/T26216.hs ===================================== @@ -0,0 +1,28 @@ +{-# LANGUAGE GHC2024, BlockArguments, MagicHash #-} + +module T26216 (main) where + +import Data.Kind (Type, Constraint) +import GHC.TypeNats +import GHC.Exts (proxy#) + +import T26216_aux + +getN :: forall (n :: Nat). SNat n -> Natural +getN s = withKnownNat s (natVal s) + +type C :: forall {k}. (k -> Constraint) -> k -> Type +data C c a where { C :: c a => C c a } + +know :: forall (n :: Nat). SNat n -> C KnownNat n +know s = withKnownNat s C + +getC :: forall (n :: Nat). C KnownNat n -> Natural +getC C = natVal' (proxy# @n) + +main :: IO () +main = do + let !s = mkSome $ natSing @42 + !c = withSome s $ mkSome . know + print $ withSome s getN + print $ withSome c getC ===================================== testsuite/tests/bytecode/T26216.script ===================================== @@ -0,0 +1,2 @@ +:l T26216 +main ===================================== testsuite/tests/bytecode/T26216.stdout ===================================== @@ -0,0 +1,2 @@ +42 +42 ===================================== testsuite/tests/bytecode/T26216_aux.hs ===================================== @@ -0,0 +1,25 @@ +{-# LANGUAGE GHC2024 #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE PolyKinds #-} + +module T26216_aux (Some, data Some, mkSome, withSome) where +import Data.Kind (Type) +import GHC.Exts (Any) +import Unsafe.Coerce (unsafeCoerce) + +type Some :: (k -> Type) -> Type +newtype Some tag = UnsafeSome (tag Any) +type role Some representational + +{-# COMPLETE Some #-} +pattern Some :: tag a -> Some tag +pattern Some x <- UnsafeSome x + where Some x = UnsafeSome ((unsafeCoerce :: tag a -> tag Any) x) + +-- | Constructor. +mkSome :: tag a -> Some tag +mkSome = \x -> UnsafeSome (unsafeCoerce x) + +-- | Eliminator. +withSome :: Some tag -> (forall a. tag a -> b) -> b +withSome (UnsafeSome thing) some = some (unsafeCoerce thing) ===================================== testsuite/tests/bytecode/all.T ===================================== @@ -5,3 +5,7 @@ test('T23068', ghci_dump_bcos + [filter_stdout_lines(r'.*bitmap: .*')], ghci_scr test('T25975', extra_ways(ghci_ways), compile_and_run, # Some of the examples work more robustly with these flags ['-fno-break-points -fno-full-laziness']) + +# Nullary data constructors +test('T26216', extra_files(["T26216_aux.hs"]), ghci_script, ['T26216.script']) + ===================================== testsuite/tests/codeGen/should_run/T23146/all.T ===================================== @@ -1,4 +1,4 @@ test('T23146', expect_broken_for(23060, ghci_ways), compile_and_run, ['']) test('T23146_lifted', normal, compile_and_run, ['']) -test('T23146_liftedeq', expect_broken_for(23060, ghci_ways), compile_and_run, ['']) +test('T23146_liftedeq', normal, compile_and_run, ['']) test('T23146_lifted_unlifted', normal, compile_and_run, ['']) ===================================== testsuite/tests/parser/should_run/T26415.hs ===================================== @@ -0,0 +1,7 @@ +{-# LANGUAGE MultilineStrings #-} + +main :: IO () +main = do + -- The below strings contain the characters ['\\', '\t', '\\'] + print "\ \" + print """\ \""" ===================================== testsuite/tests/parser/should_run/T26415.stdout ===================================== @@ -0,0 +1,2 @@ +"" +"" ===================================== testsuite/tests/parser/should_run/all.T ===================================== @@ -27,6 +27,7 @@ test('RecordDotSyntax4', [extra_files(['RecordDotSyntaxA.hs'])], multimod_compil test('RecordDotSyntax5', normal, compile_and_run, ['']) test('ListTuplePunsConstraints', extra_files(['ListTuplePunsConstraints.hs']), ghci_script, ['ListTuplePunsConstraints.script']) test('T25937', normal, compile_and_run, ['']) +test('T26415', normal, compile_and_run, ['']) # Multiline strings test('MultilineStrings', normal, compile_and_run, ['']) ===================================== testsuite/tests/typecheck/should_compile/T25960.hs ===================================== @@ -0,0 +1,12 @@ +{-# LANGUAGE LambdaCase #-} + +module T25960 where + +import Data.Void (Void) + +f :: (forall a. Void -> a) -> (forall a. Void -> a) +f g = g + +absurd :: Void -> a +absurd = f (\case) + ===================================== testsuite/tests/typecheck/should_compile/all.T ===================================== @@ -935,4 +935,4 @@ test('T24845a', normal, compile, ['']) test('T23501a', normal, compile, ['']) test('T23501b', normal, compile, ['']) test('T25597', normal, compile, ['']) -test('T26256a', normal, compile, ['']) +test('T25960', normal, compile, ['']) ===================================== testsuite/tests/typecheck/should_fail/T25004k.hs ===================================== @@ -0,0 +1,9 @@ +{-# LANGUAGE RequiredTypeArguments, EmptyCase, LambdaCase #-} +{-# OPTIONS -Wincomplete-patterns #-} + +module T25004k where + +import Data.Kind + +f :: ((forall k. forall (xs :: k) -> ()) -> r) -> r +f cont = cont (\case {}) ===================================== testsuite/tests/typecheck/should_fail/T25004k.stderr ===================================== @@ -0,0 +1,7 @@ +T25004k.hs:9:16: error: [GHC-48010] + • Empty list of alternatives in \case expression + checked against a forall-type: forall (xs :: k) -> ... + • In the first argument of ‘cont’, namely ‘(\case)’ + In the expression: cont (\case) + In an equation for ‘f’: f cont = cont (\case) + ===================================== testsuite/tests/typecheck/should_fail/all.T ===================================== @@ -733,3 +733,4 @@ test('T24868', normal, compile_fail, ['']) test('T24938', normal, compile_fail, ['']) test('T25325', normal, compile_fail, ['']) test('T25004', normal, compile_fail, ['']) +test('T25004k', normal, compile_fail, ['']) View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e0050c9dd7a1c00098cdff641a925df... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e0050c9dd7a1c00098cdff641a925df... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Zubin (@wz1000)