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

Commits:

10 changed files:

Changes:

  • compiler/GHC/Driver/Downsweep.hs
    ... ... @@ -947,6 +947,71 @@ enableCodeGenWhen logger tmpfs staticLife dynLife unit_env mod_graph = do
    947 947
                                      hostFullWays
    
    948 948
             in dflags_c
    
    949 949
     
    
    950
    +{- Note [-fno-code mode]
    
    951
    +~~~~~~~~~~~~~~~~~~~~~~~~
    
    952
    +GHC offers the flag -fno-code for the purpose of parsing and typechecking a
    
    953
    +program without generating object files. This is intended to be used by tooling
    
    954
    +and IDEs to provide quick feedback on any parser or type errors as cheaply as
    
    955
    +possible.
    
    956
    +
    
    957
    +When GHC is invoked with -fno-code, no object files or linked output will be
    
    958
    +generated. As many errors and warnings as possible will be generated, as if
    
    959
    +-fno-code had not been passed. The session DynFlags will have
    
    960
    +backend == NoBackend.
    
    961
    +
    
    962
    +-fwrite-interface
    
    963
    +~~~~~~~~~~~~~~~~
    
    964
    +Whether interface files are generated in -fno-code mode is controlled by the
    
    965
    +-fwrite-interface flag. The -fwrite-interface flag is a no-op if -fno-code is
    
    966
    +not also passed. Recompilation avoidance requires interface files, so passing
    
    967
    +-fno-code without -fwrite-interface should be avoided. If -fno-code were
    
    968
    +re-implemented today, there would be no need for -fwrite-interface as it
    
    969
    +would considered always on; this behaviour is as it is for backwards compatibility.
    
    970
    +
    
    971
    +================================================================
    
    972
    +IN SUMMARY: ALWAYS PASS -fno-code AND -fwrite-interface TOGETHER
    
    973
    +================================================================
    
    974
    +
    
    975
    +Template Haskell
    
    976
    +~~~~~~~~~~~~~~~~
    
    977
    +A module using Template Haskell may invoke an imported function from inside a
    
    978
    +splice. This will cause the type-checker to attempt to execute that code, which
    
    979
    +would fail if no object files had been generated. See #8025. To rectify this,
    
    980
    +during the downsweep we patch the DynFlags in the ModSummary of any home module
    
    981
    +that is imported by a module that uses Template Haskell to generate object
    
    982
    +code.
    
    983
    +
    
    984
    +The flavour of the generated code depends on whether `-fprefer-byte-code` is enabled
    
    985
    +or not in the module which needs the code generation. If the module requires byte-code then
    
    986
    +dependencies will generate byte-code, otherwise they will generate object files.
    
    987
    +In the case where some modules require byte-code and some object files, both are
    
    988
    +generated by enabling `-fbyte-code-and-object-code`, the test "fat015" tests these
    
    989
    +configurations.
    
    990
    +
    
    991
    +The object files (and interface files if -fwrite-interface is disabled) produced
    
    992
    +for Template Haskell are written to temporary files.
    
    993
    +
    
    994
    +Note that since Template Haskell can run arbitrary IO actions, -fno-code mode
    
    995
    +is no more secure than running without it.
    
    996
    +
    
    997
    +Potential TODOS:
    
    998
    +~~~~~
    
    999
    +* Remove -fwrite-interface and have interface files always written in -fno-code
    
    1000
    +  mode
    
    1001
    +* Both .o and .dyn_o files are generated for template haskell, but we only need
    
    1002
    +  .dyn_o. Fix it.
    
    1003
    +* In make mode, a message like
    
    1004
    +  Compiling A (A.hs, /tmp/ghc_123.o)
    
    1005
    +  is shown if downsweep enabled object code generation for A. Perhaps we should
    
    1006
    +  show "nothing" or "temporary object file" instead. Note that one
    
    1007
    +  can currently use -keep-tmp-files and inspect the generated file with the
    
    1008
    +  current behaviour.
    
    1009
    +* Offer a -no-codedir command line option, and write what were temporary
    
    1010
    +  object files there. This would speed up recompilation.
    
    1011
    +* Use existing object files (if they are up to date) instead of always
    
    1012
    +  generating temporary ones.
    
    1013
    +-}
    
    1014
    +
    
    950 1015
     -- | Populate the Downsweep cache with the root modules.
    
    951 1016
     mkRootMap
    
    952 1017
       :: [ModuleNodeInfo]
    

  • compiler/GHC/Driver/Make.hs
    ... ... @@ -1246,70 +1246,6 @@ addSptEntries hsc_env mlinkable =
    1246 1246
          , spt <- bc_spt_entries bco
    
    1247 1247
          ]
    
    1248 1248
     
    
    1249
    -{- Note [-fno-code mode]
    
    1250
    -~~~~~~~~~~~~~~~~~~~~~~~~
    
    1251
    -GHC offers the flag -fno-code for the purpose of parsing and typechecking a
    
    1252
    -program without generating object files. This is intended to be used by tooling
    
    1253
    -and IDEs to provide quick feedback on any parser or type errors as cheaply as
    
    1254
    -possible.
    
    1255
    -
    
    1256
    -When GHC is invoked with -fno-code no object files or linked output will be
    
    1257
    -generated. As many errors and warnings as possible will be generated, as if
    
    1258
    --fno-code had not been passed. The session DynFlags will have
    
    1259
    -backend == NoBackend.
    
    1260
    -
    
    1261
    --fwrite-interface
    
    1262
    -~~~~~~~~~~~~~~~~
    
    1263
    -Whether interface files are generated in -fno-code mode is controlled by the
    
    1264
    --fwrite-interface flag. The -fwrite-interface flag is a no-op if -fno-code is
    
    1265
    -not also passed. Recompilation avoidance requires interface files, so passing
    
    1266
    --fno-code without -fwrite-interface should be avoided. If -fno-code were
    
    1267
    -re-implemented today, -fwrite-interface would be discarded and it would be
    
    1268
    -considered always on; this behaviour is as it is for backwards compatibility.
    
    1269
    -
    
    1270
    -================================================================
    
    1271
    -IN SUMMARY: ALWAYS PASS -fno-code AND -fwrite-interface TOGETHER
    
    1272
    -================================================================
    
    1273
    -
    
    1274
    -Template Haskell
    
    1275
    -~~~~~~~~~~~~~~~~
    
    1276
    -A module using template haskell may invoke an imported function from inside a
    
    1277
    -splice. This will cause the type-checker to attempt to execute that code, which
    
    1278
    -would fail if no object files had been generated. See #8025. To rectify this,
    
    1279
    -during the downsweep we patch the DynFlags in the ModSummary of any home module
    
    1280
    -that is imported by a module that uses template haskell, to generate object
    
    1281
    -code.
    
    1282
    -
    
    1283
    -The flavour of the generated code depends on whether `-fprefer-byte-code` is enabled
    
    1284
    -or not in the module which needs the code generation. If the module requires byte-code then
    
    1285
    -dependencies will generate byte-code, otherwise they will generate object files.
    
    1286
    -In the case where some modules require byte-code and some object files, both are
    
    1287
    -generated by enabling `-fbyte-code-and-object-code`, the test "fat015" tests these
    
    1288
    -configurations.
    
    1289
    -
    
    1290
    -The object files (and interface files if -fwrite-interface is disabled) produced
    
    1291
    -for template haskell are written to temporary files.
    
    1292
    -
    
    1293
    -Note that since template haskell can run arbitrary IO actions, -fno-code mode
    
    1294
    -is no more secure than running without it.
    
    1295
    -
    
    1296
    -Potential TODOS:
    
    1297
    -~~~~~
    
    1298
    -* Remove -fwrite-interface and have interface files always written in -fno-code
    
    1299
    -  mode
    
    1300
    -* Both .o and .dyn_o files are generated for template haskell, but we only need
    
    1301
    -  .dyn_o. Fix it.
    
    1302
    -* In make mode, a message like
    
    1303
    -  Compiling A (A.hs, /tmp/ghc_123.o)
    
    1304
    -  is shown if downsweep enabled object code generation for A. Perhaps we should
    
    1305
    -  show "nothing" or "temporary object file" instead. Note that one
    
    1306
    -  can currently use -keep-tmp-files and inspect the generated file with the
    
    1307
    -  current behaviour.
    
    1308
    -* Offer a -no-codedir command line option, and write what were temporary
    
    1309
    -  object files there. This would speed up recompilation.
    
    1310
    -* Use existing object files (if they are up to date) instead of always
    
    1311
    -  generating temporary ones.
    
    1312
    --}
    
    1313 1249
     
    
    1314 1250
     -- Note [When source is considered modified]
    
    1315 1251
     -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    

  • compiler/GHC/Runtime/Eval.hs
    ... ... @@ -78,7 +78,7 @@ import GHC.Core.Type hiding( typeKind )
    78 78
     import qualified GHC.Core.Type as Type
    
    79 79
     
    
    80 80
     import GHC.Iface.Env       ( newInteractiveBinder )
    
    81
    -import GHC.Iface.Load      ( loadSrcInterface )
    
    81
    +import GHC.Iface.Load      ( loadInterfaceForModule )
    
    82 82
     import GHC.Tc.Utils.TcType
    
    83 83
     import GHC.Tc.Types.Constraint
    
    84 84
     import GHC.Tc.Types.Origin
    
    ... ... @@ -843,7 +843,7 @@ mkTopLevEnv hsc_env modl
    843 843
                           $ fmap (foldr plusGlobalRdrEnv emptyGlobalRdrEnv)
    
    844 844
                           $ forM imports $ \iface_import -> do
    
    845 845
                             let ImpUserSpec spec details = tcIfaceImport iface_import
    
    846
    -                        iface <- loadSrcInterface (text "imported by GHCi") (moduleName $ is_mod spec) (is_isboot spec) (is_pkg_qual spec)
    
    846
    +                        iface <- loadInterfaceForModule (text "imported by GHCi") (is_mod spec)
    
    847 847
                             pure $ case details of
    
    848 848
                               ImpUserAll -> importsFromIface hsc_env iface spec Nothing
    
    849 849
                               ImpUserEverythingBut ns -> importsFromIface hsc_env iface spec (Just ns)
    

  • testsuite/tests/gadt/T23298.hs
    1
    +{-# LANGUAGE GADTs #-}
    
    2
    +module T23298 where
    
    3
    +
    
    4
    +import Data.Kind (Type)
    
    5
    +
    
    6
    +type HList :: Type -> Type
    
    7
    +data HList a where
    
    8
    +  HCons :: HList x -> HList (Maybe x)
    
    9
    +
    
    10
    +eq :: HList a -> Bool
    
    11
    +eq x = case x of
    
    12
    +         HCons ms -> True
    
    13
    +
    
    14
    +go (HCons x) = go x
    
    15
    +
    
    16
    +{- go :: HList alpha -> beta
    
    17
    +
    
    18
    +Under HCons
    
    19
    +  [G] alpha ~ Maybe x
    
    20
    +  [W] HList x ~ HList alpha
    
    21
    +==>
    
    22
    +  [W] x ~ alpha
    
    23
    +==>
    
    24
    +  [W] x ~ Maybe x
    
    25
    +-}

  • testsuite/tests/gadt/T23298.stderr
    1
    + T23298.hs:14:16: error: [GHC-25897]
    
    2
    +    • Couldn't match type ‘x’ with ‘Maybe x’
    
    3
    +      Expected: HList x -> t
    
    4
    +        Actual: HList a -> t
    
    5
    +      ‘x’ is a rigid type variable bound by
    
    6
    +        a pattern with constructor:
    
    7
    +          HCons :: forall x. HList x -> HList (Maybe x),
    
    8
    +        in an equation for ‘go’
    
    9
    +        at T23298.hs:14:5-11
    
    10
    +    • In the expression: go x
    
    11
    +      In an equation for ‘go’: go (HCons x) = go x
    
    12
    +    • Relevant bindings include x :: HList x (bound at T23298.hs:14:11)

  • testsuite/tests/gadt/all.T
    ... ... @@ -131,3 +131,4 @@ test('T19847a', normalise_version('base'), compile, ['-ddump-types'])
    131 131
     test('T19847b', normal, compile, [''])
    
    132 132
     test('T23022', normal, compile, ['-dcore-lint'])
    
    133 133
     test('T23023', normal, compile_fail, ['-O -dcore-lint']) # todo: move this test?
    
    134
    +test('T23298', normal, compile_fail, [''])

  • testsuite/tests/ghci/scripts/GhciPackageRename.hs
    1
    +module GhciPackageRename where
    
    2
    +
    
    3
    +foo :: Map k v
    
    4
    +foo = empty
    \ No newline at end of file

  • testsuite/tests/ghci/scripts/GhciPackageRename.script
    1
    +:l GhciPackageRename.hs
    
    2
    +-- Test that Data.Map is available as Prelude
    
    3
    +:t fromList
    
    4
    +
    
    5
    +-- Test using a Map function
    
    6
    +fromList [(1,"a"), (2,"b")]
    \ No newline at end of file

  • testsuite/tests/ghci/scripts/GhciPackageRename.stdout
    1
    +fromList
    
    2
    +  :: ghc-internal:GHC.Internal.Classes.Ord k => [(k, a)] -> Map k a
    
    3
    +fromList [(1,"a"),(2,"b")]

  • testsuite/tests/ghci/scripts/all.T
    ... ... @@ -386,3 +386,9 @@ test('T13869', extra_files(['T13869a.hs', 'T13869b.hs']), ghci_script, ['T13869.
    386 386
     test('ListTuplePunsPpr', normal, ghci_script, ['ListTuplePunsPpr.script'])
    
    387 387
     test('ListTuplePunsPprNoAbbrevTuple', [expect_broken(23135), limit_stdout_lines(13)], ghci_script, ['ListTuplePunsPprNoAbbrevTuple.script'])
    
    388 388
     test('T24459', normal, ghci_script, ['T24459.script'])
    
    389
    +
    
    390
    +# Test package renaming in GHCi session
    
    391
    +test('GhciPackageRename',
    
    392
    +     [extra_hc_opts("-hide-all-packages -package 'containers (Data.Map as Prelude)'")],
    
    393
    +     ghci_script,
    
    394
    +     ['GhciPackageRename.script'])