[Git][ghc/ghc][wip/sjakobi/T27619-liveness-fixpoint-formats] 2 commits: NCG: iterate the liveness fixpoint until register formats converge
by Simon Jakobi (@sjakobi) 17 Aug '26
by Simon Jakobi (@sjakobi) 17 Aug '26
17 Aug '26
Simon Jakobi pushed to branch wip/sjakobi/T27619-liveness-fixpoint-formats at Glasgow Haskell Compiler / GHC
Commits:
103d8ba4 by Simon Jakobi at 2026-08-17T11:02:25+02:00
NCG: iterate the liveness fixpoint until register formats converge
The convergence test of the per-SCC liveness fixpoint in
GHC.CmmToAsm.Reg.Liveness compared BlockMap Regs values with the
key-only Eq of UniqSet, which ignores the Format attached to each
register. Formats grow across iterations (one control-flow edge per
iteration), so the fixpoint could stop while formats were still
growing, recording a vector register live at a too-narrow format and
handing the register allocator an under-sized spill/reload width
(#27619).
The test also compared the entire accumulated block map on every
iteration, although only the current SCC's entries can change, making
it quadratic in procedure size (#27437).
Compare only the SCC's own entries, using the new format-aware
equalRegs. See the new Note [Convergence of the liveness fixpoint].
Also remove the Eq instance of Regs: inherited from UniqSet, it
compared the register uniques only, silently ignoring the formats.
The convergence test was its sole user.
Fixes #27619. Fixes #27437.
Assisted-by: Claude Fable 5
- - - - -
8d5058d9 by Simon Jakobi at 2026-08-17T11:02:25+02:00
NCG: compare register formats by width, remove Ord Format
maxRegWithFormat, minusCoveredRegs and shrinkingRegs compared formats
with Format's derived Ord, which orders by constructor, not by width:
FF32 > II64, and VecFormat 16 FmtInt8 (16 bytes) > VecFormat 8
FmtDouble (64 bytes). This is harmless while all vector vregs are
128-bit, but becomes unsound in the (FmtBwd2) direction of
Note [Register formats in liveness analysis] once wider vectors land
in the NCG. Noted in #27619.
The comparisons now go by formatToWidth, except the liveness join
maxRegWithFormat, which needs a total order to keep the liveness
fixpoint convergent and uses the new width-major compareFormat. See
Note [Convergence of the liveness fixpoint] in GHC.CmmToAsm.Reg.Liveness.
Also remove the Ord instances of Format and ScalarFormat, so no future
call site can mistake the derived order for a width order. Their only
other user was a width test in GHC.CmmToAsm.PPC.CodeGen, now expressed
with formatToWidth.
Assisted-by: Claude Fable 5
- - - - -
7 changed files:
- compiler/GHC/CmmToAsm/Format.hs
- compiler/GHC/CmmToAsm/PPC/CodeGen.hs
- compiler/GHC/CmmToAsm/Reg/Liveness.hs
- compiler/GHC/CmmToAsm/Reg/Regs.hs
- compiler/GHC/Types/Unique/FM.hs
- + testsuite/tests/regalloc/T27619.hs
- testsuite/tests/regalloc/all.T
Changes:
=====================================
compiler/GHC/CmmToAsm/Format.hs
=====================================
@@ -23,6 +23,7 @@ module GHC.CmmToAsm.Format (
vecFormat,
isVecFormat,
cmmTypeFormat,
+ compareFormat,
formatToWidth,
scalarWidth,
formatInBytes,
@@ -40,11 +41,13 @@ where
import GHC.Prelude
+import Data.Semigroup ( (<>) )
+
import GHC.Cmm
import GHC.Platform.Reg ( Reg(..), RealReg, VirtualReg )
import GHC.Types.Unique ( Uniquable(..) )
import GHC.Types.Unique.Set
-import GHC.Utils.Outputable
+import GHC.Utils.Outputable hiding ( (<>) )
import GHC.Utils.Panic
{- Note [GHC's data format representations]
@@ -92,7 +95,9 @@ data Format
| FF64
| VecFormat !Length -- ^ number of elements (always at least 2)
!ScalarFormat -- ^ format of each element
- deriving (Show, Eq, Ord)
+ deriving (Show, Eq)
+ -- No Ord: compare via 'formatToWidth', or use 'compareFormat' where a
+ -- total order is needed.
pattern IntegerFormat :: Format
pattern IntegerFormat <- ( isIntegerFormat -> True )
@@ -117,7 +122,7 @@ data ScalarFormat
| FmtInt64
| FmtFloat
| FmtDouble
- deriving (Show, Eq, Ord)
+ deriving (Show, Eq)
scalarFormatFormat :: ScalarFormat -> Format
scalarFormatFormat = \case
@@ -248,6 +253,33 @@ scalarWidth = \case
formatInBytes :: Format -> Int
formatInBytes = widthInBytes . formatToWidth
+-- | Total order on formats: by width, with an arbitrary but fixed tiebreak
+-- between distinct formats of the same width.
+--
+-- See Note [Convergence of the liveness fixpoint] in GHC.CmmToAsm.Reg.Liveness.
+compareFormat :: Format -> Format -> Ordering
+compareFormat f1 f2 =
+ compare (formatToWidth f1) (formatToWidth f2) <> compare (tag f1) (tag f2)
+ where
+ tag :: Format -> (Int, Length)
+ tag = \case
+ II8 -> (0, 0)
+ II16 -> (1, 0)
+ II32 -> (2, 0)
+ II64 -> (3, 0)
+ FF32 -> (4, 0)
+ FF64 -> (5, 0)
+ VecFormat l s -> (6 + scalarTag s, l)
+
+ scalarTag :: ScalarFormat -> Int
+ scalarTag = \case
+ FmtInt8 -> 0
+ FmtInt16 -> 1
+ FmtInt32 -> 2
+ FmtInt64 -> 3
+ FmtFloat -> 4
+ FmtDouble -> 5
+
--------------------------------------------------------------------------------
-- | A typed virtual register: a virtual register, together with the specific
=====================================
compiler/GHC/CmmToAsm/PPC/CodeGen.hs
=====================================
@@ -484,7 +484,7 @@ getRegister' _ _ (CmmMachOp (MO_SS_Conv src tgt) [CmmLoad mem pk _])
, src < tgt = do
let format = cmmTypeFormat pk
-- lwa is DS-form. See Note [Power instruction format]
- let form = if format >= II32 then DS else D
+ let form = if formatToWidth format >= W32 then DS else D
Amode addr addr_code <- getAmode form mem
let code dst = assert (format == intFormat src)
$ addr_code `snocOL` LA format dst addr
=====================================
compiler/GHC/CmmToAsm/Reg/Liveness.hs
=====================================
@@ -879,7 +879,7 @@ computeLiveness platform sccs
, ppr sccs'])
livenessSCCs
- :: Instruction instr
+ :: forall instr. Instruction instr
=> Platform
-> BlockMap Regs
-> [SCC (LiveBasicBlock instr)] -- accum
@@ -897,37 +897,50 @@ livenessSCCs platform blockmap done (AcyclicSCC block : sccs)
livenessSCCs platform blockmap done
(CyclicSCC blocks : sccs) =
livenessSCCs platform blockmap' (CyclicSCC blocks':done) sccs
- where (blockmap', blocks')
- = iterateUntilUnchanged linearLiveness equalBlockMaps
- blockmap blocks
+ where (blockmap', blocks') = fixpoint blockmap
- iterateUntilUnchanged
- :: (a -> b -> (a,c)) -> (a -> a -> Bool)
- -> a -> b
- -> (a,c)
-
- iterateUntilUnchanged f eq aa b = go aa
+ -- See Note [Convergence of the liveness fixpoint]
+ fixpoint :: BlockMap Regs -> (BlockMap Regs, [LiveBasicBlock instr])
+ fixpoint bm
+ | all unchanged blocks = (bm', blocks'')
+ | otherwise = fixpoint bm'
where
- go a = if eq a a' then ac else go a'
- where
- ac@(a', _) = f a b
-
- linearLiveness
- :: Instruction instr
- => BlockMap Regs -> [LiveBasicBlock instr]
- -> (BlockMap Regs, [LiveBasicBlock instr])
-
- linearLiveness = mapAccumL (livenessBlock platform)
-
- -- probably the least efficient way to compare two
- -- BlockMaps for equality.
- equalBlockMaps :: BlockMap Regs -> BlockMap Regs -> Bool
- equalBlockMaps a b
- = a' == b'
- where a' = mapToList a
- b' = mapToList b
- -- See Note [Unique Determinism and code generation]
-
+ (bm', blocks'') = mapAccumL (livenessBlock platform) bm blocks
+
+ unchanged :: LiveBasicBlock instr -> Bool
+ unchanged block =
+ case (mapLookup bid bm, mapLookup bid bm') of
+ (Just old, Just new) -> old `equalRegs` new
+ (Nothing, _ ) -> False -- first iteration
+ (Just _, Nothing ) -> False -- can't happen
+ where bid = blockId block
+
+{- Note [Convergence of the liveness fixpoint]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+For a cyclic SCC, we iterate 'livenessBlock' over the SCC's blocks until the
+recorded entry liveness stops changing. Two subtleties in the convergence
+test:
+
+* It must compare register formats, not just sets of live registers –
+ hence the format-aware 'equalRegs'. A block's live-in set joins the
+ successors' entries with 'unionRegsMaxFmt', so a wide format may take one
+ iteration per control-flow edge to propagate backwards around a loop. The
+ register sets themselves are typically complete after the first iteration.
+ If we stopped as soon as the sets stabilise, a register could be recorded
+ at a narrower format than the reads it flows into. That would violate
+ property (FmtBwd1) of Note [Register formats in liveness analysis], which
+ the register allocator relies on for spill and reload widths. See #27619.
+
+* It is sufficient to compare the entries of the SCC's own blocks. No other
+ entries can change: 'livenessBlock' inserts only the block it processes,
+ and successor SCCs are already final because SCCs are processed in reverse
+ dependency order. Comparing the whole accumulated block map would make the
+ fixpoint quadratic in procedure size (#27437).
+
+To ensure termination, 'maxRegWithFormat' uses 'compareFormat' which defines a
+total order on formats. Comparing the widths only would introduce the risk of
+an infinite loop where each iteration swaps two formats of the same width.
+-}
-- | Annotate a basic block with register liveness information.
=====================================
compiler/GHC/CmmToAsm/Reg/Regs.hs
=====================================
@@ -13,16 +13,19 @@ module GHC.CmmToAsm.Reg.Regs (
shrinkingRegs,
mapRegs,
elemRegs, lookupReg,
+ equalRegs,
) where
import GHC.Prelude
import GHC.Platform.Reg ( Reg )
-import GHC.CmmToAsm.Format ( Format, RegWithFormat(..), isVecFormat )
+import GHC.CmmToAsm.Format ( Format, RegWithFormat(..), isVecFormat,
+ compareFormat, formatToWidth )
import GHC.Utils.Outputable ( Outputable )
import GHC.Types.Unique ( Uniquable(..) )
+import GHC.Types.Unique.FM ( equalUFMBy )
import GHC.Types.Unique.Set
import Data.Coerce ( coerce )
@@ -33,15 +36,16 @@ import Data.Coerce ( coerce )
-- register liveness analysis. See Note [Register formats in liveness analysis]
-- in GHC.CmmToAsm.Reg.Liveness.
newtype Regs = Regs { getRegs :: UniqSet RegWithFormat }
- deriving newtype (Eq, Outputable)
+ deriving newtype (Outputable)
maxRegWithFormat :: RegWithFormat -> RegWithFormat -> RegWithFormat
maxRegWithFormat r1@(RegWithFormat _ fmt1) r2@(RegWithFormat _ fmt2)
- = if fmt1 >= fmt2
- then r1
- else r2
- -- Re-using one of the arguments avoids allocating a new 'RegWithFormat',
- -- compared with returning 'RegWithFormat r1 (max fmt1 fmt2)'.
+ | LT <- compareFormat fmt1 fmt2 = r2
+ | otherwise = r1
+ -- See Note [Convergence of the liveness fixpoint] in
+ -- GHC.CmmToAsm.Reg.Liveness.
+ --
+ -- Re-using one of the arguments avoids allocating a new 'RegWithFormat'.
noRegs :: Regs
noRegs = Regs emptyUniqSet
@@ -64,7 +68,7 @@ minusCoveredRegs = coerce $ minusUniqSet_C f
where
f :: RegWithFormat -> RegWithFormat -> Maybe RegWithFormat
f r1@(RegWithFormat _ fmt1) (RegWithFormat _ fmt2) =
- if fmt2 >= fmt1
+ if formatToWidth fmt2 >= formatToWidth fmt1
||
not ( isVecFormat fmt1 )
-- See Wrinkle [Don't allow scalar partial writes]
@@ -97,7 +101,7 @@ shrinkingRegs = coerce $ minusUniqSet_C f
where
f :: RegWithFormat -> RegWithFormat -> Maybe RegWithFormat
f (RegWithFormat _ fmt1) r2@(RegWithFormat _ fmt2)
- | fmt2 < fmt1
+ | formatToWidth fmt2 < formatToWidth fmt1
= Just r2
| otherwise
= Nothing
@@ -117,3 +121,10 @@ elemRegs r (Regs live) = elemUniqSet_Directly (getUnique r) live
lookupReg :: Reg -> Regs -> Maybe Format
lookupReg r (Regs live) =
regWithFormat_format <$> lookupUniqSet_Directly live (getUnique r)
+
+-- | Do the two sets contain the same registers, at the same formats?
+equalRegs :: Regs -> Regs -> Bool
+equalRegs (Regs a) (Regs b) = equalUFMBy sameFormat (getUniqSet a) (getUniqSet b)
+ where
+ -- Registers with equal uniques are equal, so only compare the formats.
+ sameFormat (RegWithFormat _ fmt1) (RegWithFormat _ fmt2) = fmt1 == fmt2
=====================================
compiler/GHC/Types/Unique/FM.hs
=====================================
@@ -67,6 +67,7 @@ module GHC.Types.Unique.FM (
strictIntersectUFM_C,
disjointUFM,
equalKeysUFM,
+ equalUFMBy,
diffUFM,
nonDetStrictFoldUFM, nonDetFoldUFM, nonDetStrictFoldUFM_DirectlyM,
nonDetFoldWithKeyUFM,
@@ -590,7 +591,12 @@ unsafeCastUFMKey (UFM m) = UFM m
-- Determines whether two 'UniqFM's contain the same keys.
equalKeysUFM :: UniqFM key a -> UniqFM key b -> Bool
-equalKeysUFM (UFM m1) (UFM m2) = liftEq (\_ _ -> True) m1 m2
+equalKeysUFM = equalUFMBy (\_ _ -> True)
+
+-- | Determines whether two 'UniqFM's contain the same keys, with values
+-- that agree according to the given predicate.
+equalUFMBy :: (a -> b -> Bool) -> UniqFM key a -> UniqFM key b -> Bool
+equalUFMBy eq (UFM m1) (UFM m2) = liftEq eq m1 m2
-- | An edit on type @a@, relating an element of a container (like an entry in a
-- map or a line in a file) before and after.
=====================================
testsuite/tests/regalloc/T27619.hs
=====================================
@@ -0,0 +1,27 @@
+{-# LANGUAGE MagicHash, UnboxedTuples #-}
+
+-- The native code for this loop is a three-block cycle H -> X -> W -> H:
+--
+-- H, X: read v at FF64 (lane-0 extracts)
+-- W: reads v at F64x2 (the full unpack)
+--
+-- v is loop-invariant, so its live format on entry to every block in the
+-- cycle must be F64x2. -fno-cse keeps the two syntactically identical
+-- lane-0 extracts from being merged.
+module T27619 where
+
+import GHC.Exts
+
+loop :: Int# -> DoubleX2# -> Double# -> Double#
+loop i v acc =
+ case unpackDoubleX2# v of
+ (# a1, _ #) ->
+ if isTrue# (a1 <## int2Double# i)
+ then acc
+ else case unpackDoubleX2# v of
+ (# a2, _ #) ->
+ if isTrue# (a2 *## 2.0## <## int2Double# i)
+ then acc *## 2.0##
+ else case unpackDoubleX2# v of
+ (# x, y #) -> loop (i -# 1#) v (acc +## (x *## y))
+{-# NOINLINE loop #-}
=====================================
testsuite/tests/regalloc/all.T
=====================================
@@ -6,3 +6,14 @@ test('regalloc_unit_tests',
[ignore_stderr, only_ways(['normal'])], extra_run_opts('"' + config.libdir + '"') ],
compile_and_run,
['-package ghc'])
+
+# The liveness fixpoint must iterate until the register formats converge, not
+# just the sets of live registers (#27619). A vector register live at
+# VecFormat 2 FmtDouble around the loop must not be recorded at FF64.
+test('T27619',
+ [ unless(arch('x86_64'), skip),
+ when(not have_ncg(), skip),
+ only_ways(['normal']),
+ grep_errmsg(r'%vV128_\S+ :: FF64') ],
+ compile,
+ ['-O -fno-cse -ddump-asm-liveness'])
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/10e6330d9c54a295946b9aebb05a6d…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/10e6330d9c54a295946b9aebb05a6d…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/sjakobi/T27602] 3 commits: testsuite: Show baseline sample count and range in perf failures
by Simon Jakobi (@sjakobi) 17 Aug '26
by Simon Jakobi (@sjakobi) 17 Aug '26
17 Aug '26
Simon Jakobi pushed to branch wip/sjakobi/T27602 at Glasgow Haskell Compiler / GHC
Commits:
736fcdfb by Simon Jakobi at 2026-08-17T10:25:36+02:00
testsuite: Show baseline sample count and range in perf failures
A perf baseline is the mean of all samples recorded for a commit, and
it prints as a single number, hiding how far the samples spread. When
the spread is wide, this can indicate an unstable metric that isn't
actually useful as a signal for the perf tests.
For example, in #27602, T27336's peak_megabytes_allocated baseline
showed as 757 when the underlying samples were 605 and 909.
When the baseline is averaged from more than one sample, say so in the
failure output: the one-line stat-failure reason shows the sample
range, and the detail block lists the raw samples. Single-sample
baselines print exactly as before.
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
29b1d269 by Simon Jakobi at 2026-08-17T10:30:11+02:00
ci: Clarify comment on pushing perf notes after failures
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
9fc0bcaf by Simon Jakobi at 2026-08-17T10:30:11+02:00
DEMO: Tighten T3064 residency tolerance (do not merge)
Assisted-by: Claude Fable 5
- - - - -
3 changed files:
- .gitlab/ci.sh
- testsuite/driver/perf_notes.py
- testsuite/tests/perf/compiler/all.T
Changes:
=====================================
.gitlab/ci.sh
=====================================
@@ -1120,9 +1120,10 @@ case ${1:-help} in
setup) setup && cleanup_submodules ;;
configure) time_it "configure" configure ;;
build_hadrian) time_it "build" build_hadrian ;;
- # N.B. Always push notes, even if the build fails. This is okay to do as the
- # testsuite driver doesn't record notes for tests that fail due to
- # correctness.
+ # N.B. Always push notes, even if the build fails. Metrics from runs failing
+ # a perf stat check are deliberately recorded too — discarding them would
+ # bias the baseline towards whichever sample came first. Only correctness
+ # failures record nothing.
test_hadrian)
fetch_perf_notes
res=0
=====================================
testsuite/driver/perf_notes.py
=====================================
@@ -83,9 +83,18 @@ PerfStat = NamedTuple('PerfStat', [('test_env', TestEnv),
('metric', MetricName),
('value', float)])
+# A test's metric recovered from a commit's git note: the raw sample values
+# recorded there, and a PerfStat whose value is their mean.
+class CommitMetric(NamedTuple):
+ perfStat: PerfStat
+ samples: List[float]
+
# A baseline recovered form stored metrics.
-Baseline = NamedTuple('Baseline', [('perfStat', PerfStat),
- ('commit', GitHash)])
+class Baseline(NamedTuple):
+ perfStat: PerfStat
+ commit: GitHash
+ # The raw samples the baseline value was averaged over.
+ samples: List[float] = []
# The type of exceptions which are thrown when computing the current stat value
# fails.
@@ -460,10 +469,10 @@ def get_allowed_changes(baseline_ref: Optional[GitRef]) -> Dict[TestName, List[A
else:
return get_allowed_perf_changes()
-# Cache of baseline values. This is a dict of dicts indexed on:
-# (useCiNamespace, commit) -> (test_env, test, metric, way) -> baseline
-# (bool , str ) -> (str , str , str , str) -> float
-_commit_metric_cache = {} # type: ignore
+# Cache of commit metrics.
+_commit_metric_cache: Dict[Tuple[NoteNamespace, GitHash],
+ Dict[Tuple[TestEnv, TestName, MetricName, WayName],
+ CommitMetric]] = {}
# Get the baseline of a test at a given commit. This is the expected value
# *before* the commit is applied (i.e. on the parent commit).
@@ -506,7 +515,8 @@ def baseline_metric(commit: GitHash,
if baseline_commit is not None:
current_metric = get_commit_metric(namespace, baseline_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, baseline_commit)
+ return Baseline(current_metric.perfStat, baseline_commit,
+ current_metric.samples)
else:
return None
@@ -515,7 +525,8 @@ def baseline_metric(commit: GitHash,
# Check for a metric on this commit.
current_metric = get_commit_metric(namespace, current_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, current_commit)
+ return Baseline(current_metric.perfStat, current_commit,
+ current_metric.samples)
# Stop if there is an expected change at this commit. In that case
# metrics on ancestor commits will not be a valid baseline.
@@ -545,23 +556,23 @@ def get_commit_metric_value_str_or_none(gitNoteRef,
result = get_commit_metric(gitNoteRef, commit, test_env, name, metric, way)
if result is None:
return None
- return str(result.value)
+ return str(result.perfStat.value)
-# gets the average commit metric from git notes.
+# gets the commit metric (average and raw samples) from git notes.
# gitNoteRef: git notes ref space e.g. "perf" or "ci/perf"
# ref: git commit
# test_env: test environment
# name: test name
# metric: test metric
# way: test way
-# returns: PerfStat | None if stats don't exist for the given input
+# returns: CommitMetric | None if stats don't exist for the given input
def get_commit_metric(gitNoteRef,
ref: Union[GitRef, GitHash],
test_env: TestEnv,
name: TestName,
metric: MetricName,
way: WayName
- ) -> Optional[PerfStat]:
+ ) -> Optional[CommitMetric]:
global _commit_metric_cache
assert test_env != None
commit = commit_hash(ref)
@@ -573,9 +584,9 @@ def get_commit_metric(gitNoteRef,
return _commit_metric_cache[cacheKeyA].get(cacheKeyB)
# Cache miss.
- # Calculate baselines from the current commit's git note.
+ # Calculate metrics from the current commit's git note.
# Note that the git note may contain data for other tests. All tests'
- # baselines will be collected and cached for future use.
+ # metrics will be collected and cached for future use.
allCommitMetrics = get_perf_stats(ref, gitNoteRef)
# Collect recorded values by cacheKeyB.
@@ -586,19 +597,28 @@ def get_commit_metric(gitNoteRef,
currentValues = values_by_cache_key_b.setdefault(currentCacheKey, [])
currentValues.append(float(perfStat.value))
- # Calculate and baseline (average of values) by cacheKeyB.
- baseline_by_cache_key_b = {}
+ # Calculate the metric (average of values, plus the values themselves)
+ # by cacheKeyB.
+ metric_by_cache_key_b = {}
for currentCacheKey, currentValues in values_by_cache_key_b.items():
- baseline_by_cache_key_b[currentCacheKey] = PerfStat( \
- currentCacheKey[0],
- currentCacheKey[1],
- currentCacheKey[3],
- currentCacheKey[2],
- sum(currentValues) / len(currentValues))
+ metric_by_cache_key_b[currentCacheKey] = CommitMetric(
+ PerfStat(
+ currentCacheKey[0],
+ currentCacheKey[1],
+ currentCacheKey[3],
+ currentCacheKey[2],
+ sum(currentValues) / len(currentValues)),
+ currentValues)
+
+ # Save metrics to the cache.
+ _commit_metric_cache[cacheKeyA] = metric_by_cache_key_b
+ return metric_by_cache_key_b.get(cacheKeyB)
- # Save baselines to the cache.
- _commit_metric_cache[cacheKeyA] = baseline_by_cache_key_b
- return baseline_by_cache_key_b.get(cacheKeyB)
+def format_sample(s: float) -> str:
+ return str(int(s)) if s == int(s) else str(s)
+
+def format_samples(samples: List[float]) -> str:
+ return ', '.join(format_sample(s) for s in samples)
def check_stats_change(actual: PerfStat,
baseline: Baseline,
@@ -654,9 +674,17 @@ def check_stats_change(actual: PerfStat,
' baseline @ %s' % baseline.commit
print(actual.metric, error + ':')
dev = 100.0 if expected_val == 0 else round(((float(actual.value) * 100) / int(expected_val)) - 100, 1)
+ # Show the sample spread so unreliable baselines become visible (#27602).
+ if len(baseline.samples) > 1:
+ samples_note = ('; baseline is mean of %d samples spanning %s..%s'
+ % (len(baseline.samples),
+ format_sample(min(baseline.samples)),
+ format_sample(max(baseline.samples))))
+ else:
+ samples_note = ''
change_line = (f'{actual.metric} {change.value} from {baseline.perfStat.test_env} '
f'baseline @ {baseline.commit[:7]}: {expected_val} -> {actual.value} '
- f'({dev:+g}%, allowed {acceptance_window.describe()})')
+ f'({dev:+g}%, allowed {acceptance_window.describe()}{samples_note})')
result = failBecause('stat ' + change_line, tag='stat')
if not change_allowed or force_print:
@@ -666,6 +694,10 @@ def check_stats_change(actual: PerfStat,
print(descr, str(val).rjust(length), extra)
display(' Expected ' + full_name + ' ' + actual.metric + ':', expected_val, acceptance_window.describe())
+ if len(baseline.samples) > 1:
+ display(' Samples ' + full_name + ' ' + actual.metric + ':',
+ len(baseline.samples),
+ '(' + format_samples(baseline.samples) + ')')
display(' Lower bound ' + full_name + ' ' + actual.metric + ':', lowerBound, '')
display(' Upper bound ' + full_name + ' ' + actual.metric + ':', upperBound, '')
display(' Actual ' + full_name + ' ' + actual.metric + ':', actual.value, '')
@@ -866,7 +898,7 @@ def main() -> None:
# HEAD~2 21234 21234
# HEAD~3 20000 20000
def strMetric(x):
- return '{:.2f}'.format(x.value) if x != None else ""
+ return '{:.2f}'.format(x.perfStat.value) if x != None else ""
# Data is in column major format, so transpose and pass to print_table.
T = TypeVar('T')
def transpose(xss: List[List[T]]) -> List[List[T]]:
=====================================
testsuite/tests/perf/compiler/all.T
=====================================
@@ -48,7 +48,9 @@ test('T4801',
[''])
test('T3064',
- [collect_compiler_residency(20),
+ [# Demo-only: tightened from 20 so the bimodal max_bytes_used
+ # baseline on aarch64-linux-deb13-validate fails.
+ collect_compiler_residency(1),
collect_compiler_runtime(2),
only_ways(['normal']),
],
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/324435b2d2df03e43ffbb8059a2850…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/324435b2d2df03e43ffbb8059a2850…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/mangoiv/ci-stages] configure: fix sed script and subst tooldir script
by Magnus (@MangoIV) 17 Aug '26
by Magnus (@MangoIV) 17 Aug '26
17 Aug '26
Magnus pushed to branch wip/mangoiv/ci-stages at Glasgow Haskell Compiler / GHC
Commits:
03e3bc4e by mangoiv at 2026-08-17T09:38:33+02:00
configure: fix sed script and subst tooldir script
Fixes #27672
- - - - -
2 changed files:
- distrib/configure.ac.in
- m4/subst_tooldir.m4
Changes:
=====================================
distrib/configure.ac.in
=====================================
@@ -103,7 +103,7 @@ AC_ARG_ENABLE(distro-toolchain,
AC_SUBST([EnableDistroToolchain])
if test "$HostOS" = "mingw32" -a "$EnableDistroToolchain" = "NO"; then
- FP_SETUP_WINDOWS_TOOLCHAIN([$hardtop/mingw/], [\$\$topdir/../mingw/])
+ FP_SETUP_WINDOWS_TOOLCHAIN([$hardtop/mingw/], [\$topdir/../mingw/])
fi
=====================================
m4/subst_tooldir.m4
=====================================
@@ -41,5 +41,5 @@ dnl ghc-toolchain.
# See Note [How we configure the bundled windows toolchain]
AC_DEFUN([SUBST_TOOLDIR],
[
- sed -i.bkp $1 's%'"$mingw_prefix"'%'"$mingw_install_prefix"'%g'
+ sed -i.bkp 's%'"$mingw_prefix"'%'"$mingw_install_prefix"'%g' $1
])
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/03e3bc4ecb964373785da11442c1c9c…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/03e3bc4ecb964373785da11442c1c9c…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/mangoiv/ci-stages] configure: fix sed script and subst tooldir script
by Magnus (@MangoIV) 17 Aug '26
by Magnus (@MangoIV) 17 Aug '26
17 Aug '26
Magnus pushed to branch wip/mangoiv/ci-stages at Glasgow Haskell Compiler / GHC
Commits:
1ffe3ba7 by mangoiv at 2026-08-17T09:38:13+02:00
configure: fix sed script and subst tooldir script
- - - - -
2 changed files:
- distrib/configure.ac.in
- m4/subst_tooldir.m4
Changes:
=====================================
distrib/configure.ac.in
=====================================
@@ -103,7 +103,7 @@ AC_ARG_ENABLE(distro-toolchain,
AC_SUBST([EnableDistroToolchain])
if test "$HostOS" = "mingw32" -a "$EnableDistroToolchain" = "NO"; then
- FP_SETUP_WINDOWS_TOOLCHAIN([$hardtop/mingw/], [\$\$topdir/../mingw/])
+ FP_SETUP_WINDOWS_TOOLCHAIN([$hardtop/mingw/], [\$topdir/../mingw/])
fi
=====================================
m4/subst_tooldir.m4
=====================================
@@ -41,5 +41,5 @@ dnl ghc-toolchain.
# See Note [How we configure the bundled windows toolchain]
AC_DEFUN([SUBST_TOOLDIR],
[
- sed -i.bkp $1 's%'"$mingw_prefix"'%'"$mingw_install_prefix"'%g'
+ sed -i.bkp 's%'"$mingw_prefix"'%'"$mingw_install_prefix"'%g' $1
])
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1ffe3ba77e71f10a47ba5847be1ec54…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/1ffe3ba77e71f10a47ba5847be1ec54…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/sjakobi/T27602] 3 commits: testsuite: Show baseline sample count and spread in perf failures
by Simon Jakobi (@sjakobi) 16 Aug '26
by Simon Jakobi (@sjakobi) 16 Aug '26
16 Aug '26
Simon Jakobi pushed to branch wip/sjakobi/T27602 at Glasgow Haskell Compiler / GHC
Commits:
9dd81712 by Simon Jakobi at 2026-08-16T21:19:49+02:00
testsuite: Show baseline sample count and spread in perf failures
A perf baseline is the mean of all samples recorded for a commit, so a
single outlier can silently corrupt it. Previously, the failure output
gave no hint about such outliers: the baseline printed as one number.
In #27602, T27336's peak_megabytes_allocated baseline showed as 757
when the underlying samples were 605 and 909.
When the baseline is averaged from more than one sample, say so in the
failure message and list the samples, both in the one-line stat-failure
reason and in the detail block. Single-sample baselines print exactly
as before.
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
0ea57bad by Simon Jakobi at 2026-08-16T21:19:49+02:00
ci: Clarify comment on pushing perf notes after failures
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
324435b2 by Simon Jakobi at 2026-08-16T21:19:49+02:00
DEMO: Tighten T3064 residency tolerance (do not merge)
Assisted-by: Claude Fable 5
- - - - -
3 changed files:
- .gitlab/ci.sh
- testsuite/driver/perf_notes.py
- testsuite/tests/perf/compiler/all.T
Changes:
=====================================
.gitlab/ci.sh
=====================================
@@ -1120,9 +1120,10 @@ case ${1:-help} in
setup) setup && cleanup_submodules ;;
configure) time_it "configure" configure ;;
build_hadrian) time_it "build" build_hadrian ;;
- # N.B. Always push notes, even if the build fails. This is okay to do as the
- # testsuite driver doesn't record notes for tests that fail due to
- # correctness.
+ # N.B. Always push notes, even if the build fails. Metrics from runs failing
+ # a perf stat check are deliberately recorded too — discarding them would
+ # bias the baseline towards whichever sample came first. Only correctness
+ # failures record nothing.
test_hadrian)
fetch_perf_notes
res=0
=====================================
testsuite/driver/perf_notes.py
=====================================
@@ -83,9 +83,18 @@ PerfStat = NamedTuple('PerfStat', [('test_env', TestEnv),
('metric', MetricName),
('value', float)])
+# A test's metric recovered from a commit's git note: the raw sample values
+# recorded there, and a PerfStat whose value is their mean.
+class CommitMetric(NamedTuple):
+ perfStat: PerfStat
+ samples: List[float]
+
# A baseline recovered form stored metrics.
-Baseline = NamedTuple('Baseline', [('perfStat', PerfStat),
- ('commit', GitHash)])
+class Baseline(NamedTuple):
+ perfStat: PerfStat
+ commit: GitHash
+ # The raw samples the baseline value was averaged over.
+ samples: List[float] = []
# The type of exceptions which are thrown when computing the current stat value
# fails.
@@ -460,10 +469,10 @@ def get_allowed_changes(baseline_ref: Optional[GitRef]) -> Dict[TestName, List[A
else:
return get_allowed_perf_changes()
-# Cache of baseline values. This is a dict of dicts indexed on:
-# (useCiNamespace, commit) -> (test_env, test, metric, way) -> baseline
-# (bool , str ) -> (str , str , str , str) -> float
-_commit_metric_cache = {} # type: ignore
+# Cache of commit metrics.
+_commit_metric_cache: Dict[Tuple[NoteNamespace, GitHash],
+ Dict[Tuple[TestEnv, TestName, MetricName, WayName],
+ CommitMetric]] = {}
# Get the baseline of a test at a given commit. This is the expected value
# *before* the commit is applied (i.e. on the parent commit).
@@ -506,7 +515,8 @@ def baseline_metric(commit: GitHash,
if baseline_commit is not None:
current_metric = get_commit_metric(namespace, baseline_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, baseline_commit)
+ return Baseline(current_metric.perfStat, baseline_commit,
+ current_metric.samples)
else:
return None
@@ -515,7 +525,8 @@ def baseline_metric(commit: GitHash,
# Check for a metric on this commit.
current_metric = get_commit_metric(namespace, current_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, current_commit)
+ return Baseline(current_metric.perfStat, current_commit,
+ current_metric.samples)
# Stop if there is an expected change at this commit. In that case
# metrics on ancestor commits will not be a valid baseline.
@@ -545,23 +556,23 @@ def get_commit_metric_value_str_or_none(gitNoteRef,
result = get_commit_metric(gitNoteRef, commit, test_env, name, metric, way)
if result is None:
return None
- return str(result.value)
+ return str(result.perfStat.value)
-# gets the average commit metric from git notes.
+# gets the commit metric (average and raw samples) from git notes.
# gitNoteRef: git notes ref space e.g. "perf" or "ci/perf"
# ref: git commit
# test_env: test environment
# name: test name
# metric: test metric
# way: test way
-# returns: PerfStat | None if stats don't exist for the given input
+# returns: CommitMetric | None if stats don't exist for the given input
def get_commit_metric(gitNoteRef,
ref: Union[GitRef, GitHash],
test_env: TestEnv,
name: TestName,
metric: MetricName,
way: WayName
- ) -> Optional[PerfStat]:
+ ) -> Optional[CommitMetric]:
global _commit_metric_cache
assert test_env != None
commit = commit_hash(ref)
@@ -573,9 +584,9 @@ def get_commit_metric(gitNoteRef,
return _commit_metric_cache[cacheKeyA].get(cacheKeyB)
# Cache miss.
- # Calculate baselines from the current commit's git note.
+ # Calculate metrics from the current commit's git note.
# Note that the git note may contain data for other tests. All tests'
- # baselines will be collected and cached for future use.
+ # metrics will be collected and cached for future use.
allCommitMetrics = get_perf_stats(ref, gitNoteRef)
# Collect recorded values by cacheKeyB.
@@ -586,19 +597,25 @@ def get_commit_metric(gitNoteRef,
currentValues = values_by_cache_key_b.setdefault(currentCacheKey, [])
currentValues.append(float(perfStat.value))
- # Calculate and baseline (average of values) by cacheKeyB.
- baseline_by_cache_key_b = {}
+ # Calculate the metric (average of values, plus the values themselves)
+ # by cacheKeyB.
+ metric_by_cache_key_b = {}
for currentCacheKey, currentValues in values_by_cache_key_b.items():
- baseline_by_cache_key_b[currentCacheKey] = PerfStat( \
- currentCacheKey[0],
- currentCacheKey[1],
- currentCacheKey[3],
- currentCacheKey[2],
- sum(currentValues) / len(currentValues))
-
- # Save baselines to the cache.
- _commit_metric_cache[cacheKeyA] = baseline_by_cache_key_b
- return baseline_by_cache_key_b.get(cacheKeyB)
+ metric_by_cache_key_b[currentCacheKey] = CommitMetric(
+ PerfStat(
+ currentCacheKey[0],
+ currentCacheKey[1],
+ currentCacheKey[3],
+ currentCacheKey[2],
+ sum(currentValues) / len(currentValues)),
+ currentValues)
+
+ # Save metrics to the cache.
+ _commit_metric_cache[cacheKeyA] = metric_by_cache_key_b
+ return metric_by_cache_key_b.get(cacheKeyB)
+
+def format_samples(samples: List[float]) -> str:
+ return ', '.join(str(int(s)) if s == int(s) else str(s) for s in samples)
def check_stats_change(actual: PerfStat,
baseline: Baseline,
@@ -654,9 +671,16 @@ def check_stats_change(actual: PerfStat,
' baseline @ %s' % baseline.commit
print(actual.metric, error + ':')
dev = 100.0 if expected_val == 0 else round(((float(actual.value) * 100) / int(expected_val)) - 100, 1)
+ # Show the samples so outliers become visible (#27602).
+ if len(baseline.samples) > 1:
+ samples_note = ('; baseline is mean of %d samples: %s'
+ % (len(baseline.samples),
+ format_samples(baseline.samples)))
+ else:
+ samples_note = ''
change_line = (f'{actual.metric} {change.value} from {baseline.perfStat.test_env} '
f'baseline @ {baseline.commit[:7]}: {expected_val} -> {actual.value} '
- f'({dev:+g}%, allowed {acceptance_window.describe()})')
+ f'({dev:+g}%, allowed {acceptance_window.describe()}{samples_note})')
result = failBecause('stat ' + change_line, tag='stat')
if not change_allowed or force_print:
@@ -666,6 +690,10 @@ def check_stats_change(actual: PerfStat,
print(descr, str(val).rjust(length), extra)
display(' Expected ' + full_name + ' ' + actual.metric + ':', expected_val, acceptance_window.describe())
+ if len(baseline.samples) > 1:
+ display(' Samples ' + full_name + ' ' + actual.metric + ':',
+ len(baseline.samples),
+ '(' + format_samples(baseline.samples) + ')')
display(' Lower bound ' + full_name + ' ' + actual.metric + ':', lowerBound, '')
display(' Upper bound ' + full_name + ' ' + actual.metric + ':', upperBound, '')
display(' Actual ' + full_name + ' ' + actual.metric + ':', actual.value, '')
@@ -866,7 +894,7 @@ def main() -> None:
# HEAD~2 21234 21234
# HEAD~3 20000 20000
def strMetric(x):
- return '{:.2f}'.format(x.value) if x != None else ""
+ return '{:.2f}'.format(x.perfStat.value) if x != None else ""
# Data is in column major format, so transpose and pass to print_table.
T = TypeVar('T')
def transpose(xss: List[List[T]]) -> List[List[T]]:
=====================================
testsuite/tests/perf/compiler/all.T
=====================================
@@ -48,7 +48,9 @@ test('T4801',
[''])
test('T3064',
- [collect_compiler_residency(20),
+ [# Demo-only: tightened from 20 so the bimodal max_bytes_used
+ # baseline on aarch64-linux-deb13-validate fails.
+ collect_compiler_residency(1),
collect_compiler_runtime(2),
only_ways(['normal']),
],
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/89a9867d67346af26f4f4e8f4caae5…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/89a9867d67346af26f4f4e8f4caae5…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc] Pushed new branch wip/az/epa-tidy-locatedxxx-17
by Alan Zimmerman (@alanz) 16 Aug '26
by Alan Zimmerman (@alanz) 16 Aug '26
16 Aug '26
Alan Zimmerman pushed new branch wip/az/epa-tidy-locatedxxx-17 at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/az/epa-tidy-locatedxxx-17
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/sjakobi/T27602] 3 commits: testsuite: Show baseline sample count and spread in perf failures
by Simon Jakobi (@sjakobi) 16 Aug '26
by Simon Jakobi (@sjakobi) 16 Aug '26
16 Aug '26
Simon Jakobi pushed to branch wip/sjakobi/T27602 at Glasgow Haskell Compiler / GHC
Commits:
c9aaa39c by Simon Jakobi at 2026-08-16T21:15:10+02:00
testsuite: Show baseline sample count and spread in perf failures
A perf baseline is the mean of all samples recorded for a commit, so a
single outlier can silently corrupt it. Previously, the failure output
gave no hint about such outliers: the baseline printed as one number.
In #27602, T27336's peak_megabytes_allocated baseline showed as 757
when the underlying samples were 605 and 909.
When the baseline is averaged from more than one sample, say so in the
failure message and list the samples, both in the one-line stat-failure
reason and in the detail block. Single-sample baselines print exactly
as before.
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
2ad08df6 by Simon Jakobi at 2026-08-16T21:15:10+02:00
ci: Clarify comment on pushing perf notes after failures
Context: #27602
Assisted-by: Claude Fable 5
- - - - -
89a9867d by Simon Jakobi at 2026-08-16T21:15:10+02:00
DEMO: Tighten T3064 residency tolerance (do not merge)
Assisted-by: Claude Fable 5
- - - - -
3 changed files:
- .gitlab/ci.sh
- testsuite/driver/perf_notes.py
- testsuite/tests/perf/compiler/all.T
Changes:
=====================================
.gitlab/ci.sh
=====================================
@@ -1120,9 +1120,10 @@ case ${1:-help} in
setup) setup && cleanup_submodules ;;
configure) time_it "configure" configure ;;
build_hadrian) time_it "build" build_hadrian ;;
- # N.B. Always push notes, even if the build fails. This is okay to do as the
- # testsuite driver doesn't record notes for tests that fail due to
- # correctness.
+ # N.B. Always push notes, even if the build fails. Metrics from runs failing
+ # a perf stat check are deliberately recorded too — discarding them would
+ # bias the baseline towards whichever sample came first. Only correctness
+ # failures record nothing.
test_hadrian)
fetch_perf_notes
res=0
=====================================
testsuite/driver/perf_notes.py
=====================================
@@ -83,9 +83,18 @@ PerfStat = NamedTuple('PerfStat', [('test_env', TestEnv),
('metric', MetricName),
('value', float)])
+# A test's metric recovered from a commit's git note: the raw sample values
+# recorded there, and a PerfStat whose value is their mean.
+class CommitMetric(NamedTuple):
+ perfStat: PerfStat
+ samples: List[float]
+
# A baseline recovered form stored metrics.
-Baseline = NamedTuple('Baseline', [('perfStat', PerfStat),
- ('commit', GitHash)])
+class Baseline(NamedTuple):
+ perfStat: PerfStat
+ commit: GitHash
+ # The raw samples the baseline value was averaged over.
+ samples: List[float] = []
# The type of exceptions which are thrown when computing the current stat value
# fails.
@@ -460,9 +469,8 @@ def get_allowed_changes(baseline_ref: Optional[GitRef]) -> Dict[TestName, List[A
else:
return get_allowed_perf_changes()
-# Cache of baseline values. This is a dict of dicts indexed on:
-# (useCiNamespace, commit) -> (test_env, test, metric, way) -> baseline
-# (bool , str ) -> (str , str , str , str) -> float
+# Cache of commit metrics. This is a dict of dicts indexed on:
+# (useCiNamespace, commit) -> (test_env, test, metric, way) -> CommitMetric
_commit_metric_cache = {} # type: ignore
# Get the baseline of a test at a given commit. This is the expected value
@@ -506,7 +514,8 @@ def baseline_metric(commit: GitHash,
if baseline_commit is not None:
current_metric = get_commit_metric(namespace, baseline_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, baseline_commit)
+ return Baseline(current_metric.perfStat, baseline_commit,
+ current_metric.samples)
else:
return None
@@ -515,7 +524,8 @@ def baseline_metric(commit: GitHash,
# Check for a metric on this commit.
current_metric = get_commit_metric(namespace, current_commit, test_env, name, metric, way)
if current_metric is not None:
- return Baseline(current_metric, current_commit)
+ return Baseline(current_metric.perfStat, current_commit,
+ current_metric.samples)
# Stop if there is an expected change at this commit. In that case
# metrics on ancestor commits will not be a valid baseline.
@@ -545,23 +555,23 @@ def get_commit_metric_value_str_or_none(gitNoteRef,
result = get_commit_metric(gitNoteRef, commit, test_env, name, metric, way)
if result is None:
return None
- return str(result.value)
+ return str(result.perfStat.value)
-# gets the average commit metric from git notes.
+# gets the commit metric (average and raw samples) from git notes.
# gitNoteRef: git notes ref space e.g. "perf" or "ci/perf"
# ref: git commit
# test_env: test environment
# name: test name
# metric: test metric
# way: test way
-# returns: PerfStat | None if stats don't exist for the given input
+# returns: CommitMetric | None if stats don't exist for the given input
def get_commit_metric(gitNoteRef,
ref: Union[GitRef, GitHash],
test_env: TestEnv,
name: TestName,
metric: MetricName,
way: WayName
- ) -> Optional[PerfStat]:
+ ) -> Optional[CommitMetric]:
global _commit_metric_cache
assert test_env != None
commit = commit_hash(ref)
@@ -573,9 +583,9 @@ def get_commit_metric(gitNoteRef,
return _commit_metric_cache[cacheKeyA].get(cacheKeyB)
# Cache miss.
- # Calculate baselines from the current commit's git note.
+ # Calculate metrics from the current commit's git note.
# Note that the git note may contain data for other tests. All tests'
- # baselines will be collected and cached for future use.
+ # metrics will be collected and cached for future use.
allCommitMetrics = get_perf_stats(ref, gitNoteRef)
# Collect recorded values by cacheKeyB.
@@ -586,19 +596,25 @@ def get_commit_metric(gitNoteRef,
currentValues = values_by_cache_key_b.setdefault(currentCacheKey, [])
currentValues.append(float(perfStat.value))
- # Calculate and baseline (average of values) by cacheKeyB.
- baseline_by_cache_key_b = {}
+ # Calculate the metric (average of values, plus the values themselves)
+ # by cacheKeyB.
+ metric_by_cache_key_b = {}
for currentCacheKey, currentValues in values_by_cache_key_b.items():
- baseline_by_cache_key_b[currentCacheKey] = PerfStat( \
- currentCacheKey[0],
- currentCacheKey[1],
- currentCacheKey[3],
- currentCacheKey[2],
- sum(currentValues) / len(currentValues))
-
- # Save baselines to the cache.
- _commit_metric_cache[cacheKeyA] = baseline_by_cache_key_b
- return baseline_by_cache_key_b.get(cacheKeyB)
+ metric_by_cache_key_b[currentCacheKey] = CommitMetric(
+ PerfStat(
+ currentCacheKey[0],
+ currentCacheKey[1],
+ currentCacheKey[3],
+ currentCacheKey[2],
+ sum(currentValues) / len(currentValues)),
+ currentValues)
+
+ # Save metrics to the cache.
+ _commit_metric_cache[cacheKeyA] = metric_by_cache_key_b
+ return metric_by_cache_key_b.get(cacheKeyB)
+
+def format_samples(samples: List[float]) -> str:
+ return ', '.join(str(int(s)) if s == int(s) else str(s) for s in samples)
def check_stats_change(actual: PerfStat,
baseline: Baseline,
@@ -654,9 +670,16 @@ def check_stats_change(actual: PerfStat,
' baseline @ %s' % baseline.commit
print(actual.metric, error + ':')
dev = 100.0 if expected_val == 0 else round(((float(actual.value) * 100) / int(expected_val)) - 100, 1)
+ # Show the samples so outliers become visible (#27602).
+ if len(baseline.samples) > 1:
+ samples_note = ('; baseline is mean of %d samples: %s'
+ % (len(baseline.samples),
+ format_samples(baseline.samples)))
+ else:
+ samples_note = ''
change_line = (f'{actual.metric} {change.value} from {baseline.perfStat.test_env} '
f'baseline @ {baseline.commit[:7]}: {expected_val} -> {actual.value} '
- f'({dev:+g}%, allowed {acceptance_window.describe()})')
+ f'({dev:+g}%, allowed {acceptance_window.describe()}{samples_note})')
result = failBecause('stat ' + change_line, tag='stat')
if not change_allowed or force_print:
@@ -666,6 +689,10 @@ def check_stats_change(actual: PerfStat,
print(descr, str(val).rjust(length), extra)
display(' Expected ' + full_name + ' ' + actual.metric + ':', expected_val, acceptance_window.describe())
+ if len(baseline.samples) > 1:
+ display(' Samples ' + full_name + ' ' + actual.metric + ':',
+ len(baseline.samples),
+ '(' + format_samples(baseline.samples) + ')')
display(' Lower bound ' + full_name + ' ' + actual.metric + ':', lowerBound, '')
display(' Upper bound ' + full_name + ' ' + actual.metric + ':', upperBound, '')
display(' Actual ' + full_name + ' ' + actual.metric + ':', actual.value, '')
@@ -866,7 +893,7 @@ def main() -> None:
# HEAD~2 21234 21234
# HEAD~3 20000 20000
def strMetric(x):
- return '{:.2f}'.format(x.value) if x != None else ""
+ return '{:.2f}'.format(x.perfStat.value) if x != None else ""
# Data is in column major format, so transpose and pass to print_table.
T = TypeVar('T')
def transpose(xss: List[List[T]]) -> List[List[T]]:
=====================================
testsuite/tests/perf/compiler/all.T
=====================================
@@ -48,7 +48,9 @@ test('T4801',
[''])
test('T3064',
- [collect_compiler_residency(20),
+ [# Demo-only: tightened from 20 so the bimodal max_bytes_used
+ # baseline on aarch64-linux-deb13-validate fails.
+ collect_compiler_residency(1),
collect_compiler_runtime(2),
only_ways(['normal']),
],
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e17c0f57f0a408b8c715a50366d7b8…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/e17c0f57f0a408b8c715a50366d7b8…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
[Git][ghc/ghc][wip/az/exactprint-annotation-rationalisation] 50 commits: driver: Link object files in a deterministic order
by Alan Zimmerman (@alanz) 16 Aug '26
by Alan Zimmerman (@alanz) 16 Aug '26
16 Aug '26
Alan Zimmerman pushed to branch wip/az/exactprint-annotation-rationalisation at Glasgow Haskell Compiler / GHC
Commits:
e8d1a0d6 by Bernhard M. Wiedemann at 2026-08-10T21:31:23-04:00
driver: Link object files in a deterministic order
The object files handed to the linker come from the HomePackageTable,
which is ordered by the order in which modules finished compiling. With
-j1 that is the build plan order, with -jN it is whatever the scheduler
produced, so the same sources can link to different (but equivalent)
binaries.
The order reaches the output: .text and .rodata contributions are
concatenated in link order, so e.g. building the hdav executable of the
DAV package twice, once with -j1 and once with -j4, yields two binaries
that differ in ~100kB of section contents.
Sort the home modules by module before collecting their linkables,
guarded under `Opt_ObjectDeterminism` .
Fixes #27612
Signed-off-by: Bernhard M. Wiedemann <bwiedemann(a)suse.de>
- - - - -
556db2f3 by sheaf at 2026-08-10T21:32:06-04:00
Reduce SpecConstr threshold in GHC.Tc.Solver.Rewrite
As remarked in #27628, this module currently sits on a knife's edge: if
the body of 'simplifyArgsWorker' is made even a tiny bit smaller, then
SpecConstr suddenly kicks in and causes disastrous reboxing of the
LiftingContext argument.
To make this less likely to happen, this commit lowers the SpecConstr
threshold.
- - - - -
c77d88fc by sheaf at 2026-08-13T10:15:22-04:00
Allow rewriting in RuntimeReps for newtype ConPats
This commit implements PHASE 2 of the FixedRuntimeRep plan described in
Note [The Concrete mechanism] in GHC.Tc.Utils.Concrete for newtype
constructor patterns.
In short, GHC now accepts programs of the form
f (MkN x) = ...
in which the argument 'x' of the newtype constructor pattern 'MkN x'
has a representation that is not syntactically concrete, e.g. it can be
'Id IntRep' reducing to 'IntRep'. See T20363{,b,c} for examples.
There are two main parts to the implementation:
1. Typechecking, in GHC.Tc.Gen.Pat.tcDataConPat.
See Note [Typechecking newtype constructor patterns] in GHC.Tc.Gen.Pat.
2. Desugaring. We restructure the code for desugaring pattern matches
by allowing the scrutinised match variable to be casted. This allows
us to accumulate coercions and avoids creating binders at intermediate
types tha don't have a fixed RuntimeRep.
See the revamped Note [Match Ids] in GHC.HsToCore.Monad.
Fixes #20363
-------------------------
Metric Increase:
InstanceMatching
-------------------------
- - - - -
6ba9dd41 by Wolfgang Jeltsch at 2026-08-13T10:16:07-04:00
Improve the documentation of `--show-iface`
This change in particular gets rid of the claim that `--show-iface`
writes *the* contents of the interface file in question. It doesn’t do
that; it only writes those parts that are likely of interest to a human
reader.
- - - - -
4bd193fa by Sylvain Henry at 2026-08-13T10:17:00-04:00
RTS: fix LDV profiler's slop skipping (#27585)
processHeapForDead was the one heap scanner not updated for the slop
marker encoding introduced in #19048. It still assumed slop is zeroed:
while (p < bd->free && !*p) p++; // skip slop
so it stopped at the (StgWord)(-1) sentinel and passed it to
processHeapClosureForDead. IS_FORWARDING_PTR(-1) holds, hence a garbage
size was read out of LDVW and the scan ran off the block, tripping
ASSERT(p == bd->free) on a debug RTS and silently corrupting the census
otherwise.
The loop was hand-copied in four places, so factor it out into skipSlop
in ClosureMacros.h and use it in ProfHeap.c, Sanity.c, Printer.c and
LdvProfile.c.
Co-Authored-By: Claude Opus 5 (1M context) <noreply(a)anthropic.com>
- - - - -
1446bb03 by Zubin Duggal at 2026-08-13T10:17:48-04:00
hadrian: Fix links to remaining doc sites to not use the package hash for haddock links
In 07267f79d91169f474cacc8bcd38d76a6e97887d we changed hadrian to not include the package hash in the haddock
directory. This patch takes care of a few remaining links that were missed in that patch
Fixes #27671
- - - - -
257c3ed7 by Simon Jakobi at 2026-08-13T10:18:29-04:00
Testsuite: widen InstanceMatching acceptance window to 5% (#27673)
...in order to unblock CI.
Assisted-by: Claude Fable 5
- - - - -
e4cfaaa0 by Simon Peyton Jones at 2026-08-14T01:09:32+02:00
Major patch to re-engineer known-key names
This big patch implements the New Plan for known-key names,
described in #27013.
Read the big Note [Overview of known-key names] in GHC.Types.Name
Some things had to be reworked slightly to accomodate the new known-keys
design. A significant one was the generation of auxiliary KindRep
bindings, which was greatly simplified. Note [Grand plan for Typeable]
was updated accordingly. Another example: GHC.Internal.CString was
merged into GHC.Internal.Types.
Co-authored-by: Rodrigo Mesquita <rodrigo.m.mesquita(a)gmail.com>
The couple hundreds of hours spent here by Rodrigo were sponsored by Well-Typed
Metrics: compile_time/bytes allocated
-------------------------------------
Baseline
Test Metric value New value Change
------------------------------------------------------------------------------------------
MultiComponentModules100(normal) ghc/alloc 24,312,779,672 24,990,470,432 +2.8% BAD
MultiComponentModulesRecomp(normal) ghc/alloc 601,924,960 621,884,888 +3.3% BAD
MultiComponentModulesRecomp100(normal) ghc/alloc 11,884,065,432 12,531,373,704 +5.4% BAD
MultiLayerModules(normal) ghc/alloc 3,861,537,072 3,706,919,512 -4.0% GOOD
T13701(normal) ghc/alloc 3,517,246,392 3,237,179,616 -8.0% GOOD
T13820(normal) ghc/alloc 28,961,056 29,663,208 +2.4% BAD
T14697(normal) ghc/alloc 472,044,184 443,550,048 -6.0% GOOD
T18140(normal) ghc/alloc 47,905,664 49,115,808 +2.5% BAD
T4801(normal) ghc/alloc 269,339,096 263,432,040 -2.2% GOOD
T783(normal) ghc/alloc 341,112,672 333,339,952 -2.3% GOOD
hard_hole_fits(normal) ghc/alloc 222,164,728 213,433,808 -3.9% GOOD
mhu-perf(normal) ghc/alloc 49,011,440 46,706,280 -4.7% GOOD
geo. mean +0.1%
minimum -8.0%
maximum +5.4%
All performance regressions were investigated in depth. The surviving
ones:
- MultiComponentModules100, MultiComponentModulesRecomp100,
MultiComponentModulesRecomp regresses because existing bugs that make
an additional implicit edge do too much redundant work: #27053 and #27461
- T13820, T18140, T10547, T13035 regress because we load an additional
interface and associated Names for GHC.Essentials.
-------------------------
Metric Decrease:
MultiLayerModules
T13379
T13701
T14697
T26989
T4801
T783
T9961
hard_hole_fits
mhu-perf
size_hello_artifact
size_hello_obj
size_hello_unicode
Metric Increase:
LinkableUsage01
LinkableUsage02
MultiComponentModules100
MultiComponentModulesRecomp
MultiComponentModulesRecomp100
T10547
T13035
T13820
T18140
T18698a
T18698b
T20049
-------------------------
Bumps submodule binary
Closes #27013
- - - - -
61665e79 by sheaf at 2026-08-14T01:09:33+02:00
Allow GHC.Essentials to be hidden
This commit overhauls several aspects of the known entity handling,
in order to allow GHC.Essentials to be hidden without a proliferation
of special cases in the compiler.
The main contribution is to introduce the 'UnresolvedImport' datatype
which cleans up a lot of ad-hoc handling relating to 'ModSummary',
fixing #27603. This allows us to reduce duplication, e.g. by having
Backpack reuse 'mkUnresolvedImports' instead of replicating the
"add implicit imports" logic. It also makes it easier to avoid
undesirable edge cases (such as making sure that the Template Haskell
'reifyModule' function does not leak the implicit GHC.Essentials import).
In particular, the infamous 'findImportedModuleWithIsBoot' is now simply
'resolveImport', taking a single 'UnresolvedImport' and resolving it
to a 'FindResult' (usually a 'Module').
Other changes:
- Cache the result of looking up GHC.Essentials (in TcM and DsM
environments) to avoid redundant work.
This reduces allocations on LinkableUsage01 and hard_hole_fits.
- Properly look up known entities for StaticPointers like we do for
other known entities everywhere else. This allows e.g. modules in
ghc-internal to use -XStaticPointers.
- When using multiple home units, we are now careful to handle the
situation in which we may have multiple GHC.Essentials modules
around. See the new tests under 'driver/multipleHomeUnits'.
- - - - -
b19fcc1c by Vladislav Zavialov at 2026-08-14T06:26:11-04:00
Increase test coverage of diagnostics, batch 2
Add test cases for the previously untested diagnostics:
[GHC-26133] TcRnForeignImportPrimSafeAnn
[GHC-68444] SumAltArityExceeded
[GHC-63966] IllegalSumAlt
[GHC-23882] IllegalDeclaration
[GHC-60220] InvalidCCallImpent
[GHC-18816] RecGadtNoCons
[GHC-38140] GadtNoCons
[GHC-37056] InvalidTypeInstanceHeader
[GHC-78486] InvalidTyFamInstLHS
[GHC-39639] DefaultDataInstDecl
[GHC-78822] AssocDefaultNotAssoc
[GHC-43510] NotSimpleUnliftedType
[GHC-41843] IOResultExpected
[GHC-07641] AtLeastOneArgExpected
[GHC-52886] InvalidTopDecl
Remove unused error constructors:
[GHC-92057] ImportLookupAmbiguous
- - - - -
7b27f25a by Simon Jakobi at 2026-08-14T06:26:54-04:00
testsuite: Drop peak_megabytes_allocated from LinkableUsage tests
LinkableUsage01/02 collected all metrics with a 2% tolerance. For
peak_megabytes_allocated, whose granularity is 1 MB, that window is
under 0.7 MB at this test's ~34 MB peak, so any 1 MB step failed the
test (#27613, #27489). Drop that metric: max_bytes_used guards the
Linkable-retention property with byte granularity, at a tolerance
that still comfortably exceeds the noise observed in CI.
Assisted-by: Claude Fable 5
- - - - -
e5de423b by Simon Jakobi at 2026-08-14T06:26:54-04:00
testsuite: Don't truncate fractional baselines when computing bounds
RelativeMetricAcceptanceWindow.get_bounds truncated the baseline with
int() before applying the tolerance. Baselines can be fractional (they
are averaged over several measurements), so this skewed the acceptance
window downwards: in #27613, a baseline of 33.67 at 2% tolerance
yielded bounds (32, 34) instead of (32, 35), rejecting a measurement
that was within tolerance.
Assisted-by: Claude Fable 5
- - - - -
db959f83 by Simon Jakobi at 2026-08-14T15:16:44-04:00
testsuite: Expect length001 failure in nonmoving_thr_sanity
length001 relies on an optimization rule to avoid excessive stack use.
The nonmoving_thr_sanity way does not enable optimization, so classify
its stack overflow as an expected failure, as is already done for the
other unoptimized nonmoving ways.
Assisted-by: gpt-5.6-sol via Codex CLI
- - - - -
4f2b7d90 by Simon Jakobi at 2026-08-14T15:16:44-04:00
testsuite: Omit T22859 in nonmoving threaded ways
T22859 checks allocation-limit handlers with output that depends on
precise allocation behaviour. The nonmoving threaded ways change where
these limits are reached, just as the already-omitted LLVM ways do.
Omit these ways instead of treating their incidental output differences
as test failures.
Assisted-by: gpt-5.6-sol via Codex CLI
- - - - -
c4abddcb by Simon Jakobi at 2026-08-14T15:16:44-04:00
rts/js: Implement eq_thread, and test Eq/Ord ThreadId (#16761)
Since d1f3c63701, Eq ThreadId is implemented via the RTS function
eq_thread, but the JS RTS never provided it, so comparing ThreadIds
for equality on the JS backend crashed with
ReferenceError: h$eq_thread is not defined
Like the C implementation, h$eq_thread uses pointer equality: The JS
RTS has exactly one thread object per thread.
Since previously no test exercised eq_thread directly, this commit
adds a test covering equality, its stability across GC, and agreement
with Ord.
Assisted-by: Claude Fable 5
- - - - -
4a7defa1 by Simon Jakobi at 2026-08-14T15:16:44-04:00
testsuite: Make listThreads1 insensitive to the RTS's own threads
listThreads1 expected `listThreads` to return exactly [ThreadId 1]. That
holds only under a non-threaded RTS. Under a threaded RTS however there
are more threads present, so we change the test to simply check that
`myThreadId` is present in the list.
Assisted-by: Claude Opus 5
- - - - -
b757727a by Vladislav Zavialov at 2026-08-14T15:17:27-04:00
Fix tcLookupId panic with RequiredTypeArguments and PatternSynonyms (#27586)
The arguments declared on the left-hand side of a pattern synonym are looked up
as term variables bound by its right-hand side. Prior to this patch, that lookup
panicked with RequiredTypeArguments:
data T a where
MkT :: forall a -> T a
pattern P :: Int -> T Int
pattern P x = MkT x
On the RHS, `x` looks like a term argument, so the renamer binds it in the term
namespace. Only during type checking does it turn out to be a type variable, so
the lookup on the LHS finds an ATyVar rather than an ATcId. As the lookup was
done with tcLookupId, it resulted in a panic.
Now the arguments are looked up with tcLookupPatSynArg, which reports an illegal
term-level use of `x`, just as an ordinary function definition `f (MkT x) = x`
does.
Test cases: T27586a T27586b T27586c
Assisted-by: Claude Opus 5
- - - - -
0267b681 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
Make hadrian/hie-bios.bat executable
Commit 9df24b7e5fa8e76c01270ce1e708ab4cbcefacd1 renamed
hadrian/hie-bios to hadrian/hie-bios.bat
Under Linux thix file is not executable, so the Haskell Language
Server cradle invocation silently fails, and starts up without
configuration.
This commit sets the executable flag on the file
- - - - -
61c72627 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Remove al_trailing from AnnList
It was not being used
- - - - -
6c0538cf by Alan Zimmerman at 2026-08-15T11:04:15+01:00
TTG: Add extension points to BooleanFormula
They are currently unused, but will be used for exact print annotations next
- - - - -
74c7f059 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Remove LocatedBC / SrcSpanBF
- - - - -
6e56d9a7 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: remove unused addTrailingAnnToL. Squash appropriately
- - - - -
0d2e4571 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPS: Remove NoEpTok/NoEpUniTok, using an unhelpful SrcSpan instead
Also introduce helper functions noEpTok and noEpUniTok to serve
as simple replacements in code inserting an token annotation without
location information.
- - - - -
6c263ab5 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Some haddock processing tweaks
- - - - -
8fb1c2e8 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
Some haddock exactprint tests
- - - - -
455fdcb5 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: When adding comments honour trailing anns
- - - - -
87d45d53 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Uses Parsers.parseModule for exactprint tests
This is the advertised way to parse for use for exact printing in the
ghc-exactprint library, make sure we test using it.
- - - - -
ff1e1b03 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA Fix HsCmdDo exact print with comments
TODO: add test based on proc-do-complex-four-out.hs
- - - - -
889c8e2e by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Add comments about remaining Anno SrcSpan instances
- - - - -
874ca3c7 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Plan for Fixing AnnList Layout Properly
- - - - -
f559a192 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Remove ListBanana / ListParens from AnnListBrackets
- - - - -
1bd92b18 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Tidy up mkHsDoPv, take AnnList directly
And some extra stuff by accident.
The main goal is to slim down AnnListBrackets to just have braces or
none.
This makes it clear that it serves only for lists which may have layout,
and opens the route to use EpLayout instead of AnnListBrackets
- - - - -
2d094d87 by Alan Zimmerman at 2026-08-15T11:04:15+01:00
EPA: Add specific layout field to AnnList
- - - - -
ff92e69a by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA: Use EpaLocation in EpVirtualBraces
reword:
EPA Use vocurly as basis for AnnListLayout
For the existing cases that populate AnnList.
This also shows up AnnList usages that can never capture layout.
- - - - -
d4d44fce by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA Use vocurly as basis for AnnListLayout
For the existing cases that populate AnnList.
This also shows up AnnList usages that can never capture layout.
- - - - -
c1bb170e by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA: AnnList clean up patch for empty where clause
- - - - -
200ad2de by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA: Add TTG fields to FamilyInfo
This commit is a simple add, with unused extension fields.
It lays the groundwork for using them for exact print annotations
- - - - -
37faf7fb by Alan Zimmerman at 2026-08-15T16:30:25+01:00
WIP annclassdecl
- - - - -
6dcfc2de by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA: Update AnnClsInstDecl to contain AnnList
It was already separately tracking the '{', '}' and leading ';' values.
This aligns it with layout-introducing parser productions ('vocurly'),
so the layout processing can be handled uniformly
- - - - -
802e2ea2 by Alan Zimmerman at 2026-08-15T16:30:25+01:00
EPA: Tidy up markAnnListA'
It takes an action which can modify the AnnList, but this
is never used. So remove it.
- - - - -
cdf4051a by Alan Zimmerman at 2026-08-15T17:57:49+01:00
EPA: Use AnnList for GADT declarations
- - - - -
8f2a5ae6 by Alan Zimmerman at 2026-08-15T17:57:49+01:00
EPA: Use AnnList in AnnClassDecl
- - - - -
949a3c49 by Alan Zimmerman at 2026-08-15T17:57:49+01:00
Update AnnList plan. do not put into MR
- - - - -
ea8c1cb4 by Alan Zimmerman at 2026-08-16T19:20:24+01:00
EPA: Make local binds located
Use LHsLocalBinds instead of HsLocalBinds
This reverses an earlier change, and brings processing of local binds
into alignement with the exact printing principle that the LocatedA
contents provide the location and extent of the enclosed item,
together with any comments or context-specific trailing items like
commas or semi colons.
The internal TTG extension points only carry exact print annotations
related to printing the item within its bounds.
This change brings back the problem of EmptyLocalBinds, which by
definition cannot have a location. These get a noSrcSpan location,
which is ignored in the exact printing process.
- - - - -
422dbdd4 by Alan Zimmerman at 2026-08-16T19:27:15+01:00
EPA: First pass implementation of HsList, for ClassDecls
Just as a straight list replacement to start with, no payload.
This shows the scope and invasiveness of the initial change
- - - - -
3ccdc509 by Alan Zimmerman at 2026-08-16T19:27:15+01:00
EPA: HsList attempt WIP
- - - - -
ebbb664c by Alan Zimmerman at 2026-08-16T19:27:15+01:00
Enable ppr test for Haddock1. It currently fails
- - - - -
d5ea6b87 by Alan Zimmerman at 2026-08-16T19:27:15+01:00
WIP on removing NoEpAnn. Likely abandon
- - - - -
385f0500 by Alan Zimmerman at 2026-08-16T19:27:15+01:00
EPA: Add an overview doc for exact printing
- - - - -
c5fc327e by Simon Peyton Jones at 2026-08-16T19:27:15+01:00
Added an intro section
- - - - -
933 changed files:
- + ANNLIST-LAYOUT-PLAN.md
- + ExactPrint.md
- + changelog.d/T20363
- + changelog.d/T27586
- changelog.d/fix-heap-census-large-arrays-19048
- + changelog.d/link-deterministic-order
- + changelog.d/refactor-known-names
- compiler/GHC.hs
- + compiler/GHC/Builtin.hs
- + compiler/GHC/Builtin/KnownKeys.hs
- + compiler/GHC/Builtin/KnownOccs.hs
- + compiler/GHC/Builtin/Modules.hs
- − compiler/GHC/Builtin/Names.hs
- − compiler/GHC/Builtin/Names/TH.hs
- compiler/GHC/Builtin/PrimOps.hs
- compiler/GHC/Builtin/PrimOps/Casts.hs
- compiler/GHC/Builtin/PrimOps/Ids.hs
- + compiler/GHC/Builtin/TH.hs
- compiler/GHC/Builtin/Uniques.hs
- compiler/GHC/Builtin/Uniques.hs-boot
- − compiler/GHC/Builtin/Utils.hs
- + compiler/GHC/Builtin/WiredIn/Ids.hs
- compiler/GHC/Builtin/Types/Prim.hs → compiler/GHC/Builtin/WiredIn/Prim.hs
- compiler/GHC/Builtin/Types/Literals.hs → compiler/GHC/Builtin/WiredIn/TypeLits.hs
- compiler/GHC/Builtin/Types.hs → compiler/GHC/Builtin/WiredIn/Types.hs
- compiler/GHC/Builtin/Types.hs-boot → compiler/GHC/Builtin/WiredIn/Types.hs-boot
- compiler/GHC/ByteCode/Asm.hs
- compiler/GHC/Core.hs
- compiler/GHC/Core/Class.hs
- compiler/GHC/Core/Coercion.hs
- compiler/GHC/Core/DataCon.hs
- compiler/GHC/Core/FVs.hs
- compiler/GHC/Core/FamInstEnv.hs
- compiler/GHC/Core/Lint.hs
- compiler/GHC/Core/Make.hs
- compiler/GHC/Core/Multiplicity.hs
- compiler/GHC/Core/Opt/Arity.hs
- compiler/GHC/Core/Opt/ConstantFold.hs
- compiler/GHC/Core/Opt/CprAnal.hs
- compiler/GHC/Core/Opt/DmdAnal.hs
- compiler/GHC/Core/Opt/LiberateCase.hs
- compiler/GHC/Core/Opt/OccurAnal.hs
- compiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Core/Opt/Simplify/Env.hs
- compiler/GHC/Core/Opt/Simplify/Iteration.hs
- compiler/GHC/Core/Opt/SpecConstr.hs
- compiler/GHC/Core/Opt/Specialise.hs
- compiler/GHC/Core/Opt/WorkWrap/Utils.hs
- compiler/GHC/Core/Ppr.hs
- compiler/GHC/Core/Predicate.hs
- compiler/GHC/Core/Rules.hs
- compiler/GHC/Core/SimpleOpt.hs
- compiler/GHC/Core/Subst.hs
- compiler/GHC/Core/TyCo/FVs.hs
- compiler/GHC/Core/TyCo/Rep.hs
- compiler/GHC/Core/TyCon.hs
- compiler/GHC/Core/Type.hs
- compiler/GHC/Core/Unfold.hs
- compiler/GHC/Core/Unify.hs
- compiler/GHC/Core/Utils.hs
- compiler/GHC/CoreToIface.hs
- compiler/GHC/CoreToStg.hs
- compiler/GHC/CoreToStg/Prep.hs
- compiler/GHC/Data/BooleanFormula.hs
- compiler/GHC/Driver/Backpack.hs
- compiler/GHC/Driver/Config/Tidy.hs
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/DynFlags.hs
- compiler/GHC/Driver/Env.hs
- compiler/GHC/Driver/Env/KnotVars.hs
- compiler/GHC/Driver/Env/Types.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Main/Hsc.hs
- compiler/GHC/Driver/Main/Interactive.hs
- compiler/GHC/Driver/Main/Passes.hs
- compiler/GHC/Driver/Make.hs
- compiler/GHC/Driver/MakeFile.hs
- compiler/GHC/Driver/Pipeline.hs
- compiler/GHC/Driver/Pipeline/Execute.hs
- compiler/GHC/Driver/Plugins.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Hs.hs
- compiler/GHC/Hs/Binds.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Doc.hs
- compiler/GHC/Hs/DocString.hs
- compiler/GHC/Hs/Dump.hs
- compiler/GHC/Hs/Expr.hs
- compiler/GHC/Hs/Extension/Pass.hs
- compiler/GHC/Hs/ImpExp.hs
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/Hs/Pat.hs
- compiler/GHC/Hs/Stats.hs
- compiler/GHC/Hs/Syn/Type.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore.hs
- compiler/GHC/HsToCore/Arrows.hs
- compiler/GHC/HsToCore/Binds.hs
- compiler/GHC/HsToCore/Expr.hs
- compiler/GHC/HsToCore/Expr.hs-boot
- compiler/GHC/HsToCore/Foreign/C.hs
- compiler/GHC/HsToCore/Foreign/Call.hs
- compiler/GHC/HsToCore/Foreign/JavaScript.hs
- compiler/GHC/HsToCore/Foreign/Utils.hs
- compiler/GHC/HsToCore/Foreign/Wasm.hs
- compiler/GHC/HsToCore/ListComp.hs
- compiler/GHC/HsToCore/Match.hs
- compiler/GHC/HsToCore/Match.hs-boot
- compiler/GHC/HsToCore/Match/Constructor.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Monad.hs
- compiler/GHC/HsToCore/Pmc/Check.hs
- compiler/GHC/HsToCore/Pmc/Desugar.hs
- compiler/GHC/HsToCore/Pmc/Ppr.hs
- compiler/GHC/HsToCore/Pmc/Solver.hs
- compiler/GHC/HsToCore/Pmc/Solver/Types.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/HsToCore/Ticks.hs
- compiler/GHC/HsToCore/Types.hs
- compiler/GHC/HsToCore/Usage.hs
- compiler/GHC/HsToCore/Utils.hs
- compiler/GHC/Iface/Binary.hs
- compiler/GHC/Iface/Env.hs
- − compiler/GHC/Iface/Env.hs-boot
- compiler/GHC/Iface/Errors/Ppr.hs
- compiler/GHC/Iface/Errors/Types.hs
- compiler/GHC/Iface/Ext/Ast.hs
- compiler/GHC/Iface/Load.hs
- compiler/GHC/Iface/Make.hs
- compiler/GHC/Iface/Recomp.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Tidy.hs
- compiler/GHC/Iface/Type.hs
- compiler/GHC/IfaceToCore.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/Annotation.hs
- compiler/GHC/Parser/Errors/Ppr.hs
- compiler/GHC/Parser/Header.hs
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Parser/PostProcess/Haddock.hs
- compiler/GHC/Plugins.hs
- compiler/GHC/Rename/Bind.hs
- compiler/GHC/Rename/Env.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Rename/HsType.hs
- compiler/GHC/Rename/Lit.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Names.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Splice.hs
- compiler/GHC/Rename/Unbound.hs
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Runtime/Context.hs
- compiler/GHC/Runtime/Debugger.hs
- compiler/GHC/Runtime/Eval.hs
- compiler/GHC/Runtime/Heap/Inspect.hs
- compiler/GHC/Runtime/Interpreter.hs
- compiler/GHC/Runtime/Loader.hs
- compiler/GHC/Stg/BcPrep.hs
- compiler/GHC/Stg/Unarise.hs
- compiler/GHC/StgToByteCode.hs
- compiler/GHC/StgToCmm/Bind.hs
- compiler/GHC/StgToCmm/DataCon.hs
- compiler/GHC/StgToCmm/Env.hs
- compiler/GHC/StgToCmm/Foreign.hs
- compiler/GHC/StgToCmm/Lit.hs
- compiler/GHC/StgToCmm/Ticky.hs
- compiler/GHC/StgToJS/Apply.hs
- compiler/GHC/StgToJS/Arg.hs
- compiler/GHC/StgToJS/Expr.hs
- compiler/GHC/StgToJS/FFI.hs
- compiler/GHC/StgToJS/Linker/Utils.hs
- compiler/GHC/StgToJS/Utils.hs
- compiler/GHC/Tc/Deriv.hs
- compiler/GHC/Tc/Deriv/Functor.hs
- compiler/GHC/Tc/Deriv/Generate.hs
- compiler/GHC/Tc/Deriv/Generics.hs
- compiler/GHC/Tc/Deriv/Infer.hs
- compiler/GHC/Tc/Deriv/Utils.hs
- compiler/GHC/Tc/Errors.hs
- compiler/GHC/Tc/Errors/Hole.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/Arrow.hs
- compiler/GHC/Tc/Gen/Bind.hs
- compiler/GHC/Tc/Gen/Default.hs
- compiler/GHC/Tc/Gen/Export.hs
- compiler/GHC/Tc/Gen/Expr.hs
- compiler/GHC/Tc/Gen/Foreign.hs
- compiler/GHC/Tc/Gen/Head.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Gen/Match.hs
- compiler/GHC/Tc/Gen/Pat.hs
- compiler/GHC/Tc/Gen/Sig.hs
- compiler/GHC/Tc/Gen/Splice.hs
- compiler/GHC/Tc/Instance/Class.hs
- compiler/GHC/Tc/Instance/FunDeps.hs
- compiler/GHC/Tc/Instance/Typeable.hs
- compiler/GHC/Tc/Module.hs
- compiler/GHC/Tc/Plugin.hs
- compiler/GHC/Tc/Solver.hs
- compiler/GHC/Tc/Solver/Default.hs
- compiler/GHC/Tc/Solver/Dict.hs
- compiler/GHC/Tc/Solver/FunDeps.hs
- compiler/GHC/Tc/Solver/InertSet.hs
- compiler/GHC/Tc/Solver/Monad.hs
- compiler/GHC/Tc/Solver/Rewrite.hs
- compiler/GHC/Tc/TyCl.hs
- compiler/GHC/Tc/TyCl/Build.hs
- compiler/GHC/Tc/TyCl/Class.hs
- compiler/GHC/Tc/TyCl/Instance.hs
- compiler/GHC/Tc/TyCl/PatSyn.hs
- compiler/GHC/Tc/TyCl/Utils.hs
- compiler/GHC/Tc/Types.hs
- compiler/GHC/Tc/Types/Constraint.hs
- compiler/GHC/Tc/Types/Evidence.hs
- compiler/GHC/Tc/Types/LclEnv.hs
- compiler/GHC/Tc/Types/Origin.hs
- compiler/GHC/Tc/Utils/Backpack.hs
- compiler/GHC/Tc/Utils/Concrete.hs
- compiler/GHC/Tc/Utils/Env.hs
- compiler/GHC/Tc/Utils/Instantiate.hs
- compiler/GHC/Tc/Utils/Monad.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/Tc/Utils/TcType.hs
- compiler/GHC/Tc/Utils/Unify.hs
- compiler/GHC/Tc/Validity.hs
- compiler/GHC/Tc/Zonk/Type.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/DefaultEnv.hs
- compiler/GHC/Types/Error/Codes.hs
- compiler/GHC/Types/Hint.hs
- compiler/GHC/Types/Hint/Ppr.hs
- compiler/GHC/Types/Id/Make.hs
- compiler/GHC/Types/Literal.hs
- compiler/GHC/Types/Name.hs
- compiler/GHC/Types/Name/Cache.hs
- compiler/GHC/Types/Name/Ppr.hs
- compiler/GHC/Types/Name/Reader.hs
- compiler/GHC/Types/RepType.hs
- compiler/GHC/Types/TyThing.hs
- compiler/GHC/Types/Unique.hs
- compiler/GHC/Types/Unique/FM.hs
- + compiler/GHC/Types/UnresolvedImport.hs
- compiler/GHC/Types/Var.hs
- compiler/GHC/Unit.hs
- compiler/GHC/Unit/External.hs
- compiler/GHC/Unit/External/Index.hs
- compiler/GHC/Unit/External/ModuleOrigin.hs
- compiler/GHC/Unit/External/Providers.hs
- compiler/GHC/Unit/Finder.hs
- compiler/GHC/Unit/Finder/Types.hs
- compiler/GHC/Unit/Module/Deps.hs
- compiler/GHC/Unit/Module/ModSummary.hs
- compiler/GHC/Unit/State.hs
- compiler/GHC/Unit/Types.hs
- compiler/GHC/Utils/Binary.hs
- − compiler/GHC/Utils/Binary/Typeable.hs
- compiler/Language/Haskell/Syntax.hs
- compiler/Language/Haskell/Syntax/Basic.hs
- compiler/Language/Haskell/Syntax/BooleanFormula.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Expr.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/ghc.cabal.in
- docs/index.html.in
- docs/users_guide/ghc_config.py.in
- docs/users_guide/separate_compilation.rst
- docs/users_guide/using.rst
- ghc/GHCi/UI.hs
- ghc/GHCi/UI/Monad.hs
- ghc/Main.hs
- hadrian/hie-bios.bat
- hadrian/src/Rules/Generate.hs
- libraries/base/base.cabal.in
- libraries/base/src/Control/Applicative.hs
- libraries/base/src/Control/Concurrent.hs
- libraries/base/src/Control/Concurrent/Chan.hs
- libraries/base/src/Control/Concurrent/QSem.hs
- libraries/base/src/Control/Concurrent/QSemN.hs
- libraries/base/src/Data/Array/Byte.hs
- libraries/base/src/Data/Bifoldable.hs
- libraries/base/src/Data/Bifoldable1.hs
- libraries/base/src/Data/Bifunctor.hs
- libraries/base/src/Data/Bitraversable.hs
- libraries/base/src/Data/Bool.hs
- libraries/base/src/Data/Complex.hs
- libraries/base/src/Data/Data.hs
- libraries/base/src/Data/Enum.hs
- libraries/base/src/Data/Fixed.hs
- libraries/base/src/Data/Foldable1.hs
- libraries/base/src/Data/Functor/Classes.hs
- libraries/base/src/Data/Functor/Compose.hs
- libraries/base/src/Data/Functor/Contravariant.hs
- libraries/base/src/Data/Functor/Product.hs
- libraries/base/src/Data/Functor/Sum.hs
- libraries/base/src/Data/List.hs
- libraries/base/src/Data/List/NonEmpty.hs
- libraries/base/src/Data/List/NubOrdSet.hs
- libraries/base/src/Data/Semigroup.hs
- libraries/base/src/Data/Version.hs
- libraries/base/src/GHC/Base.hs
- libraries/base/src/GHC/ByteOrder.hs
- + libraries/base/src/GHC/Essentials.hs
- libraries/base/src/GHC/Exts.hs
- libraries/base/src/GHC/Fingerprint.hs
- libraries/base/src/GHC/RTS/Flags.hs
- libraries/base/src/GHC/ResponseFile.hs
- libraries/base/src/GHC/Stats.hs
- libraries/base/src/GHC/Weak/Finalize.hs
- libraries/base/src/Numeric.hs
- libraries/base/src/Prelude.hs
- libraries/base/src/System/CPUTime/Posix/ClockGetTime.hsc
- libraries/base/src/System/CPUTime/Posix/RUsage.hsc
- libraries/base/src/System/CPUTime/Posix/Times.hsc
- libraries/base/src/System/CPUTime/Unsupported.hs
- libraries/base/src/System/Console/GetOpt.hs
- libraries/base/src/System/Exit.hs
- libraries/base/src/System/IO.hs
- libraries/base/src/System/IO/OS.hs
- libraries/base/src/System/IO/Unsafe.hs
- libraries/base/src/System/Info.hs
- libraries/base/src/System/Timeout.hs
- libraries/base/src/Text/Printf.hs
- libraries/base/src/Text/Read.hs
- libraries/base/src/Text/Show/Functions.hs
- libraries/base/tests/all.T
- libraries/base/tests/listThreads1.hs
- libraries/base/tests/listThreads1.stdout
- libraries/binary
- libraries/ghc-experimental/src/Data/Sum/Experimental.hs
- libraries/ghc-experimental/src/Data/Tuple/Experimental.hs
- libraries/ghc-experimental/src/GHC/Profiling/Eras.hs
- libraries/ghc-experimental/src/Prelude/Experimental.hs
- libraries/ghc-internal/codepages/MakeTable.hs
- libraries/ghc-internal/ghc-internal.cabal.in
- libraries/ghc-internal/include/RtsIfaceSymbols.h
- libraries/ghc-internal/src/GHC/Internal/AllocationLimitHandler.hs
- libraries/ghc-internal/src/GHC/Internal/Arr.hs
- libraries/ghc-internal/src/GHC/Internal/ArrayArray.hs
- libraries/ghc-internal/src/GHC/Internal/Base.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/Backend.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/Backend/GMP.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/Backend/Native.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/BigNat.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/BigNat.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Bignum/Integer.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/Integer.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Bignum/Natural.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/Natural.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Bignum/Primitives.hs
- libraries/ghc-internal/src/GHC/Internal/Bignum/WordArray.hs
- libraries/ghc-internal/src/GHC/Internal/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/ByteOrder.hs
- libraries/ghc-internal/src/GHC/Internal/CString.hs
- libraries/ghc-internal/src/GHC/Internal/Char.hs
- libraries/ghc-internal/src/GHC/Internal/Classes.hs
- libraries/ghc-internal/src/GHC/Internal/Classes/IP.hs
- libraries/ghc-internal/src/GHC/Internal/Clock.hsc
- libraries/ghc-internal/src/GHC/Internal/ClosureTypes.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Bound.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/IO.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/POSIX.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/POSIX/Const.hsc
- libraries/ghc-internal/src/GHC/Internal/Conc/Signal.hs
- libraries/ghc-internal/src/GHC/Internal/Conc/Sync.hs
- libraries/ghc-internal/src/GHC/Internal/ConsoleHandler.hsc
- libraries/ghc-internal/src/GHC/Internal/Control/Arrow.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Category.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Concurrent/MVar.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Exception/Base.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fail.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/IO/Class.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Zip.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Coerce.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Data.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Dynamic.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Either.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Foldable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Function.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Const.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Identity.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Utils.hs
- libraries/ghc-internal/src/GHC/Internal/Data/IORef.hs
- libraries/ghc-internal/src/GHC/Internal/Data/List.hs
- libraries/ghc-internal/src/GHC/Internal/Data/List/NonEmpty.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Maybe.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Monoid.hs
- libraries/ghc-internal/src/GHC/Internal/Data/NonEmpty.hs
- libraries/ghc-internal/src/GHC/Internal/Data/OldList.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Ord.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Proxy.hs
- libraries/ghc-internal/src/GHC/Internal/Data/STRef.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Semigroup/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Data/String.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Traversable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Tuple.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Bool.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Coercion.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Equality.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Type/Ord.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Typeable.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Typeable/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Unique.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Version.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Void.hs
- libraries/ghc-internal/src/GHC/Internal/Debug/Trace.hs
- libraries/ghc-internal/src/GHC/Internal/Desugar.hs
- libraries/ghc-internal/src/GHC/Internal/Encoding/UTF8.hs
- libraries/ghc-internal/src/GHC/Internal/Enum.hs
- libraries/ghc-internal/src/GHC/Internal/Enum.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Environment.hs
- libraries/ghc-internal/src/GHC/Internal/Err.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Arr.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Array.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Control.hs
- libraries/ghc-internal/src/GHC/Internal/Event/EPoll.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/IntTable.hs
- libraries/ghc-internal/src/GHC/Internal/Event/IntVar.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Internal/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Event/KQueue.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Manager.hs
- libraries/ghc-internal/src/GHC/Internal/Event/PSQ.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Poll.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Thread.hs
- libraries/ghc-internal/src/GHC/Internal/Event/TimeOut.hs
- libraries/ghc-internal/src/GHC/Internal/Event/TimerManager.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Unique.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/Clock.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/ConsoleEvent.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/FFI.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/ManagedThreadPool.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/Thread.hs
- libraries/ghc-internal/src/GHC/Internal/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Backtrace.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Backtrace.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Exception/Context.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Context.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Exception/Type.hs
- libraries/ghc-internal/src/GHC/Internal/Exception/Type.hs-boot
- libraries/ghc-internal/src/GHC/Internal/ExecutionStack.hs
- libraries/ghc-internal/src/GHC/Internal/ExecutionStack/Internal.hsc
- libraries/ghc-internal/src/GHC/Internal/Exts.hs
- libraries/ghc-internal/src/GHC/Internal/Fingerprint.hs
- libraries/ghc-internal/src/GHC/Internal/Fingerprint/Type.hs
- libraries/ghc-internal/src/GHC/Internal/Float.hs
- libraries/ghc-internal/src/GHC/Internal/Float/ConversionUtils.hs
- libraries/ghc-internal/src/GHC/Internal/Float/RealFracMethods.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/ConstPtr.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/Error.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/String.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/String/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/C/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/ForeignPtr/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Alloc.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Array.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Error.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Pool.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Marshal/Utils.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Ptr.hs
- libraries/ghc-internal/src/GHC/Internal/Foreign/Storable.hs
- libraries/ghc-internal/src/GHC/Internal/ForeignPtr.hs
- libraries/ghc-internal/src/GHC/Internal/ForeignSrcLang.hs
- libraries/ghc-internal/src/GHC/Internal/Functor/ZipList.hs
- libraries/ghc-internal/src/GHC/Internal/GHCi.hs
- libraries/ghc-internal/src/GHC/Internal/GHCi/Helpers.hs
- libraries/ghc-internal/src/GHC/Internal/Generics.hs
- libraries/ghc-internal/src/GHC/Internal/Heap/Closures.hs
- libraries/ghc-internal/src/GHC/Internal/Heap/Constants.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTableProf.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/ProfInfo/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO.hs
- libraries/ghc-internal/src/GHC/Internal/IO.hs-boot
- libraries/ghc-internal/src/GHC/Internal/IO/Buffer.hs
- libraries/ghc-internal/src/GHC/Internal/IO/BufferedIO.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Device.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage/API.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/CodePage/Table.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Failure.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Iconv.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Latin1.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF16.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF32.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Encoding/UTF8.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Exception.hs-boot
- libraries/ghc-internal/src/GHC/Internal/IO/FD.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/FD.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Internals.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Common.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Flock.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/LinuxOFD.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/NoOp.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Windows.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Text.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Types.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Types.hs-boot
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Windows.hs
- libraries/ghc-internal/src/GHC/Internal/IO/IOMode.hs
- libraries/ghc-internal/src/GHC/Internal/IO/SubSystem.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Unsafe.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Windows/Encoding.hs
- libraries/ghc-internal/src/GHC/Internal/IO/Windows/Handle.hsc
- libraries/ghc-internal/src/GHC/Internal/IOArray.hs
- libraries/ghc-internal/src/GHC/Internal/IORef.hs
- libraries/ghc-internal/src/GHC/Internal/InfoProv.hs
- libraries/ghc-internal/src/GHC/Internal/InfoProv/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/Int.hs
- libraries/ghc-internal/src/GHC/Internal/IsList.hs
- libraries/ghc-internal/src/GHC/Internal/Ix.hs
- libraries/ghc-internal/src/GHC/Internal/JS/Foreign/Callback.hs
- libraries/ghc-internal/src/GHC/Internal/JS/Prim.hs
- libraries/ghc-internal/src/GHC/Internal/LanguageExtensions.hs
- libraries/ghc-internal/src/GHC/Internal/Lexeme.hs
- libraries/ghc-internal/src/GHC/Internal/List.hs
- libraries/ghc-internal/src/GHC/Internal/MVar.hs
- libraries/ghc-internal/src/GHC/Internal/Magic.hs
- libraries/ghc-internal/src/GHC/Internal/Magic/Dict.hs
- libraries/ghc-internal/src/GHC/Internal/Maybe.hs
- libraries/ghc-internal/src/GHC/Internal/Num.hs
- libraries/ghc-internal/src/GHC/Internal/Num.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Numeric.hs
- libraries/ghc-internal/src/GHC/Internal/OverloadedLabels.hs
- libraries/ghc-internal/src/GHC/Internal/Pack.hs
- libraries/ghc-internal/src/GHC/Internal/Prim/Exception.hs
- libraries/ghc-internal/src/GHC/Internal/Prim/Ext.hs
- libraries/ghc-internal/src/GHC/Internal/Prim/Panic.hs
- libraries/ghc-internal/src/GHC/Internal/Prim/PtrEq.hs
- libraries/ghc-internal/src/GHC/Internal/Profiling.hs
- libraries/ghc-internal/src/GHC/Internal/Ptr.hs
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags.hsc
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
- libraries/ghc-internal/src/GHC/Internal/Read.hs
- libraries/ghc-internal/src/GHC/Internal/Real.hs
- libraries/ghc-internal/src/GHC/Internal/Real.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Records.hs
- libraries/ghc-internal/src/GHC/Internal/ST.hs
- libraries/ghc-internal/src/GHC/Internal/STM.hs
- libraries/ghc-internal/src/GHC/Internal/STRef.hs
- libraries/ghc-internal/src/GHC/Internal/Show.hs
- libraries/ghc-internal/src/GHC/Internal/Stable.hs
- libraries/ghc-internal/src/GHC/Internal/StableName.hs
- libraries/ghc-internal/src/GHC/Internal/Stack.hs
- libraries/ghc-internal/src/GHC/Internal/Stack.hs-boot
- libraries/ghc-internal/src/GHC/Internal/Stack/Annotation.hs
- libraries/ghc-internal/src/GHC/Internal/Stack/CCS.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/CloneStack.hs
- libraries/ghc-internal/src/GHC/Internal/Stack/Constants.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/ConstantsProf.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/Decode.hs
- libraries/ghc-internal/src/GHC/Internal/Stack/Types.hs
- libraries/ghc-internal/src/GHC/Internal/StaticPtr.hs
- libraries/ghc-internal/src/GHC/Internal/StaticPtr/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Stats.hsc
- libraries/ghc-internal/src/GHC/Internal/Storable.hs
- libraries/ghc-internal/src/GHC/Internal/System/Environment.hs
- libraries/ghc-internal/src/GHC/Internal/System/Environment/Blank.hsc
- libraries/ghc-internal/src/GHC/Internal/System/Environment/ExecutablePath.hsc
- libraries/ghc-internal/src/GHC/Internal/System/IO/Error.hs
- libraries/ghc-internal/src/GHC/Internal/System/Mem.hs
- libraries/ghc-internal/src/GHC/Internal/System/Posix/Internals.hs
- libraries/ghc-internal/src/GHC/Internal/System/Posix/Types.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Lib.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Lift.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Syntax.hs
- libraries/ghc-internal/src/GHC/Internal/Text/ParserCombinators/ReadP.hs
- libraries/ghc-internal/src/GHC/Internal/Text/ParserCombinators/ReadPrec.hs
- libraries/ghc-internal/src/GHC/Internal/Text/Read/Lex.hs
- libraries/ghc-internal/src/GHC/Internal/TopHandler.hs
- libraries/ghc-internal/src/GHC/Internal/Tuple.hs
- libraries/ghc-internal/src/GHC/Internal/Type/Reflection.hs
- libraries/ghc-internal/src/GHC/Internal/Type/Reflection/Unsafe.hs
- libraries/ghc-internal/src/GHC/Internal/TypeError.hs
- libraries/ghc-internal/src/GHC/Internal/TypeLits.hs
- libraries/ghc-internal/src/GHC/Internal/TypeLits/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/TypeNats.hs
- libraries/ghc-internal/src/GHC/Internal/TypeNats/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Bits.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/DerivedCoreProperties.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/GeneralCategory.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleLowerCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleTitleCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Char/UnicodeData/SimpleUpperCaseMapping.hs
- libraries/ghc-internal/src/GHC/Internal/Unicode/Version.hs
- libraries/ghc-internal/src/GHC/Internal/Unsafe/Coerce.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Conc.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Conc/Internal.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Exports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Imports.hs
- libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
- libraries/ghc-internal/src/GHC/Internal/Weak.hs
- libraries/ghc-internal/src/GHC/Internal/Weak/Finalize.hs
- libraries/ghc-internal/src/GHC/Internal/Windows.hs
- libraries/ghc-internal/src/GHC/Internal/Word.hs
- libraries/ghc-internal/tools/ucd2haskell/exe/UCD2Haskell/ModuleGenerators.hs
- libraries/ghc-prim/Dummy.hs
- libraries/ghc-prim/ghc-prim.cabal
- libraries/template-haskell/Language/Haskell/TH/Lib.hs
- linters/lint-codes/LintCodes/Static.hs
- rts/LdvProfile.c
- rts/PrimOps.cmm
- rts/Printer.c
- rts/ProfHeap.c
- rts/include/rts/RtsToHsIface.h
- rts/include/rts/storage/ClosureMacros.h
- rts/js/thread.js
- rts/sm/Sanity.c
- rts/sm/Storage.c
- testsuite/driver/perf_notes.py
- testsuite/driver/testlib.py
- testsuite/driver/testutil.py
- testsuite/tests/ado/T13242a.stderr
- testsuite/tests/annotations/should_fail/annfail10.stderr
- testsuite/tests/backpack/cabal/bkpcabal07/Makefile
- testsuite/tests/backpack/should_compile/T20396.stderr
- testsuite/tests/backpack/should_fail/bkpfail17.stderr
- testsuite/tests/bytecode/TLinkable/all.T
- testsuite/tests/cabal/T12485/Makefile
- + testsuite/tests/cabal/T27013a/Makefile
- + testsuite/tests/cabal/T27013a/Setup.hs
- + testsuite/tests/cabal/T27013a/all.T
- + testsuite/tests/cabal/T27013a/composition.cabal
- + testsuite/tests/cabal/T27013a/src/Data/Composition.hs
- + testsuite/tests/cabal/T27013d/Composition.hs
- + testsuite/tests/cabal/T27013d/Makefile
- + testsuite/tests/cabal/T27013d/T27013d.stdout
- + testsuite/tests/cabal/T27013d/all.T
- testsuite/tests/callarity/unittest/CallArity1.hs
- + testsuite/tests/concurrent/should_run/T16761.hs
- + testsuite/tests/concurrent/should_run/T16761.stdout
- testsuite/tests/concurrent/should_run/all.T
- testsuite/tests/corelint/LintEtaExpand.hs
- testsuite/tests/corelint/T21115b.stderr
- testsuite/tests/corelint/T27374.hs
- testsuite/tests/count-deps/CountDepsParser.stdout
- testsuite/tests/deSugar/should_compile/T13208.stdout
- testsuite/tests/deSugar/should_compile/T16615.stderr
- testsuite/tests/deSugar/should_compile/T2431.stderr
- testsuite/tests/default/DefaultImportFail01.stderr
- testsuite/tests/default/DefaultImportFail02.stderr
- testsuite/tests/default/DefaultImportFail03.stderr
- testsuite/tests/default/DefaultImportFail04.stderr
- testsuite/tests/default/DefaultImportFail05.stderr
- testsuite/tests/default/DefaultImportFail07.stderr
- testsuite/tests/default/T25775.stderr
- testsuite/tests/deriving/should_compile/T14682.stderr
- testsuite/tests/deriving/should_compile/T20496.stderr
- testsuite/tests/diagnostic-codes/codes.stdout
- testsuite/tests/dmdanal/should_compile/T23398.stderr
- + testsuite/tests/driver/T27013b/Makefile
- + testsuite/tests/driver/T27013b/T27013b.stdout
- + testsuite/tests/driver/T27013b/X.hs
- + testsuite/tests/driver/T27013b/all.T
- + testsuite/tests/driver/T27013c/Makefile
- + testsuite/tests/driver/T27013c/T27013c.stdout
- + testsuite/tests/driver/T27013c/X.hs
- + testsuite/tests/driver/T27013c/all.T
- + testsuite/tests/driver/T27013e/T27013e.hs
- + testsuite/tests/driver/T27013e/T27013e.stderr
- + testsuite/tests/driver/T27013e/all.T
- + testsuite/tests/driver/T27013f/T27013f.hs
- + testsuite/tests/driver/T27013f/T27013f.stderr
- + testsuite/tests/driver/T27013f/all.T
- + testsuite/tests/driver/T27013g/T27013g.hs
- + testsuite/tests/driver/T27013g/all.T
- + testsuite/tests/driver/T27013h/GHC/Essentials.hs
- + testsuite/tests/driver/T27013h/T27013h.stderr
- + testsuite/tests/driver/T27013h/all.T
- + testsuite/tests/driver/T27013h/unitT27013h
- + testsuite/tests/driver/T27013i/T27013i.hs
- + testsuite/tests/driver/T27013i/T27013i.stderr
- + testsuite/tests/driver/T27013i/all.T
- testsuite/tests/driver/T3007/A/Internal.hs
- testsuite/tests/driver/T3007/Makefile
- testsuite/tests/driver/make-prim/Makefile
- testsuite/tests/driver/multipleHomeUnits/Makefile
- testsuite/tests/driver/multipleHomeUnits/all.T
- + testsuite/tests/driver/multipleHomeUnits/essentials-home/GHC/Essentials.hs
- + testsuite/tests/driver/multipleHomeUnits/essentials-order-base/B.hs
- + testsuite/tests/driver/multipleHomeUnits/essentials-order-user/U.hs
- + testsuite/tests/driver/multipleHomeUnits/essentials-user/M.hs
- testsuite/tests/driver/multipleHomeUnits/multipleHomeUnitsModuleVisibility.stderr
- + testsuite/tests/driver/multipleHomeUnits/multipleHomeUnits_essentials.stdout
- + testsuite/tests/driver/multipleHomeUnits/multipleHomeUnits_essentials_order.stderr
- + testsuite/tests/driver/multipleHomeUnits/multipleHomeUnits_essentials_recomp.stdout
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsHome
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsHomeHidden
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsOrderBase
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsOrderUser
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsUser
- + testsuite/tests/driver/multipleHomeUnits/unitEssentialsUserHidden
- testsuite/tests/driver/recomp24656/Makefile
- testsuite/tests/driver/recomp24656/recomp24656.stdout
- testsuite/tests/ffi/should_fail/all.T
- + testsuite/tests/ffi/should_fail/ccfail006.hs
- + testsuite/tests/ffi/should_fail/ccfail006.stderr
- + testsuite/tests/ffi/should_fail/ccfail007.hs
- + testsuite/tests/ffi/should_fail/ccfail007.stderr
- + testsuite/tests/ffi/should_fail/ccfail008.hs
- + testsuite/tests/ffi/should_fail/ccfail008.stderr
- + testsuite/tests/ffi/should_fail/ccfail009.hs
- + testsuite/tests/ffi/should_fail/ccfail009.stderr
- + testsuite/tests/ghc-api/EssentialsCoverage.hs
- testsuite/tests/ghc-api/T25121_status.stdout
- testsuite/tests/ghc-api/T8628.hs
- testsuite/tests/ghc-api/all.T
- testsuite/tests/ghc-api/downsweep/PartialDownsweep.hs
- testsuite/tests/ghc-api/exactprint/T22919.stderr
- testsuite/tests/ghc-api/exactprint/Test20239.stderr
- testsuite/tests/ghc-api/exactprint/ZeroWidthSemi.stderr
- testsuite/tests/ghci.debugger/scripts/break006.stderr
- testsuite/tests/ghci.debugger/scripts/print019.stderr
- testsuite/tests/ghci/scripts/ListTuplePunsPpr.stdout
- testsuite/tests/ghci/scripts/T4175.stdout
- testsuite/tests/ghci/scripts/all.T
- testsuite/tests/ghci/scripts/ghci064.stdout
- testsuite/tests/haddock/should_compile_flag_haddock/T17544.stderr
- testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
- testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
- testsuite/tests/hiefile/should_run/T23120.stdout
- testsuite/tests/iface/IfaceSharingIfaceType.hs
- testsuite/tests/iface/IfaceSharingName.hs
- testsuite/tests/indexed-types/should_fail/T12522a.stderr
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout-mingw32
- testsuite/tests/interface-stability/ghc-prim-exports.stdout
- testsuite/tests/interface-stability/ghc-prim-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- testsuite/tests/javascript/Makefile
- testsuite/tests/javascript/T24495.hs
- testsuite/tests/module/mod185.stderr
- testsuite/tests/numeric/should_compile/T14170.stdout
- testsuite/tests/numeric/should_compile/T14465.stdout
- testsuite/tests/numeric/should_compile/T23907.stderr
- testsuite/tests/numeric/should_compile/T7116.stdout
- testsuite/tests/overloadedlists/should_fail/overloadedlistsfail01.stderr
- testsuite/tests/package/all.T
- testsuite/tests/parser/should_compile/DumpParsedAst.stderr
- testsuite/tests/parser/should_compile/DumpParsedAstComments.stderr
- testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
- testsuite/tests/parser/should_compile/DumpSemis.stderr
- testsuite/tests/parser/should_compile/DumpTypecheckedAst.stderr
- testsuite/tests/parser/should_compile/KindSigs.stderr
- testsuite/tests/parser/should_compile/T14189.stderr
- testsuite/tests/parser/should_compile/T15279.stderr
- testsuite/tests/parser/should_compile/T15323.stderr
- testsuite/tests/parser/should_compile/T20452.stderr
- testsuite/tests/parser/should_compile/T20718.stderr
- testsuite/tests/parser/should_compile/T20718b.stderr
- testsuite/tests/parser/should_compile/T20846.stderr
- testsuite/tests/parser/should_compile/T23315/T23315.stderr
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail10.stderr
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail11.stderr
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail13.stderr
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail8.stderr
- testsuite/tests/parser/should_fail/T16270h.hs
- testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr
- testsuite/tests/patsyn/should_fail/T26465.stderr
- testsuite/tests/perf/compiler/all.T
- testsuite/tests/perf/compiler/hard_hole_fits.stderr
- testsuite/tests/perf/should_run/ByteCodeAsm.hs
- testsuite/tests/plugins/defaulting-plugin/DefaultInterference.hs
- testsuite/tests/plugins/defaulting-plugin/DefaultInvalid.hs
- testsuite/tests/plugins/defaulting-plugin/DefaultMultiParam.hs
- testsuite/tests/plugins/plugins09.stdout
- testsuite/tests/plugins/plugins10.stdout
- testsuite/tests/plugins/plugins11.stdout
- testsuite/tests/plugins/simple-plugin/Simple/ReplacePlugin.hs
- testsuite/tests/plugins/static-plugins.stdout
- testsuite/tests/printer/AnnotationNoListTuplePuns.stdout
- + testsuite/tests/printer/Haddock1.hs
- testsuite/tests/printer/Makefile
- testsuite/tests/printer/T18791.stderr
- testsuite/tests/printer/Test20297.hs
- − testsuite/tests/printer/Test20297.stdout
- testsuite/tests/printer/Test24533.stdout
- testsuite/tests/printer/all.T
- testsuite/tests/profiling/should_run/callstack001.stdout
- testsuite/tests/profiling/should_run/callstack002.stderr
- testsuite/tests/profiling/should_run/callstack002.stdout
- testsuite/tests/rename/should_compile/T3103/Foreign/Ptr.hs
- testsuite/tests/rename/should_compile/T3103/GHC/Base.lhs
- testsuite/tests/rename/should_compile/T3103/GHC/Word.hs
- testsuite/tests/rename/should_compile/T3103/test.T
- testsuite/tests/rep-poly/RepPolyRecordPattern.hs
- testsuite/tests/rep-poly/RepPolyRecordPattern.stderr
- testsuite/tests/rep-poly/RepPolyRecordUpdate.stderr
- testsuite/tests/rep-poly/T20113.stderr
- − testsuite/tests/rep-poly/T20363.stderr
- − testsuite/tests/rep-poly/T20363_show_co.hs
- − testsuite/tests/rep-poly/T20363_show_co.stderr
- − testsuite/tests/rep-poly/T20363b.stderr
- + testsuite/tests/rep-poly/T20363c.hs
- testsuite/tests/rep-poly/all.T
- testsuite/tests/roles/should_compile/Roles1.stderr
- testsuite/tests/roles/should_compile/Roles13.stderr
- testsuite/tests/roles/should_compile/Roles14.stderr
- testsuite/tests/roles/should_compile/Roles2.stderr
- testsuite/tests/roles/should_compile/Roles3.stderr
- testsuite/tests/roles/should_compile/Roles4.stderr
- testsuite/tests/roles/should_compile/T8958.stderr
- + testsuite/tests/rts/T27585.hs
- + testsuite/tests/rts/T27585.stdout
- testsuite/tests/rts/all.T
- testsuite/tests/simplCore/should_compile/OpaqueNoCastWW.stderr
- testsuite/tests/simplCore/should_compile/T13543.stderr
- testsuite/tests/simplCore/should_compile/T16038/T16038.stdout
- testsuite/tests/simplCore/should_compile/T24229a.stderr
- testsuite/tests/simplCore/should_compile/T24229b.stderr
- testsuite/tests/simplCore/should_compile/T3717.stderr
- testsuite/tests/simplCore/should_compile/T3772.stdout
- testsuite/tests/simplCore/should_compile/T4081.stderr
- testsuite/tests/simplCore/should_compile/T4908.stderr
- testsuite/tests/simplCore/should_compile/T4930.stderr
- testsuite/tests/simplCore/should_compile/T7360.stderr
- testsuite/tests/simplCore/should_compile/T8274.stdout
- testsuite/tests/simplCore/should_compile/T9400.stderr
- testsuite/tests/simplCore/should_compile/noinline01.stderr
- testsuite/tests/simplCore/should_compile/par01.stderr
- testsuite/tests/simplCore/should_compile/rule2.stderr
- testsuite/tests/simplCore/should_compile/str-rules.hs
- testsuite/tests/tcplugins/ArgsPlugin.hs
- testsuite/tests/tcplugins/EmitWantedPlugin.hs
- testsuite/tests/tcplugins/RewritePlugin.hs
- testsuite/tests/tcplugins/T26395_Plugin.hs
- testsuite/tests/tcplugins/TyFamPlugin.hs
- + testsuite/tests/th/AssocDefaultNotAssoc.hs
- + testsuite/tests/th/AssocDefaultNotAssoc.stderr
- testsuite/tests/th/T14741.hs
- testsuite/tests/th/T21547.stderr
- testsuite/tests/th/T26568.stderr
- + testsuite/tests/th/T27013th.hs
- + testsuite/tests/th/TH_InvalidTopDecl.hs
- + testsuite/tests/th/TH_InvalidTopDecl.stderr
- testsuite/tests/th/TH_Roles2.stderr
- + testsuite/tests/th/TH_cvt_DefaultDataInstDecl.hs
- + testsuite/tests/th/TH_cvt_DefaultDataInstDecl.stderr
- + testsuite/tests/th/TH_cvt_GadtNoCons.hs
- + testsuite/tests/th/TH_cvt_GadtNoCons.stderr
- + testsuite/tests/th/TH_cvt_IllegalDeclaration.hs
- + testsuite/tests/th/TH_cvt_IllegalDeclaration.stderr
- + testsuite/tests/th/TH_cvt_IllegalSumAlt.hs
- + testsuite/tests/th/TH_cvt_IllegalSumAlt.stderr
- + testsuite/tests/th/TH_cvt_InvalidCCallImpent.hs
- + testsuite/tests/th/TH_cvt_InvalidCCallImpent.stderr
- + testsuite/tests/th/TH_cvt_InvalidTyFamInstLHS.hs
- + testsuite/tests/th/TH_cvt_InvalidTyFamInstLHS.stderr
- + testsuite/tests/th/TH_cvt_InvalidTypeInstanceHeader.hs
- + testsuite/tests/th/TH_cvt_InvalidTypeInstanceHeader.stderr
- + testsuite/tests/th/TH_cvt_RecGadtNoCons.hs
- + testsuite/tests/th/TH_cvt_RecGadtNoCons.stderr
- + testsuite/tests/th/TH_cvt_SumAltArityExceeded.hs
- + testsuite/tests/th/TH_cvt_SumAltArityExceeded.stderr
- + testsuite/tests/th/TH_pragmaSpecOld.hs
- + testsuite/tests/th/TH_pragmaSpecOld.stderr
- testsuite/tests/th/all.T
- testsuite/tests/typecheck/should_compile/T13032.stderr
- testsuite/tests/typecheck/should_compile/T14273.stderr
- testsuite/tests/typecheck/should_compile/T18406b.stderr
- testsuite/tests/typecheck/should_compile/T18529.stderr
- testsuite/tests/typecheck/should_compile/holes.stderr
- testsuite/tests/typecheck/should_compile/holes2.stderr
- testsuite/tests/typecheck/should_compile/holes3.stderr
- testsuite/tests/typecheck/should_compile/subsumption_sort_hole_fits.stderr
- testsuite/tests/typecheck/should_compile/valid_hole_fits.stderr
- testsuite/tests/typecheck/should_fail/T12921.stderr
- testsuite/tests/typecheck/should_fail/T14884.stderr
- testsuite/tests/typecheck/should_fail/T15883b.stderr
- testsuite/tests/typecheck/should_fail/T15883c.stderr
- testsuite/tests/typecheck/should_fail/T15883d.stderr
- testsuite/tests/typecheck/should_fail/T21130.stderr
- testsuite/tests/typecheck/should_fail/T3323.stderr
- testsuite/tests/typecheck/should_fail/T5095.stderr
- testsuite/tests/typecheck/should_fail/T7279.stderr
- testsuite/tests/typecheck/should_fail/TcStaticPointersFail02.stderr
- testsuite/tests/typecheck/should_fail/TyAppPat_PatternBindingExistential.stderr
- testsuite/tests/typecheck/should_fail/tcfail072.stderr
- testsuite/tests/typecheck/should_fail/tcfail097.stderr
- testsuite/tests/typecheck/should_fail/tcfail133.stderr
- testsuite/tests/typecheck/should_run/T22510.stdout
- testsuite/tests/unboxedsums/UbxSumLevPoly.hs
- testsuite/tests/unboxedsums/unboxedsums_unit_tests.hs
- + testsuite/tests/vdq-rta/should_fail/T27586a.hs
- + testsuite/tests/vdq-rta/should_fail/T27586a.stderr
- + testsuite/tests/vdq-rta/should_fail/T27586b.hs
- + testsuite/tests/vdq-rta/should_fail/T27586b.stderr
- + testsuite/tests/vdq-rta/should_fail/T27586c.hs
- + testsuite/tests/vdq-rta/should_fail/T27586c.stderr
- testsuite/tests/vdq-rta/should_fail/all.T
- testsuite/tests/warnings/should_compile/DerivingTypeable.stderr
- utils/check-exact/ExactPrint.hs
- utils/check-exact/Main.hs
- utils/check-exact/Parsers.hs
- utils/check-exact/Transform.hs
- utils/check-exact/Utils.hs
- utils/genprimopcode/Main.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Hoogle.hs
- utils/haddock/haddock-api/src/Haddock/Backends/LaTeX.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
- utils/haddock/haddock-api/src/Haddock/Convert.hs
- utils/haddock/haddock-api/src/Haddock/GhcUtils.hs
- utils/haddock/haddock-api/src/Haddock/Interface.hs
- utils/haddock/haddock-api/src/Haddock/Interface/AttachInstances.hs
- utils/haddock/haddock-api/src/Haddock/Interface/Create.hs
- utils/haddock/haddock-api/src/Haddock/Interface/Rename.hs
- utils/haddock/haddock-api/src/Haddock/Types.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/f74a5e88ea133af9f1210d448cc67d…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/f74a5e88ea133af9f1210d448cc67d…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
Apoorv Ingle pushed to branch wip/ani/T27156 at Glasgow Haskell Compiler / GHC
Commits:
e65ad951 by Apoorv Ingle at 2026-08-16T12:21:54-05:00
revert th test
- - - - -
4 changed files:
- compiler/GHC/Rename/Expr.hs
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail8.stderr
- testsuite/tests/th/T18102b.hs
- testsuite/tests/th/T18102b_aux.hs
Changes:
=====================================
compiler/GHC/Rename/Expr.hs
=====================================
@@ -46,7 +46,6 @@ import GHC.Driver.DynFlags
import GHC.Builtin.KnownKeys
import GHC.Builtin.KnownOccs
import GHC.Builtin.WiredIn.Types ( nilDataConName, oneDataConName )
-import GHC.Builtin.WiredIn.Ids( rightSectionName, leftSectionName )
import GHC.Unit.Module ( isInteractiveModule )
@@ -74,7 +73,7 @@ import qualified GHC.LanguageExtensions as LangExt
import Control.Monad
import qualified Data.Foldable as Partial (maximum)
import Data.List (unzip4)
-import Data.List.NonEmpty ( NonEmpty(..), head, init, last, nonEmpty, scanl, tail )
+import Data.List.NonEmpty ( NonEmpty(..), head, nonEmpty, scanl, tail )
import Data.Ord
import Data.Array
import GHC.Driver.Env (HscEnv)
=====================================
testsuite/tests/parser/should_fail/RecordDotSyntaxFail8.stderr
=====================================
@@ -1,41 +1,42 @@
RecordDotSyntaxFail8.hs:47:17: error: [GHC-39999]
• No instance for ‘HasField "quux1" Quux Quux’
- arising from selecting the field ‘quux1’
- NB: ‘HasField’ is not the built-in ‘GHC.Internal.Records.HasField’ class.
+ arising from selecting the field ‘quux1’
+ NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘a.foo.bar.baz.quux1’
In a stmt of a 'do' block: print @Quux $ a.foo.bar.baz.quux1
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
RecordDotSyntaxFail8.hs:50:17: error: [GHC-39999]
• No instance for ‘HasField "quux2" Quux Quux’
- arising from selecting the field ‘quux2’
+ arising from selecting the field ‘quux2’
NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘b.quux2’
In a stmt of a 'do' block: print @Quux $ b.quux2
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
RecordDotSyntaxFail8.hs:53:17: error: [GHC-39999]
• No instance for ‘HasField "quux3" Quux r0’
- arising from selecting the field ‘quux3’
- NB: ‘HasField’ is not the built-in ‘GHC.Internal.Records.HasField’ class.
+ arising from selecting the field ‘quux3’
+ NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘a.foo.bar.baz.quux3.wob’
In a stmt of a 'do' block: print @Bool $ a.foo.bar.baz.quux3.wob
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
+
=====================================
testsuite/tests/th/T18102b.hs
=====================================
@@ -1,47 +1,9 @@
-{-# LANGUAGE TemplateHaskell, RebindableSyntax #-}
+{-# LANGUAGE TemplateHaskell #-}
-import Prelude
import T18102b_aux
-x1 :: Int
-x1 = $$(intQuote_TTH)
-
-z1 :: Int
-z1 = $(intQuote_TH)
-
-x2 :: Char
-x2 = $$(charQuote_TTH)
-
-z2 :: Char
-z2 = $(charQuote_TH)
-
-x3 :: [Int]
-x3 = $$(seqQuote_TTH)
-
-z3 :: [Int]
-z3 = $(seqQuote_TH)
-
-x4 :: [Int]
-x4 = $$(listQuote_TTH)
-
-z4 :: [Int]
-z4 = $(listQuote_TH)
-
+x :: Int
+x = $$(intQuote)
main :: IO ()
-main = do
- print t1
- print x1
- print z1
-
- print t2
- print x2
- print z2
-
- print t3
- print x3
- print z3
-
- print t4
- print x4
- print z4
+main = print x
=====================================
testsuite/tests/th/T18102b_aux.hs
=====================================
@@ -1,60 +1,11 @@
-{-# LANGUAGE RebindableSyntax, TemplateHaskell, OverloadedLists #-}
+{-# LANGUAGE RebindableSyntax, TemplateHaskell #-}
module T18102b_aux where
-import Prelude hiding ((>>=), return )
+import Prelude
import Language.Haskell.TH.Syntax
-
-
ifThenElse :: Bool -> Int -> Int -> Int
ifThenElse _ a b = a+b
-intQuote_TTH :: Code Q Int
-intQuote_TTH = [|| if True then 10 else 15 ||]
-
-intQuote_TH :: Quote m => m Exp
-intQuote_TH = [| if True then 10 else 15 |]
-
-t1 :: Int
-t1 = if True then 10 else 15
-
-
-(>>=) :: a -> ((forall b . b) -> c) -> c
-a >>= f = f undefined
-return _ = 'b'
-fail s = undefined
-
-t2 :: Char
-t2 = do { return 'k' }
-
-charQuote_TTH :: Code Q Char
-charQuote_TTH = [|| do { return 'k' } ||]
-
-charQuote_TH :: Quote m => m Exp
-charQuote_TH = [| do { return 'k' } |]
-
-fromListN :: Int -> [Int] -> [Int]
-fromListN _ l = replicate (length l) (length l)
-
-fromList :: [Int] -> [Int]
-fromList x = replicate (length x) (length x)
-
-
-t3 :: [Int]
-t3 = [2..7]
-
-seqQuote_TTH :: Code Q [Int]
-seqQuote_TTH = [|| [2..7] ||]
-
-seqQuote_TH :: Quote m => m Exp
-seqQuote_TH = [| [2..7] |]
-
-
-t4 :: [Int]
-t4 = [1,2,3]
-
-listQuote_TTH :: Code Q [Int]
-listQuote_TTH = [|| [1,2,3] ||]
-
-listQuote_TH :: Quote m => m Exp
-listQuote_TH = [| [1,2,3] |]
+intQuote :: Code Q Int
+intQuote = [|| if True then 10 else 15 ||]
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/e65ad951348d5e11786b3d6de329396…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/e65ad951348d5e11786b3d6de329396…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0
Apoorv Ingle pushed to branch wip/ani/T27156 at Glasgow Haskell Compiler / GHC
Commits:
f0448b76 by Apoorv Ingle at 2026-08-16T12:19:58-05:00
revert th test
- - - - -
4 changed files:
- compiler/GHC/Rename/Expr.hs
- testsuite/tests/parser/should_fail/RecordDotSyntaxFail8.stderr
- testsuite/tests/th/T18102b.hs
- testsuite/tests/th/T18102b_aux.hs
Changes:
=====================================
compiler/GHC/Rename/Expr.hs
=====================================
@@ -46,7 +46,6 @@ import GHC.Driver.DynFlags
import GHC.Builtin.KnownKeys
import GHC.Builtin.KnownOccs
import GHC.Builtin.WiredIn.Types ( nilDataConName, oneDataConName )
-import GHC.Builtin.WiredIn.Ids( rightSectionName, leftSectionName )
import GHC.Unit.Module ( isInteractiveModule )
=====================================
testsuite/tests/parser/should_fail/RecordDotSyntaxFail8.stderr
=====================================
@@ -1,41 +1,42 @@
RecordDotSyntaxFail8.hs:47:17: error: [GHC-39999]
• No instance for ‘HasField "quux1" Quux Quux’
- arising from selecting the field ‘quux1’
- NB: ‘HasField’ is not the built-in ‘GHC.Internal.Records.HasField’ class.
+ arising from selecting the field ‘quux1’
+ NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘a.foo.bar.baz.quux1’
In a stmt of a 'do' block: print @Quux $ a.foo.bar.baz.quux1
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
RecordDotSyntaxFail8.hs:50:17: error: [GHC-39999]
• No instance for ‘HasField "quux2" Quux Quux’
- arising from selecting the field ‘quux2’
+ arising from selecting the field ‘quux2’
NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘b.quux2’
In a stmt of a 'do' block: print @Quux $ b.quux2
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
RecordDotSyntaxFail8.hs:53:17: error: [GHC-39999]
• No instance for ‘HasField "quux3" Quux r0’
- arising from selecting the field ‘quux3’
- NB: ‘HasField’ is not the built-in ‘GHC.Internal.Records.HasField’ class.
+ arising from selecting the field ‘quux3’
+ NB: ‘HasField’ is not the built-in ‘HasField’ class.
• In the second argument of ‘($)’, namely ‘a.foo.bar.baz.quux3.wob’
In a stmt of a 'do' block: print @Bool $ a.foo.bar.baz.quux3.wob
In the expression:
- do let a = Foo {foo = ...}
- print @Quux $ ....bar.baz.quux1
- let b = myQuux
- print @Quux $ b.quux2
- let c = Foo {foo = ...}
- ...
+ do let a = Foo {foo = ...}
+ print @Quux $ ....bar.baz.quux1
+ let b = myQuux
+ print @Quux $ b.quux2
+ let c = Foo {foo = ...}
+ ...
+
=====================================
testsuite/tests/th/T18102b.hs
=====================================
@@ -1,47 +1,9 @@
-{-# LANGUAGE TemplateHaskell, RebindableSyntax #-}
+{-# LANGUAGE TemplateHaskell #-}
-import Prelude
import T18102b_aux
-x1 :: Int
-x1 = $$(intQuote_TTH)
-
-z1 :: Int
-z1 = $(intQuote_TH)
-
-x2 :: Char
-x2 = $$(charQuote_TTH)
-
-z2 :: Char
-z2 = $(charQuote_TH)
-
-x3 :: [Int]
-x3 = $$(seqQuote_TTH)
-
-z3 :: [Int]
-z3 = $(seqQuote_TH)
-
-x4 :: [Int]
-x4 = $$(listQuote_TTH)
-
-z4 :: [Int]
-z4 = $(listQuote_TH)
-
+x :: Int
+x = $$(intQuote)
main :: IO ()
-main = do
- print t1
- print x1
- print z1
-
- print t2
- print x2
- print z2
-
- print t3
- print x3
- print z3
-
- print t4
- print x4
- print z4
+main = print x
=====================================
testsuite/tests/th/T18102b_aux.hs
=====================================
@@ -1,60 +1,11 @@
-{-# LANGUAGE RebindableSyntax, TemplateHaskell, OverloadedLists #-}
+{-# LANGUAGE RebindableSyntax, TemplateHaskell #-}
module T18102b_aux where
-import Prelude hiding ((>>=), return )
+import Prelude
import Language.Haskell.TH.Syntax
-
-
ifThenElse :: Bool -> Int -> Int -> Int
ifThenElse _ a b = a+b
-intQuote_TTH :: Code Q Int
-intQuote_TTH = [|| if True then 10 else 15 ||]
-
-intQuote_TH :: Quote m => m Exp
-intQuote_TH = [| if True then 10 else 15 |]
-
-t1 :: Int
-t1 = if True then 10 else 15
-
-
-(>>=) :: a -> ((forall b . b) -> c) -> c
-a >>= f = f undefined
-return _ = 'b'
-fail s = undefined
-
-t2 :: Char
-t2 = do { return 'k' }
-
-charQuote_TTH :: Code Q Char
-charQuote_TTH = [|| do { return 'k' } ||]
-
-charQuote_TH :: Quote m => m Exp
-charQuote_TH = [| do { return 'k' } |]
-
-fromListN :: Int -> [Int] -> [Int]
-fromListN _ l = replicate (length l) (length l)
-
-fromList :: [Int] -> [Int]
-fromList x = replicate (length x) (length x)
-
-
-t3 :: [Int]
-t3 = [2..7]
-
-seqQuote_TTH :: Code Q [Int]
-seqQuote_TTH = [|| [2..7] ||]
-
-seqQuote_TH :: Quote m => m Exp
-seqQuote_TH = [| [2..7] |]
-
-
-t4 :: [Int]
-t4 = [1,2,3]
-
-listQuote_TTH :: Code Q [Int]
-listQuote_TTH = [|| [1,2,3] ||]
-
-listQuote_TH :: Quote m => m Exp
-listQuote_TH = [| [1,2,3] |]
+intQuote :: Code Q Int
+intQuote = [|| if True then 10 else 15 ||]
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f0448b763abcffc52f2af97477a74c7…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f0448b763abcffc52f2af97477a74c7…
You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
1
0