Alan Zimmerman pushed to branch wip/az/epa-tidy-locatedxxx-22 at Glasgow Haskell Compiler / GHC

Commits:

22 changed files:

Changes:

  • changelog.d/T27744
    1
    +section: compiler
    
    2
    +synopsis: Fixes a bug in arity computation for INLINE pattern synonyms, which led to a compiler crash
    
    3
    +issues: #27744
    
    4
    +mrs: !16602

  • changelog.d/llvm-23
    1
    +section: llvm-backend
    
    2
    +synopsis: Bump LlvmMaxVersion to support LLVM 23.x releases.
    
    3
    +issues: #27764
    
    4
    +mrs: !16617

  • compiler/GHC/Hs/Doc.hs
    ... ... @@ -58,6 +58,7 @@ import Language.Haskell.Syntax.Doc
    58 58
     import Language.Haskell.Syntax.Extension
    
    59 59
     import Language.Haskell.Syntax.Module.Name
    
    60 60
     
    
    61
    +-- Exact print annotations ignore LHsDoc, so bare SrcSpan is fine
    
    61 62
     type instance Anno (WithHsDocIdentifiers (HsDocString (GhcPass pass)) (GhcPass pass)) = SrcSpan
    
    62 63
     
    
    63 64
     deriving instance (Data pass, Data (LIdP pass), Data a) => Data (WithHsDocIdentifiers a pass)
    

  • compiler/GHC/Hs/Extension/Pass.hs
    ... ... @@ -46,6 +46,7 @@ type instance XRec (GhcPass p) a = XRecGhc a
    46 46
     -- but pass-independent, source location
    
    47 47
     type XRecGhc a = GenLocated (Anno a) a
    
    48 48
     
    
    49
    +-- Exact print annotations ignore LHsDoc, so bare SrcSpan is fine
    
    49 50
     type instance Anno (HsDocString (GhcPass _))  = SrcSpan
    
    50 51
     type instance Anno HsDocStringChunk           = SrcSpan
    
    51 52
     
    

  • compiler/GHC/Tc/TyCl/PatSyn.hs
    ... ... @@ -875,8 +875,9 @@ tcPatSynMatcher (L loc ps_name) lpat prag_fn
    875 875
                  mg = MG{ mg_alts = L (l2l $ getLoc match) [match]
    
    876 876
                         , mg_ext = MatchGroupTc [] res_ty gen
    
    877 877
                         }
    
    878
    -             matcher_arity = length req_theta + 3
    
    879
    -             -- See Note [Pragmas for pattern synonyms]
    
    878
    +
    
    879
    +             matcher_arity :: VisArity -- VisArity excludes dictionary arguments!
    
    880
    +             matcher_arity = 3         -- See Note [Pragmas for pattern synonyms]
    
    880 881
     
    
    881 882
            -- Add INLINE pragmas; see Note [Pragmas for pattern synonyms]
    
    882 883
            -- NB: prag_fn is keyed by the PatSyn Name, not the (internal) matcher name
    
    ... ... @@ -967,9 +968,8 @@ tcPatSynBuilderBind prag_fn (PSB { psb_id = ps_lname@(L loc ps_name)
    967 968
              let builder_id = mkExportedVanillaId builder_name builder_ty
    
    968 969
                              -- See Note [Exported LocalIds] in GHC.Types.Id
    
    969 970
     
    
    970
    -             (_, req_theta, _, prov_theta, arg_tys, _) = patSynSigBndr patsyn
    
    971
    -             builder_arity = length req_theta + length prov_theta
    
    972
    -                             + length arg_tys
    
    971
    +             builder_arity :: VisArity   -- VisArity excludes dictionary arguments!
    
    972
    +             builder_arity = length (patSynArgs patsyn)
    
    973 973
                                  + (if need_dummy_arg then 1 else 0)
    
    974 974
     
    
    975 975
            -- Add INLINE pragmas; see Note [Pragmas for pattern synonyms]
    
    ... ... @@ -1348,13 +1348,20 @@ entire pattern synonym is supported. For example:
    1348 1348
     When no pragma is provided for a pattern, the inlining decision might change
    
    1349 1349
     between different versions of GHC.
    
    1350 1350
     
    
    1351
    -Implementation notes.  The prag_fn passed in to tcPatSynDecl will have a binding
    
    1352
    -for the /pattern synonym/ Name, thus
    
    1353
    -      InlinedPattern :-> INLINE
    
    1354
    -From this we cook up an INLINE pragma for the matcher (in tcPatSynMatcher)
    
    1355
    -and builder (in tcPatSynBuilderBind), by looking up the /pattern synonym/
    
    1356
    -Name in the prag_fn, and then using addInlinePragArity to add the right
    
    1357
    -inl_sat field to that INLINE pragma for the matcher or builder respectively.
    
    1351
    +Implementation notes.
    
    1352
    +
    
    1353
    +* The prag_fn passed in to tcPatSynDecl will have a binding
    
    1354
    +  for the /pattern synonym/ Name, thus
    
    1355
    +        InlinedPattern :-> INLINE
    
    1356
    +  From this we cook up an INLINE pragma for the matcher (in tcPatSynMatcher)
    
    1357
    +  and builder (in tcPatSynBuilderBind), by looking up the /pattern synonym/
    
    1358
    +  Name in the prag_fn, and then using `addInlinePragArity` to add the right
    
    1359
    +  inl_sat field to that INLINE pragma for the matcher or builder respectively.
    
    1360
    +
    
    1361
    +* Note that the arity passed to `addInlinePragArity` is the `VisArity`, the /visible/
    
    1362
    +  arity.  That specifically /excludes/ dictionary arguments, which are dealt with
    
    1363
    +  later by `GHC.HsToCore.Binds.makeCorePair`. The builder and matcher have no Required
    
    1364
    +  type args, so we don't need to worry about them in the `VisArity`.
    
    1358 1365
      -}
    
    1359 1366
     
    
    1360 1367
     
    

  • configure.ac
    ... ... @@ -557,7 +557,7 @@ AC_SUBST(InstallNameToolCmd)
    557 557
     # versions of LLVM simultaneously, but that stopped working around
    
    558 558
     # 3.5/3.6 release of LLVM.
    
    559 559
     LlvmMinVersion=13  # inclusive
    
    560
    -LlvmMaxVersion=23  # not inclusive
    
    560
    +LlvmMaxVersion=24  # not inclusive
    
    561 561
     AC_SUBST([LlvmMinVersion])
    
    562 562
     AC_SUBST([LlvmMaxVersion])
    
    563 563
     
    

  • libraries/base/tests/all.T
    ... ... @@ -243,7 +243,7 @@ test('T8684', expect_broken(8684), compile_and_run, [''])
    243 243
     test('hWaitForInput-accurate-stdin', [js_broken(22349), expect_broken_for(16535, threaded_ways), req_process], compile_and_run, [''])
    
    244 244
     test('T9826',normal, compile_and_run,[''])
    
    245 245
     test('T9848',
    
    246
    -        [ collect_stats('bytes allocated')
    
    246
    +        [ collect_stats('bytes allocated', 2)
    
    247 247
             , only_ways(['normal'])
    
    248 248
             , js_broken(22261)
    
    249 249
             ],
    

  • rts/ProfHeap.c
    ... ... @@ -141,7 +141,10 @@ restore_locale( void )
    141 141
      * store only up to (max_era - 1) as its creation or last use time.
    
    142 142
      * -------------------------------------------------------------------------- */
    
    143 143
     unsigned int era;
    
    144
    +
    
    145
    +#if defined(PROFILING)
    
    144 146
     static uint32_t max_era;
    
    147
    +#endif
    
    145 148
     
    
    146 149
     StgWord user_era;
    
    147 150
     
    
    ... ... @@ -518,8 +521,10 @@ initHeapProfiling(void)
    518 521
             n_censuses = 1;
    
    519 522
         }
    
    520 523
     
    
    524
    +#if defined(PROFILING)
    
    521 525
         // max_era = 2^LDV_SHIFT
    
    522 526
         max_era = 1 << LDV_SHIFT;
    
    527
    +#endif
    
    523 528
     
    
    524 529
         censuses = stgMallocBytes(sizeof(Census) * n_censuses, "initHeapProfiling");
    
    525 530
     
    

  • rts/eventlog/EventLog.c
    ... ... @@ -113,8 +113,6 @@ static eventlog_init_func_t *eventlog_header_funcs = NULL;
    113 113
     // See Note [Maximum event length]
    
    114 114
     #define EVENT_LOG_SIZE 2 * (1024 * 1024) // 2MB
    
    115 115
     
    
    116
    -static int flushCount = 0;
    
    117
    -
    
    118 116
     // Struct for record keeping of buffer to store event types and events.
    
    119 117
     //
    
    120 118
     // Invariant: The event buffer will always begin with a block-start marker.
    
    ... ... @@ -1514,7 +1512,6 @@ void printAndClearEventBuf (EventsBuf *ebuf)
    1514 1512
             }
    
    1515 1513
     
    
    1516 1514
             resetEventsBuf(ebuf);
    
    1517
    -        flushCount++;
    
    1518 1515
     
    
    1519 1516
             postBlockMarker(ebuf);
    
    1520 1517
         }
    

  • rts/prim/atomic.c
    ... ... @@ -96,8 +96,6 @@ StgWord64 hs_atomic_nand64(StgWord x, StgWord64 val)
    96 96
       return __atomic_fetch_nand((volatile StgWord64 *) x, val, __ATOMIC_SEQ_CST);
    
    97 97
     }
    
    98 98
     
    
    99
    -#pragma GCC diagnostic pop
    
    100
    -
    
    101 99
     // FetchOrByteArrayOp_Int
    
    102 100
     
    
    103 101
     StgWord hs_atomic_or8(StgWord x, StgWord val)
    

  • testsuite/driver/README.md
    ... ... @@ -35,11 +35,13 @@ differences, and things such as that are not necessary to be considered by the
    35 35
     test writer anymore. This is due to the fact that the test comparison relies
    
    36 36
     entirely on locally collected metrics on the testing machine.
    
    37 37
     
    
    38
    -As such, it is perfectly sufficient to write `collect_stats('all',20)` in the
    
    39
    -".T" files to measure the 3 potential stats that can be collected for that test
    
    40
    -and automatically test them for regressions, failing if there is more than a 20%
    
    41
    -change in any direction. In fact, even that is not necessary as
    
    42
    -`collect_stats()` defaults to 'all', and 20% deviation allowed.
    
    38
    +A test states which metric to measure and how much deviation to allow, e.g.
    
    39
    +`collect_stats('bytes allocated', 2)` in the ".T" files. Such a test fails if
    
    40
    +the metric changes by more than 2% in either direction. To gate several metrics,
    
    41
    +use one `collect_stats` call per metric, so that each gets a tolerance matched
    
    42
    +to its noise profile: allocations are nearly deterministic and support tight
    
    43
    +windows, while the residency metrics need considerably slacker ones (see
    
    44
    +Note [Measuring residency] in testlib.py).
    
    43 45
     
    
    44 46
     The function `collect_compiler_stats()` is completely equivalent in every way to
    
    45 47
     `collect_stats` except that it measures the performance of the compiler itself
    

  • testsuite/driver/testlib.py
    ... ... @@ -24,7 +24,7 @@ import subprocess
    24 24
     from testglobals import config, ghc_env, default_testopts, brokens, t, \
    
    25 25
                             TestRun, TestResult, TestOptions, PerfMetric
    
    26 26
     from testutil import strip_quotes, lndir, link_or_copy_file, passed, \
    
    27
    -                     failBecause, testing_metrics, residency_testing_metrics, \
    
    27
    +                     failBecause, residency_testing_metrics, \
    
    28 28
                          stable_perf_counters, \
    
    29 29
                          PassFail, badResult, str_warn, str_removeprefix
    
    30 30
     from term_color import Color, colored_if
    
    ... ... @@ -816,28 +816,20 @@ def _collect_generic_stat(name : TestName, opts, metric_infos):
    816 816
     
    
    817 817
     # -----
    
    818 818
     
    
    819
    -# Defaults to "test everything, and only break on extreme cases"
    
    820
    -#
    
    821
    -# The inputs to this function are slightly interesting:
    
    822
    -# metric can be either:
    
    823
    -#     - 'all', in which case all 3 possible metrics are collected and compared.
    
    824
    -#     - The specific metric one wants to use in the test.
    
    825
    -#     - A set of the metrics one wants to use in the test.
    
    826
    -#
    
    827
    -# Deviation defaults to 20% because the goal is correctness over performance.
    
    828
    -# The testsuite should avoid breaking when there is not an actual error.
    
    829
    -# Instead, the testsuite should notify of regressions in a non-breaking manner.
    
    819
    +# metric is either a single metric name or a set of metric names. Use one
    
    820
    +# call per metric so each gets a tolerance matched to its noise profile.
    
    821
    +# See Note [Measuring residency] for the residency metrics.
    
    830 822
     #
    
    831 823
     # collect_compiler_stats is used when the metrics collected are about the compiler.
    
    832 824
     # collect_stats is used in the majority case when the metrics to be collected
    
    833 825
     # are about the performance of the runtime code generated by the compiler.
    
    834
    -def collect_compiler_stats(metric='all',deviation=20):
    
    826
    +def collect_compiler_stats(metric, deviation):
    
    835 827
         def f(name, opts, m=metric, d=deviation):
    
    836 828
             no_lint(name, opts)
    
    837 829
             return _collect_stats(name, opts, m, d, None, True)
    
    838 830
         return f
    
    839 831
     
    
    840
    -def collect_stats(metric='all', deviation=20, static_stats_file=None):
    
    832
    +def collect_stats(metric, deviation, static_stats_file=None):
    
    841 833
         return lambda name, opts, m=metric, d=deviation, s=static_stats_file: _collect_stats(name, opts, m, d, s)
    
    842 834
     
    
    843 835
     def statsFile(comp_test: bool, name: str) -> str:
    
    ... ... @@ -864,12 +856,9 @@ def _collect_stats(name: TestName, opts, metrics, deviation: Optional[int],
    864 856
             # This is a bit weird, though.
    
    865 857
             return
    
    866 858
     
    
    867
    -    # Normalize metrics to a list of strings.
    
    859
    +    # Normalize metrics to a set of strings.
    
    868 860
         if isinstance(metrics, str):
    
    869
    -        if metrics == 'all':
    
    870
    -            metrics = testing_metrics()
    
    871
    -        else:
    
    872
    -            metrics = { metrics }
    
    861
    +        metrics = { metrics }
    
    873 862
     
    
    874 863
         opts.is_stats_test = True
    
    875 864
         if is_compiler_stats_test:
    

  • testsuite/tests/ffi/should_run/T21305.hs
    ... ... @@ -45,4 +45,4 @@ writeByteArray# :: MutableByteArray# RealWorld
    45 45
     writeByteArray# _   _   []          s = s
    
    46 46
     writeByteArray# mba off (I64# i:is) s =
    
    47 47
       case writeInt64Array# mba off i s of
    
    48
    -    s' -> writeByteArray# mba (off +# 8#) is s'
    48
    +    s' -> writeByteArray# mba (off +# 1#) is s'

  • testsuite/tests/patsyn/should_compile/T27744.hs
    1
    +{-# LANGUAGE CPP #-}
    
    2
    +
    
    3
    +{-# LANGUAGE BangPatterns #-}
    
    4
    +{-# LANGUAGE GADTs #-}
    
    5
    +{-# LANGUAGE PolyKinds #-}
    
    6
    +{-# LANGUAGE ScopedTypeVariables #-}
    
    7
    +{-# LANGUAGE TypeOperators #-}
    
    8
    +{-# LANGUAGE PatternSynonyms #-}
    
    9
    +{-# LANGUAGE RoleAnnotations #-}
    
    10
    +{-# LANGUAGE StandaloneKindSignatures #-}
    
    11
    +{-# LANGUAGE ViewPatterns #-}
    
    12
    +
    
    13
    +-- | A facility for faking GADTs that work sufficiently similarly
    
    14
    +-- to unary natural numbers.
    
    15
    +module T27744
    
    16
    +  ( Nattish (Zeroy, Succy)
    
    17
    +  )
    
    18
    +  where
    
    19
    +import Unsafe.Coerce (unsafeCoerce)
    
    20
    +import Data.Kind (Type)
    
    21
    +
    
    22
    +type Nattish :: forall k. k -> (k -> k) -> k -> Type
    
    23
    +newtype Nattish zero succ n = Nattish Word
    
    24
    +type role Nattish nominal nominal nominal
    
    25
    +
    
    26
    +data Res zero succ n where
    
    27
    +  ResZero :: Res zero succ zero
    
    28
    +  ResSucc :: !(Nattish zero succ n) -> Res zero succ (succ n)
    
    29
    +
    
    30
    +check :: Nattish zero succ n -> Res zero succ n
    
    31
    +check (Nattish 0) = unsafeCoerce ResZero
    
    32
    +check (Nattish n) = unsafeCoerce $ ResSucc (Nattish (n - 1))
    
    33
    +
    
    34
    +pattern Zeroy :: forall {k} zero succ (n :: k). () => n ~ zero => Nattish zero succ n
    
    35
    +pattern Zeroy <- (check -> ResZero)
    
    36
    +  where
    
    37
    +    Zeroy = Nattish 0
    
    38
    +{-# INLINE Zeroy #-}
    
    39
    +
    
    40
    +pattern Succy :: forall {k} zero succ (n :: k). () => forall (n' :: k). n ~ succ n' => Nattish zero succ n' -> Nattish zero succ n
    
    41
    +pattern Succy n <- (check -> ResSucc n)
    
    42
    +  where
    
    43
    +    Succy (Nattish n) = Nattish (n + 1)
    
    44
    +{-# INLINE Succy #-}
    
    45
    +
    
    46
    +{-# COMPLETE Zeroy, Succy #-}

  • testsuite/tests/patsyn/should_compile/all.T
    ... ... @@ -94,3 +94,4 @@ test('T26331a', normal, compile, [''])
    94 94
     test('T27440a', normal, compile, [''])
    
    95 95
     test('T27440b', normal, compile, [''])
    
    96 96
     test('T27440c', normal, compile, [''])
    
    97
    +test('T27744', normal, compile, [''])

  • testsuite/tests/perf/compiler/all.T
    ... ... @@ -638,13 +638,15 @@ test ('T15164',
    638 638
           ],
    
    639 639
           compile,
    
    640 640
           ['-v0 -O'])
    
    641
    +# T15630/T15630a guard against exponential simplifier blowup when inlining
    
    642
    +# join points (#15630).
    
    641 643
     test('T15630',
    
    642
    -      [collect_compiler_stats()
    
    644
    +      [collect_compiler_stats('bytes allocated', 2)
    
    643 645
           ],
    
    644 646
           compile,
    
    645 647
           ['-O2'])
    
    646 648
     test('T15630a',
    
    647
    -      [collect_compiler_stats()
    
    649
    +      [collect_compiler_stats('bytes allocated', 2)
    
    648 650
           ],
    
    649 651
           compile,
    
    650 652
           ['-O2'])
    
    ... ... @@ -768,12 +770,17 @@ test ('T9198',
    768 770
           compile,
    
    769 771
           [''])
    
    770 772
     
    
    773
    +# Guards against quadratic demand-analysis cost on wide recursive data
    
    774
    +# types, which manifested as a compile-time memory blowup (#11545).
    
    771 775
     test('T11545',
    
    772
    -     [ collect_compiler_stats('all', 15) ],
    
    776
    +     [ collect_compiler_stats('bytes allocated', 2)
    
    777
    +     , collect_compiler_residency(15) ],
    
    773 778
          compile, ['-O'])
    
    774 779
     
    
    780
    +# Guards against the compile-time memory blowup of #15304
    
    775 781
     test('T15304',
    
    776
    -     [ collect_compiler_stats('all', 10) ],
    
    782
    +     [ collect_compiler_stats('bytes allocated', 2)
    
    783
    +     , collect_compiler_residency(10) ],
    
    777 784
          compile, ['-O'])
    
    778 785
     test ('T20049',
    
    779 786
           [ collect_compiler_stats('bytes allocated',2) ],
    
    ... ... @@ -795,8 +802,10 @@ test('T16875', # Testing one hole-fit with a lot in scope for #16875
    795 802
          collect_compiler_runtime(4),
    
    796 803
          compile, ['-fdefer-type-errors -fno-max-valid-hole-fits -package ghc'])
    
    797 804
     
    
    805
    +# Guards against renamer/typechecker allocation regressions on very large
    
    806
    +# generated modules (#20261, a Happy-generated parser).
    
    798 807
     test ('T20261',
    
    799
    -      [collect_compiler_stats('all')],
    
    808
    +      [collect_compiler_stats('bytes allocated', 2)],
    
    800 809
           compile,
    
    801 810
           [''])
    
    802 811
     
    
    ... ... @@ -805,8 +814,7 @@ test ('T20261',
    805 814
     # does not sensibly handle one test acting as both
    
    806 815
     # a compile-time and a run-time performance test
    
    807 816
     test('T21839c',
    
    808
    -    [   collect_compiler_stats('all', 10),
    
    809
    -        collect_compiler_runtime(1),
    
    817
    +    [   collect_compiler_runtime(1),
    
    810 818
             only_ways(['normal'])],
    
    811 819
         compile,
    
    812 820
         ['-O'])
    
    ... ... @@ -872,8 +880,10 @@ test('interpreter_steplocal',
    872 880
          ghci_script,
    
    873 881
          ['interpreter_steplocal.script'])
    
    874 882
     
    
    883
    +# Guards against the compile-time memory blowup of #26425
    
    875 884
     test ('T26425',
    
    876
    -      [ collect_compiler_stats('all',20) ],
    
    885
    +      [ collect_compiler_stats('bytes allocated', 2)
    
    886
    +      , collect_compiler_residency(20) ],
    
    877 887
           compile,
    
    878 888
           ['-O'])
    
    879 889
     
    

  • testsuite/tests/perf/compiler/large-project/all.T
    ... ... @@ -7,7 +7,7 @@ def large_project_makedepend(num):
    7 7
         return test(
    
    8 8
             f'large-project-makedepend-{num}',
    
    9 9
             [
    
    10
    -            collect_compiler_stats('bytes allocated'),
    
    10
    +            collect_compiler_stats('bytes allocated', 10),
    
    11 11
                 pre_cmd(f'./large-project.sh {num}'),
    
    12 12
                 extra_files(['large-project.sh']),
    
    13 13
                 ignore_stderr,
    

  • testsuite/tests/perf/should_run/T3586.hs
    ... ... @@ -14,7 +14,8 @@ go :: STUArray s Int Double -> Int -> Double -> ST s Double
    14 14
     go !a i !acc
    
    15 15
         | i < 1     = return acc
    
    16 16
         | otherwise = do
    
    17
    -         b <- unsafeRead a i
    
    18
    -         unsafeWrite a i (b+3.0)
    
    19
    -         c <- unsafeRead a i
    
    17
    +         -- unsafeRead/unsafeWrite use 0-based index
    
    18
    +         b <- unsafeRead a (i-1)
    
    19
    +         unsafeWrite a (i-1) (b+3.0)
    
    20
    +         c <- unsafeRead a (i-1)
    
    20 21
              go a (i-1) (c+acc)

  • testsuite/tests/perf/should_run/T3586.stdout
    1
    -2.79999863e8
    1
    +2.8e8

  • testsuite/tests/perf/space_leaks/all.T
    1 1
     setTestOpts(js_skip)
    
    2 2
     
    
    3 3
     test('space_leak_001',
    
    4
    -     # This could potentially be replaced with
    
    5
    -     # collect_stats('all',5) to test all 3 with
    
    6
    -     # 5% possible deviation.
    
    7 4
          [ collect_stats('bytes allocated',5),
    
    8 5
           collect_runtime_residency(15),
    
    9 6
           omit_ways(['profasm','profthreaded','threaded1','threaded2',
    

  • utils/check-exact/ExactPrint.hs
    ... ... @@ -3397,13 +3397,13 @@ instance ExactPrint (HsCmd GhcPs) where
    3397 3397
           e' <- markAnnotated e
    
    3398 3398
           return (HsCmdLet (tkLet', tkIn') binds' e')
    
    3399 3399
     
    
    3400
    -  exact (HsCmdDo (an0,loc) (L l es)) = do
    
    3400
    +  exact (HsCmdDo (an0,loc) es) = do
    
    3401 3401
         debugM $ "HsCmdDo"
    
    3402 3402
         loc' <- printStringAtAA loc "do"
    
    3403 3403
         (an1,es') <- markAnnList' an0 $ do
    
    3404
    -      ee <- mapM markAnnotated es
    
    3404
    +      ee <- markAnnotated es
    
    3405 3405
           return ee
    
    3406
    -    return (HsCmdDo (an1,loc') (L l es'))
    
    3406
    +    return (HsCmdDo (an1,loc') es')
    
    3407 3407
     
    
    3408 3408
     -- ---------------------------------------------------------------------
    
    3409 3409
     
    
    ... ... @@ -4462,10 +4462,10 @@ instance ExactPrint [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsCmd GhcPs)))] whe
    4462 4462
           Just (initStmts, ls@(L _ (LastStmt _ _body _ _))) -> do
    
    4463 4463
             debugM $ "LocatedL [ExprLStmt: snocView"
    
    4464 4464
             ls' <- markAnnotated ls
    
    4465
    -        initStmts' <- markAnnotated initStmts
    
    4465
    +        initStmts' <- mapM markAnnotated initStmts
    
    4466 4466
             return (initStmts' ++ [ls'])
    
    4467 4467
           _ -> do
    
    4468
    -        stmts' <- markAnnotated stmts
    
    4468
    +        stmts' <- mapM markAnnotated stmts
    
    4469 4469
             return stmts'
    
    4470 4470
     
    
    4471 4471
     instance ExactPrint [Located HsDocStringChunk] where
    

  • utils/ghc-toolchain/src/GHC/Toolchain/Program.hs
    ... ... @@ -167,7 +167,7 @@ minLlvmVersion = 13
    167 167
     
    
    168 168
     -- Max llvm version (exclusive)
    
    169 169
     maxLlvmVersionExcl :: Int
    
    170
    -maxLlvmVersionExcl = 23
    
    170
    +maxLlvmVersionExcl = 24
    
    171 171
     
    
    172 172
     -- Max llvm version (inclusive)
    
    173 173
     maxLlvmVersion :: Int