From 3a8c69cb142e27caae5d754ac400636b3417b198 Mon Sep 17 00:00:00 2001
From: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Date: Tue, 28 May 2024 21:05:56 -0400
Subject: [PATCH] CI: add GHC 9.10 (#9914)

* CI: add GHC 9.10

* GHC 9.10 compat in testsuite: CPP symbols don't get passed to CC as
eagearly

Discussion: https://github.com/haskell/cabal/pull/9914#issuecomment-2077439625

Related GHC issue: https://gitlab.haskell.org/ghc/ghc/-/issues/21291

* GHC 9.10 compat in tests: disable tests regressing due to #9940
---
 .github/workflows/validate.yml                   |  3 ++-
 .../src/Distribution/Client/TargetSelector.hs    |  7 ++++++-
 cabal-install/tests/IntegrationTests2.hs         |  6 ++++--
 .../Distribution/Client/Init/NonInteractive.hs   |  3 +++
 .../PackageTests/CCompilerOverride/foo.c         |  8 --------
 .../PackageTests/CCompilerOverride/my.cabal      |  2 +-
 .../CCompilerOverride/setup.cabal.out            |  1 -
 .../PackageTests/CCompilerOverride/setup.out     |  1 -
 .../PackageTests/CCompilerOverride/setup.test.hs |  8 +++++---
 project-cabal/ghc-latest.config                  | 16 ++++++++++++++--
 10 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index bc765b59ba..71c0246b6f 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -70,7 +70,7 @@ jobs:
         # If you remove something from here, then add it to the old-ghcs job.
         # Also a removed GHC from here means that we are actually dropping
         # support, so the PR *must* have a changelog entry.
-        ghc: ['9.8.2', '9.6.4', '9.4.8', '9.2.8', '9.0.2', '8.10.7', '8.8.4', '8.6.5']
+        ghc: ['9.10.1', '9.8.2', '9.6.4', '9.4.8', '9.2.8', '9.0.2', '8.10.7', '8.8.4', '8.6.5']
         exclude:
           # corrupts GHA cache or the fabric of reality itself, see https://github.com/haskell/cabal/issues/8356
           - os: windows-latest
@@ -104,6 +104,7 @@ jobs:
         with:
           ghc-version: ${{ matrix.ghc }}
           cabal-version: latest # latest is mandatory for cabal-testsuite, see https://github.com/haskell/cabal/issues/8133
+          ghcup-release-channel: https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.8.yaml
 
       #  See the following link for a breakdown of the following step
       #  https://github.com/haskell/actions/issues/7#issuecomment-745697160
diff --git a/cabal-install/src/Distribution/Client/TargetSelector.hs b/cabal-install/src/Distribution/Client/TargetSelector.hs
index f287400e1e..8dabe33f22 100644
--- a/cabal-install/src/Distribution/Client/TargetSelector.hs
+++ b/cabal-install/src/Distribution/Client/TargetSelector.hs
@@ -101,6 +101,11 @@ import Control.Arrow ((&&&))
 import Control.Monad hiding
   ( mfilter
   )
+#if MIN_VERSION_base(4,20,0)
+import Data.Functor as UZ (unzip)
+#else
+import qualified Data.List.NonEmpty as UZ (unzip)
+#endif
 import Data.List
   ( stripPrefix
   )
@@ -585,7 +590,7 @@ resolveTargetSelector knowntargets@KnownTargets{..} mfilter targetStrStatus =
 
     classifyMatchErrors errs
       | Just expectedNE <- NE.nonEmpty expected =
-          let (things, got :| _) = NE.unzip expectedNE
+          let (things, got :| _) = UZ.unzip expectedNE
            in TargetSelectorExpected targetStr (NE.toList things) got
       | not (null nosuch) =
           TargetSelectorNoSuch targetStr nosuch
diff --git a/cabal-install/tests/IntegrationTests2.hs b/cabal-install/tests/IntegrationTests2.hs
index 3598b357d6..a917e48efa 100644
--- a/cabal-install/tests/IntegrationTests2.hs
+++ b/cabal-install/tests/IntegrationTests2.hs
@@ -1438,9 +1438,11 @@ testSetupScriptStyles config reportSubCase = do
 
   let isOSX (Platform _ OSX) = True
       isOSX _ = False
+      compilerVer = compilerVersion (pkgConfigCompiler sharedConfig)
   -- Skip the Custom tests when the shipped Cabal library is buggy
-  unless (isOSX (pkgConfigPlatform sharedConfig)
-       && compilerVersion (pkgConfigCompiler sharedConfig) < mkVersion [7,10]) $ do
+  unless ((isOSX (pkgConfigPlatform sharedConfig) && (compilerVer < mkVersion [7,10]))
+       -- 9.10 ships Cabal 3.12.0.0 affected by #9940
+       || (mkVersion [9,10] <= compilerVer && compilerVer < mkVersion [9,11])) $ do
 
     (plan1, res1) <- executePlan plan0
     pkg1          <- expectPackageInstalled plan1 res1 pkgidA
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Init/NonInteractive.hs b/cabal-install/tests/UnitTests/Distribution/Client/Init/NonInteractive.hs
index d35ab35a65..cd61862220 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/Init/NonInteractive.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/Init/NonInteractive.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE LambdaCase #-}
 
 module UnitTests.Distribution.Client.Init.NonInteractive
@@ -12,7 +13,9 @@ import UnitTests.Distribution.Client.Init.Utils
 import qualified Data.List.NonEmpty as NEL
 import qualified Distribution.SPDX as SPDX
 
+#if !MIN_VERSION_base(4,20,0)
 import Data.List (foldl')
+#endif
 import qualified Data.Set as Set
 import Distribution.CabalSpecVersion
 import Distribution.Client.Init.Defaults
diff --git a/cabal-testsuite/PackageTests/CCompilerOverride/foo.c b/cabal-testsuite/PackageTests/CCompilerOverride/foo.c
index 30892bef07..03ddd01e14 100644
--- a/cabal-testsuite/PackageTests/CCompilerOverride/foo.c
+++ b/cabal-testsuite/PackageTests/CCompilerOverride/foo.c
@@ -1,16 +1,8 @@
 
-#ifndef NOERROR1
-#error "NOERROR1 was not passed"
-#endif
-
 #ifndef NOERROR2
 #error "NOERROR2 was not passed"
 #endif
 
-#ifndef NOERROR3
-#error "NOERROR3 was not passed"
-#endif
-
 #ifndef NOERROR4
 #error "NOERROR4 was not passed"
 #endif
diff --git a/cabal-testsuite/PackageTests/CCompilerOverride/my.cabal b/cabal-testsuite/PackageTests/CCompilerOverride/my.cabal
index 31a79f93a6..14772f3894 100644
--- a/cabal-testsuite/PackageTests/CCompilerOverride/my.cabal
+++ b/cabal-testsuite/PackageTests/CCompilerOverride/my.cabal
@@ -9,5 +9,5 @@ executable foo
     main-is:          Main.hs
     c-sources:        foo.c
     build-depends:    base
-    ghc-options:      -DNOERROR4
+    ghc-options:      -optc=-DNOERROR4
     cc-options:       -DNOERROR5 -march=native
diff --git a/cabal-testsuite/PackageTests/CCompilerOverride/setup.cabal.out b/cabal-testsuite/PackageTests/CCompilerOverride/setup.cabal.out
index 21981fd9b7..6d0c3265de 100644
--- a/cabal-testsuite/PackageTests/CCompilerOverride/setup.cabal.out
+++ b/cabal-testsuite/PackageTests/CCompilerOverride/setup.cabal.out
@@ -1,4 +1,3 @@
 # Setup configure
 Configuring my-0.1...
-Warning: [misplaced-c-opt] Instead of 'ghc-options: -DNOERROR4' use 'cpp-options: -DNOERROR4'
 # Setup build
diff --git a/cabal-testsuite/PackageTests/CCompilerOverride/setup.out b/cabal-testsuite/PackageTests/CCompilerOverride/setup.out
index 21981fd9b7..6d0c3265de 100644
--- a/cabal-testsuite/PackageTests/CCompilerOverride/setup.out
+++ b/cabal-testsuite/PackageTests/CCompilerOverride/setup.out
@@ -1,4 +1,3 @@
 # Setup configure
 Configuring my-0.1...
-Warning: [misplaced-c-opt] Instead of 'ghc-options: -DNOERROR4' use 'cpp-options: -DNOERROR4'
 # Setup build
diff --git a/cabal-testsuite/PackageTests/CCompilerOverride/setup.test.hs b/cabal-testsuite/PackageTests/CCompilerOverride/setup.test.hs
index 5843cb2b7d..b4f7f04ddb 100644
--- a/cabal-testsuite/PackageTests/CCompilerOverride/setup.test.hs
+++ b/cabal-testsuite/PackageTests/CCompilerOverride/setup.test.hs
@@ -3,6 +3,10 @@ import Test.Cabal.Prelude
 -- Test that all the respective defines -DNOERROR... specified in various ways
 -- all end up routed to the C compiler. Otherwise the C file we depend on will
 -- not compile.
+--
+-- This has been largely gutted, as ghc 9.10 no longer passes through most
+-- of the defines we were testing; see
+-- https://gitlab.haskell.org/ghc/ghc/-/commit/8ff3134ed4aa323b0199ad683f72165e51a59ab6
 main = setupAndCabalTest $ do
   skipUnlessGhcVersion ">= 8.8"
   isWin <- isWindows
@@ -14,9 +18,7 @@ main = setupAndCabalTest $ do
         pwd ++ "/custom-cc" ++ if isWin then win_suffix else ""
 
   setup "configure"
-    [ "--ghc-option=-DNOERROR1"
-    , "--ghc-option=-optc=-DNOERROR2"
-    , "--ghc-option=-optP=-DNOERROR3"
+    [ "--ghc-option=-optc=-DNOERROR2"
     , "--with-gcc=" ++ customCC
     ]
   setup "build" ["-v2"]
diff --git a/project-cabal/ghc-latest.config b/project-cabal/ghc-latest.config
index bff5d80c24..5f8d40290d 100644
--- a/project-cabal/ghc-latest.config
+++ b/project-cabal/ghc-latest.config
@@ -8,5 +8,17 @@
 
 -- NOTE: don't forget to update the compiler version in the conditional
 -- when upgrading to a newer GHC
-if impl(ghc >= 9.8.1)
-    -- allow-newer: windns:*
+if impl(ghc >= 9.10.0)
+    allow-newer:
+    --windns:*, rere:*, tree-diff:*, uuid-types:*, these:*, hashable:*, assoc:*, semialign:*, indexed-traversable-instances:*, indexed-traversable:*, OneTuple:*, scientific:*, time-compat:*, text-short:*, integer-conversion:*, generically:*, data-fix:*, binary:*
+    -- Artem, 2024-04-21: I started and then gave up...
+        *:base, *:template-haskell, text-short, *:deepseq, *:bytestring, *:ghc-prim
+
+    repository head.hackage.ghc.haskell.org
+        url: https://ghc.gitlab.haskell.org/head.hackage/
+        secure: True
+        key-threshold: 3
+        root-keys:
+            26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329
+            7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d
+            f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89
-- 
GitLab