[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 3 commits: Add example and doc for Arg (Fixes #17153)

Marge Bot gitlab at gitlab.haskell.org
Wed Mar 25 09:44:39 UTC 2020



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


Commits:
2643ba46 by Paavo at 2020-03-24T08:31:32-04:00
Add example and doc for Arg (Fixes #17153)

- - - - -
718fcf3a by Roland Senn at 2020-03-25T05:44:28-04:00
Use export list of Main module in function TcRnDriver.hs:check_main (Fix #16453)

- Provide the export list of the `Main` module as parameter to the
  `compiler/typecheck/TcRnDriver.hs:check_main` function.
- Instead of `lookupOccRn_maybe` call the function `lookupInfoOccRn`.
  It returns the list `mains_all` of all the main functions in scope.
- Select from this list `mains_all` all `main` functions that are in
  the export list of the `Main` module.
- If this new list contains exactly one single `main` function, then
  typechecking continues.
- Otherwise issue an appropriate error message.

- - - - -
1e312fd9 by Sebastian Graf at 2020-03-25T05:44:29-04:00
Remove -fkill-absence and -fkill-one-shot flags

They seem to be a benchmarking vestige of the Cardinality paper and
probably shouldn't have been merged to HEAD in the first place.

- - - - -


25 changed files:

- compiler/GHC/Core/Op/DmdAnal.hs
- compiler/GHC/Driver/Session.hs
- compiler/basicTypes/Demand.hs
- compiler/typecheck/TcExpr.hs
- compiler/typecheck/TcRnDriver.hs
- libraries/base/Data/Semigroup.hs
- + testsuite/tests/typecheck/should_fail/T16453E1.hs
- + testsuite/tests/typecheck/should_fail/T16453E1.stderr
- + testsuite/tests/typecheck/should_fail/T16453E2.hs
- + testsuite/tests/typecheck/should_fail/T16453E2.stderr
- + testsuite/tests/typecheck/should_fail/T16453S.hs
- + testsuite/tests/typecheck/should_fail/T16453T.hs
- testsuite/tests/typecheck/should_fail/all.T
- + testsuite/tests/typecheck/should_run/T16453M0.hs
- + testsuite/tests/typecheck/should_run/T16453M0.stdout
- + testsuite/tests/typecheck/should_run/T16453M1.hs
- + testsuite/tests/typecheck/should_run/T16453M1.stdout
- + testsuite/tests/typecheck/should_run/T16453M2.hs
- + testsuite/tests/typecheck/should_run/T16453M2.stdout
- + testsuite/tests/typecheck/should_run/T16453M3.hs
- + testsuite/tests/typecheck/should_run/T16453M3.stdout
- + testsuite/tests/typecheck/should_run/T16453M4.hs
- + testsuite/tests/typecheck/should_run/T16453M4.stdout
- + testsuite/tests/typecheck/should_run/T16453T.hs
- testsuite/tests/typecheck/should_run/all.T


Changes:

=====================================
compiler/GHC/Core/Op/DmdAnal.hs
=====================================
@@ -603,7 +603,7 @@ dmdAnalRhsLetDown rec_flag env let_dmd id rhs
     -- TODO: Won't the following line unnecessarily trim down arity for join
     --       points returning a lambda in a C(S) context?
     sig            = mkStrictSigForArity rhs_arity (mkDmdType sig_fv rhs_dmds rhs_div)
-    id'            = set_idStrictness env id sig
+    id'            = setIdStrictness id sig
         -- See Note [NOINLINE and strictness]
 
 
@@ -1171,8 +1171,7 @@ findBndrDmd :: AnalEnv -> Bool -> DmdType -> Id -> (DmdType, Demand)
 findBndrDmd env arg_of_dfun dmd_ty id
   = (dmd_ty', dmd')
   where
-    dmd' = killUsageDemand (ae_dflags env) $
-           strictify $
+    dmd' = strictify $
            trimToType starting_dmd (findTypeShape fam_envs id_ty)
 
     (dmd_ty', starting_dmd) = peelFV dmd_ty id
@@ -1191,10 +1190,6 @@ findBndrDmd env arg_of_dfun dmd_ty id
 
     fam_envs = ae_fam_envs env
 
-set_idStrictness :: AnalEnv -> Id -> StrictSig -> Id
-set_idStrictness env id sig
-  = setIdStrictness id (killUsageSig (ae_dflags env) sig)
-
 {- Note [Initialising strictness]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 See section 9.2 (Finding fixpoints) of the paper.


=====================================
compiler/GHC/Driver/Session.hs
=====================================
@@ -3568,8 +3568,6 @@ fFlagsDeps = [
   flagGhciSpec "implicit-import-qualified"    Opt_ImplicitImportQualified,
   flagSpec "irrefutable-tuples"               Opt_IrrefutableTuples,
   flagSpec "keep-going"                       Opt_KeepGoing,
-  flagSpec "kill-absence"                     Opt_KillAbsence,
-  flagSpec "kill-one-shot"                    Opt_KillOneShot,
   flagSpec "late-dmd-anal"                    Opt_LateDmdAnal,
   flagSpec "late-specialise"                  Opt_LateSpecialise,
   flagSpec "liberate-case"                    Opt_LiberateCase,


=====================================
compiler/basicTypes/Demand.hs
=====================================
@@ -50,7 +50,7 @@ module Demand (
         TypeShape(..), peelTsFuns, trimToType,
 
         useCount, isUsedOnce, reuseEnv,
-        killUsageDemand, killUsageSig, zapUsageDemand, zapUsageEnvSig,
+        zapUsageDemand, zapUsageEnvSig,
         zapUsedOnceDemand, zapUsedOnceSig,
         strictifyDictDmd, strictifyDmd
 
@@ -60,7 +60,6 @@ module Demand (
 
 import GhcPrelude
 
-import GHC.Driver.Session
 import Outputable
 import Var ( Var )
 import VarEnv
@@ -1754,14 +1753,6 @@ that it is going to diverge. This is the reason why we use the
 function appIsBottom, which, given a strictness signature and a number
 of arguments, says conservatively if the function is going to diverge
 or not.
-
-Zap absence or one-shot information, under control of flags
-
-Note [Killing usage information]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The flags -fkill-one-shot and -fkill-absence let you switch off the generation
-of absence or one-shot information altogether.  This is only used for performance
-tests, to see how important they are.
 -}
 
 zapUsageEnvSig :: StrictSig -> StrictSig
@@ -1790,34 +1781,12 @@ zapUsedOnceSig :: StrictSig -> StrictSig
 zapUsedOnceSig (StrictSig (DmdType env ds r))
     = StrictSig (DmdType env (map zapUsedOnceDemand ds) r)
 
-killUsageDemand :: DynFlags -> Demand -> Demand
--- See Note [Killing usage information]
-killUsageDemand dflags dmd
-  | Just kfs <- killFlags dflags = kill_usage kfs dmd
-  | otherwise                    = dmd
-
-killUsageSig :: DynFlags -> StrictSig -> StrictSig
--- See Note [Killing usage information]
-killUsageSig dflags sig@(StrictSig (DmdType env ds r))
-  | Just kfs <- killFlags dflags = StrictSig (DmdType env (map (kill_usage kfs) ds) r)
-  | otherwise                    = sig
-
 data KillFlags = KillFlags
     { kf_abs         :: Bool
     , kf_used_once   :: Bool
     , kf_called_once :: Bool
     }
 
-killFlags :: DynFlags -> Maybe KillFlags
--- See Note [Killing usage information]
-killFlags dflags
-  | not kf_abs && not kf_used_once = Nothing
-  | otherwise                      = Just (KillFlags {..})
-  where
-    kf_abs         = gopt Opt_KillAbsence dflags
-    kf_used_once   = gopt Opt_KillOneShot dflags
-    kf_called_once = kf_used_once
-
 kill_usage :: KillFlags -> Demand -> Demand
 kill_usage kfs (JD {sd = s, ud = u}) = JD {sd = s, ud = zap_musg kfs u}
 


=====================================
compiler/typecheck/TcExpr.hs
=====================================
@@ -17,6 +17,7 @@ module TcExpr ( tcPolyExpr, tcMonoExpr, tcMonoExprNC,
                 tcSyntaxOp, tcSyntaxOpGen, SyntaxOpType(..), synKnownType,
                 tcCheckId,
                 addExprErrCtxt,
+                addAmbiguousNameErr,
                 getFixedTyVars ) where
 
 #include "HsVersions.h"
@@ -2193,10 +2194,16 @@ disambiguateSelector lr@(L _ rdr) parent_type
 -- occurrence" error, then give up.
 ambiguousSelector :: Located RdrName -> TcM a
 ambiguousSelector (L _ rdr)
+  = do { addAmbiguousNameErr rdr
+       ; failM }
+
+-- | This name really is ambiguous, so add a suitable "ambiguous
+-- occurrence" error, then continue
+addAmbiguousNameErr :: RdrName -> TcM ()
+addAmbiguousNameErr rdr
   = do { env <- getGlobalRdrEnv
        ; let gres = lookupGRE_RdrName rdr env
-       ; setErrCtxt [] $ addNameClashErrRn rdr gres
-       ; failM }
+       ; setErrCtxt [] $ addNameClashErrRn rdr gres}
 
 -- Disambiguate the fields in a record update.
 -- See Note [Disambiguating record fields]


=====================================
compiler/typecheck/TcRnDriver.hs
=====================================
@@ -129,7 +129,7 @@ import GHC.Core.Class
 import BasicTypes hiding( SuccessFlag(..) )
 import GHC.Core.Coercion.Axiom
 import Annotations
-import Data.List ( sortBy, sort )
+import Data.List ( find, sortBy, sort )
 import Data.Ord
 import FastString
 import Maybes
@@ -268,17 +268,13 @@ tcRnModuleTcRnM hsc_env mod_sum
                ; tcg_env <- if isHsBootOrSig hsc_src
                             then tcRnHsBootDecls hsc_src local_decls
                             else {-# SCC "tcRnSrcDecls" #-}
-                                 tcRnSrcDecls explicit_mod_hdr local_decls
+                                 tcRnSrcDecls explicit_mod_hdr local_decls export_ies
                ; setGblEnv tcg_env
                  $ do { -- Process the export list
                         traceRn "rn4a: before exports" empty
                       ; tcg_env <- tcRnExports explicit_mod_hdr export_ies
                                      tcg_env
                       ; traceRn "rn4b: after exports" empty
-                      ; -- When a module header is specified,
-                        -- check that the main module exports a main function.
-                        -- (must be after tcRnExports)
-                        when explicit_mod_hdr $ checkMainExported tcg_env
                       ; -- Compare hi-boot iface (if any) with the real thing
                         -- Must be done after processing the exports
                         tcg_env <- checkHiBootIface tcg_env boot_info
@@ -400,8 +396,9 @@ tcRnImports hsc_env import_decls
 
 tcRnSrcDecls :: Bool  -- False => no 'module M(..) where' header at all
              -> [LHsDecl GhcPs]               -- Declarations
+             -> Maybe (Located [LIE GhcPs])
              -> TcM TcGblEnv
-tcRnSrcDecls explicit_mod_hdr decls
+tcRnSrcDecls explicit_mod_hdr decls export_ies
  = do { -- Do all the declarations
       ; (tcg_env, tcl_env, lie) <- tc_rn_src_decls decls
 
@@ -410,7 +407,7 @@ tcRnSrcDecls explicit_mod_hdr decls
         -- NB: always set envs *before* captureTopConstraints
       ; (tcg_env, lie_main) <- setEnvs (tcg_env, tcl_env) $
                                captureTopConstraints $
-                               checkMain explicit_mod_hdr
+                               checkMain explicit_mod_hdr export_ies
 
       ; setEnvs (tcg_env, tcl_env) $ do {
 
@@ -1719,29 +1716,69 @@ tcTyClsInstDecls tycl_decls deriv_decls binds
 -}
 
 checkMain :: Bool  -- False => no 'module M(..) where' header at all
+          -> Maybe (Located [LIE GhcPs])  -- Export specs of Main module
           -> TcM TcGblEnv
--- If we are in module Main, check that 'main' is defined.
-checkMain explicit_mod_hdr
+-- If we are in module Main, check that 'main' is defined and exported.
+checkMain explicit_mod_hdr export_ies
  = do   { dflags  <- getDynFlags
         ; tcg_env <- getGblEnv
-        ; check_main dflags tcg_env explicit_mod_hdr }
+        ; check_main dflags tcg_env explicit_mod_hdr export_ies }
 
-check_main :: DynFlags -> TcGblEnv -> Bool -> TcM TcGblEnv
-check_main dflags tcg_env explicit_mod_hdr
+check_main :: DynFlags -> TcGblEnv -> Bool -> Maybe (Located [LIE GhcPs])
+           -> TcM TcGblEnv
+check_main dflags tcg_env explicit_mod_hdr export_ies
  | mod /= main_mod
  = traceTc "checkMain not" (ppr main_mod <+> ppr mod) >>
    return tcg_env
 
  | otherwise
- = do   { mb_main <- lookupGlobalOccRn_maybe main_fn
-                -- Check that 'main' is in scope
-                -- It might be imported from another module!
-        ; case mb_main of {
-             Nothing -> do { traceTc "checkMain fail" (ppr main_mod <+> ppr main_fn)
-                           ; complain_no_main
-                           ; return tcg_env } ;
-             Just main_name -> do
+   -- Compare the list of main functions in scope with those
+   --   specified in the export list.
+ = do mains_all <- lookupInfoOccRn main_fn
+                    -- get all 'main' functions in scope
+                    -- They may also be imported from other modules!
+      case exportedMains of -- check the main(s) specified in the export list
+        [ ] -> do
+          -- The module has no main functions in the export spec, so we must give
+          -- some kind of error message. The tricky part is giving an error message
+          -- that accurately characterizes what the problem is.
+          -- See Note [Main module without a main function in the export spec]
+          traceTc "checkMain no main module exported" ppr_mod_mainfn
+          complain_no_main
+          -- In order to reduce the number of potential error messages, we check
+          -- to see if there are any main functions defined (but not exported)...
+          case getSomeMain mains_all of
+            Nothing -> return tcg_env
+              -- ...if there are no such main functions, there is nothing we can do...
+            Just some_main -> use_as_main some_main
+                -- ...if there is such a main function, then communicate this to the
+                -- typechecker. This can prevent a spurious "Ambiguous type variable"
+                -- error message in certain cases, as described in
+                -- Note [Main module without a main function in the export spec].
+        _ -> do    -- The module has one or more main functions in the export spec
+          let mains = filterInsMains exportedMains mains_all
+          case mains of
+            [] -> do  --
+              traceTc "checkMain fail" ppr_mod_mainfn
+              complain_no_main
+              return tcg_env
+            [main_name] -> use_as_main main_name
+            _ -> do           -- multiple main functions are exported
+              addAmbiguousNameErr main_fn          -- issue error msg
+              return tcg_env
+  where
+    mod         = tcg_mod tcg_env
+    main_mod    = mainModIs dflags
+    main_mod_nm = moduleName main_mod
+    main_fn     = getMainFun dflags
+    occ_main_fn = occName main_fn
+    interactive = ghcLink dflags == LinkInMemory
+    exportedMains = selExportMains export_ies
+    ppr_mod_mainfn = ppr main_mod <+> ppr main_fn
 
+    -- There is a single exported 'main' function.
+    use_as_main :: Name -> TcM TcGblEnv
+    use_as_main main_name = do
         { traceTc "checkMain found" (ppr main_mod <+> ppr main_fn)
         ; let loc       = srcLocSpan (getSrcLoc main_name)
         ; ioTyCon <- tcLookupTyCon ioTyConName
@@ -1779,13 +1816,7 @@ check_main dflags tcg_env explicit_mod_hdr
                                         `plusDU` usesOnly (unitFV main_name)
                         -- Record the use of 'main', so that we don't
                         -- complain about it being defined but not used
-                 })
-    }}}
-  where
-    mod         = tcg_mod tcg_env
-    main_mod    = mainModIs dflags
-    main_fn     = getMainFun dflags
-    interactive = ghcLink dflags == LinkInMemory
+        })}
 
     complain_no_main = unless (interactive && not explicit_mod_hdr)
                               (addErrTc noMainMsg)                  -- #12906
@@ -1795,9 +1826,56 @@ check_main dflags tcg_env explicit_mod_hdr
 
     mainCtxt  = text "When checking the type of the" <+> pp_main_fn
     noMainMsg = text "The" <+> pp_main_fn
-                <+> text "is not defined in module" <+> quotes (ppr main_mod)
+                <+> text "is not" <+> text defOrExp <+> text "module"
+                <+> quotes (ppr main_mod)
+    defOrExp  = if null exportedMains then "exported by" else "defined in"
+
     pp_main_fn = ppMainFn main_fn
 
+    -- Select the main functions from the export list.
+    -- Only the module name is needed, the function name is fixed.
+    selExportMains :: Maybe (Located [LIE GhcPs]) -> [ModuleName]    -- #16453
+    selExportMains Nothing = [main_mod_nm]
+        -- no main specified, but there is a header.
+    selExportMains (Just exps) = fmap fst $
+        filter (\(_,n) -> n == occ_main_fn ) texp
+      where
+        ies = fmap unLoc $ unLoc exps
+        texp = mapMaybe transExportIE ies
+
+    -- Filter all main functions in scope that match the export specs
+    filterInsMains :: [ModuleName] -> [Name] -> [Name]               -- #16453
+    filterInsMains export_mains inscope_mains =
+      [mod | mod <- inscope_mains,
+          (moduleName . nameModule) mod `elem` export_mains]
+
+    -- Transform an export_ie to a (ModuleName, OccName) pair.
+    -- 'IEVar' constructors contain exported values (functions), eg '(Main.main)'
+    -- 'IEModuleContents' constructors contain fully exported modules, eg '(Main)'
+    -- All other 'IE...' constructors are not used and transformed to Nothing.
+    transExportIE :: IE GhcPs -> Maybe (ModuleName, OccName)         -- #16453
+    transExportIE (IEVar _  var) = isQual_maybe $
+         upqual $ ieWrappedName $ unLoc var
+       where
+         -- A module name is always needed, so qualify 'UnQual' rdr names.
+         upqual (Unqual occ) = Qual main_mod_nm occ
+         upqual rdr = rdr
+    transExportIE (IEModuleContents _ mod) = Just (unLoc mod, occ_main_fn)
+    transExportIE _ = Nothing
+
+    -- Get a main function that is in scope.
+    -- See Note [Main module without a main function in the export spec]
+    getSomeMain :: [Name] -> Maybe Name                            -- #16453
+    getSomeMain all_mains = case all_mains of
+        []  -> Nothing                -- No main function in scope
+        [m] -> Just m                 -- Just one main function in scope
+        _   -> case mbMainOfMain of
+          Nothing -> listToMaybe all_mains -- Take the first main function in scope or Nothing
+          _       -> mbMainOfMain          -- Take the Main module's main function or Nothing
+      where
+        mbMainOfMain = find (\n -> (moduleName . nameModule) n == main_mod_nm )
+                          all_mains         -- the main function of the Main module
+
 -- | Get the unqualified name of the function to use as the \"main\" for the main module.
 -- Either returns the default name or the one configured on the command line with -main-is
 getMainFun :: DynFlags -> RdrName
@@ -1805,19 +1883,6 @@ getMainFun dflags = case mainFunIs dflags of
                       Just fn -> mkRdrUnqual (mkVarOccFS (mkFastString fn))
                       Nothing -> main_RDR_Unqual
 
--- If we are in module Main, check that 'main' is exported.
-checkMainExported :: TcGblEnv -> TcM ()
-checkMainExported tcg_env
-  = case tcg_main tcg_env of
-      Nothing -> return () -- not the main module
-      Just main_name ->
-         do { dflags <- getDynFlags
-            ; let main_mod = mainModIs dflags
-            ; checkTc (main_name `elem`
-                           concatMap availNames (tcg_exports tcg_env)) $
-                text "The" <+> ppMainFn (nameRdrName main_name) <+>
-                text "is not exported by module" <+> quotes (ppr main_mod) }
-
 ppMainFn :: RdrName -> SDoc
 ppMainFn main_fn
   | rdrNameOcc main_fn == mainOcc
@@ -1842,6 +1907,53 @@ module. Tiresomely, we must filter it out again in GHC.Iface.Make, less we
 get two defns for 'main' in the interface file!
 
 
+Note [Main module without a main function in the export spec]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Giving accurate error messages for a Main module that does not export a main
+function is surprisingly tricky. To see why, consider a module in a file
+`Foo.hs` that has no `main` function in the explicit export specs of the module
+header:
+
+    module Main () where
+    foo = return ()
+
+This does not export a main function and therefore should be rejected, per
+chapter 5 of the Haskell Report 2010:
+
+   A Haskell program is a collection of modules, one of which, by convention,
+   must be called Main and must export the value main. The value of the
+   program is the value of the identifier main in module Main, which must be
+   a computation of type IO τ for some type τ.
+
+In fact, when you compile the program above using `ghc Foo.hs`, you will
+actually get *two* errors:
+
+ - The IO action ‘main’ is not defined in module ‘Main’
+
+ - Ambiguous type variable ‘m0’ arising from a use of ‘return’
+   prevents the constraint ‘(Monad m0)’ from being solved.
+
+The first error is self-explanatory, while the second error message occurs
+due to the monomorphism restriction.
+
+Now consider what would happen if the program above were compiled with
+`ghc -main-is foo Foo`. The has the effect of `foo` being designated as the
+main function. The program will still be rejected since it does not export
+`foo` (and therefore does not export its main function), but there is one
+important difference: `foo` will be checked against the type `IO τ`. As a
+result, we would *not* expect the monomorphism restriction error message
+to occur, since the typechecker should have no trouble figuring out the type
+of `foo`. In other words, we should only throw the former error message,
+not the latter.
+
+The implementation uses the function `getSomeMain` to find a potential main
+function that is defined but not exported. If one is found, it is passed to
+`use_as_main` to inform the typechecker that the main function should be of
+type `IO τ`. See also the `T414` and `T17171a` test cases for similar examples
+of programs whose error messages are influenced by the situation described in
+this Note.
+
+
 *********************************************************
 *                                                       *
                 GHCi stuff
@@ -2574,7 +2686,7 @@ tcRnDeclsi :: HscEnv
            -> IO (Messages, Maybe TcGblEnv)
 tcRnDeclsi hsc_env local_decls
   = runTcInteractive hsc_env $
-    tcRnSrcDecls False local_decls
+    tcRnSrcDecls False local_decls Nothing
 
 externaliseAndTidyId :: Module -> Id -> TcM Id
 externaliseAndTidyId this_mod id


=====================================
libraries/base/Data/Semigroup.hs
=====================================
@@ -286,7 +286,15 @@ instance Num a => Num (Max a) where
 
 -- | 'Arg' isn't itself a 'Semigroup' in its own right, but it can be
 -- placed inside 'Min' and 'Max' to compute an arg min or arg max.
-data Arg a b = Arg a b deriving
+--
+-- >>> minimum [ Arg (x * x) x | x <- [-10 .. 10] ]
+-- Arg 0 0
+data Arg a b = Arg
+  a
+  -- ^ The argument used for comparisons in 'Eq' and 'Ord'.
+  b
+  -- ^ The "value" exposed via the 'Functor', 'Foldable' etc. instances.
+  deriving
   ( Show     -- ^ @since 4.9.0.0
   , Read     -- ^ @since 4.9.0.0
   , Data     -- ^ @since 4.9.0.0


=====================================
testsuite/tests/typecheck/should_fail/T16453E1.hs
=====================================
@@ -0,0 +1,2 @@
+module Main where
+import T16453T


=====================================
testsuite/tests/typecheck/should_fail/T16453E1.stderr
=====================================
@@ -0,0 +1,2 @@
+T16453E1.hs:1:1: error:
+    The IO action ‘main’ is not defined in module ‘Main’


=====================================
testsuite/tests/typecheck/should_fail/T16453E2.hs
=====================================
@@ -0,0 +1,3 @@
+module Main (T16453T.main, T16453S.main) where
+import T16453T
+import T16453S


=====================================
testsuite/tests/typecheck/should_fail/T16453E2.stderr
=====================================
@@ -0,0 +1,9 @@
+T16453E2.hs:1:1:
+    Ambiguous occurrence ‘main’
+    It could refer to
+       either ‘T16453T.main’,
+              imported from ‘T16453T’ at T16453E2.hs:2:1-14
+              (and originally defined at T16453T.hs:2:1-4)
+           or ‘T16453S.main’,
+              imported from ‘T16453S’ at T16453E2.hs:3:1-14
+              (and originally defined at T16453S.hs:2:1-4)


=====================================
testsuite/tests/typecheck/should_fail/T16453S.hs
=====================================
@@ -0,0 +1,2 @@
+module T16453S where
+main = putStrLn "T16453S"


=====================================
testsuite/tests/typecheck/should_fail/T16453T.hs
=====================================
@@ -0,0 +1,2 @@
+module T16453T where
+main = putStrLn "T16453T"


=====================================
testsuite/tests/typecheck/should_fail/all.T
=====================================
@@ -516,6 +516,10 @@ test('T16255', normal, compile_fail, [''])
 test('T16204c', normal, compile_fail, [''])
 test('T16394', normal, compile_fail, [''])
 test('T16414', normal, compile_fail, [''])
+test('T16453E1', extra_files(['T16453T.hs', 'T16453S.hs']), multimod_compile_fail,
+    ['T16453E1.hs', '-v0'])
+test('T16453E2', extra_files(['T16453T.hs', 'T16453S.hs']),
+    multimod_compile_fail, ['T16453E2.hs', '-v0'])
 test('T16456', normal, compile_fail, ['-fprint-explicit-foralls'])
 test('T16627', normal, compile_fail, [''])
 test('T502', normal, compile_fail, [''])


=====================================
testsuite/tests/typecheck/should_run/T16453M0.hs
=====================================
@@ -0,0 +1,3 @@
+module Main where
+import T16453T
+main = putStrLn "T16453M0"


=====================================
testsuite/tests/typecheck/should_run/T16453M0.stdout
=====================================
@@ -0,0 +1 @@
+T16453M0


=====================================
testsuite/tests/typecheck/should_run/T16453M1.hs
=====================================
@@ -0,0 +1,3 @@
+module Main (T16453T.main)  where
+import T16453T
+main = putStrLn "T16453M1"


=====================================
testsuite/tests/typecheck/should_run/T16453M1.stdout
=====================================
@@ -0,0 +1 @@
+T16453T


=====================================
testsuite/tests/typecheck/should_run/T16453M2.hs
=====================================
@@ -0,0 +1,3 @@
+module Main (Main.main)  where
+import T16453T
+main = putStrLn "T16453M2"


=====================================
testsuite/tests/typecheck/should_run/T16453M2.stdout
=====================================
@@ -0,0 +1 @@
+T16453M2


=====================================
testsuite/tests/typecheck/should_run/T16453M3.hs
=====================================
@@ -0,0 +1,3 @@
+module Main (module Main)  where
+import T16453T
+main = putStrLn "T16453M3"


=====================================
testsuite/tests/typecheck/should_run/T16453M3.stdout
=====================================
@@ -0,0 +1 @@
+T16453M3


=====================================
testsuite/tests/typecheck/should_run/T16453M4.hs
=====================================
@@ -0,0 +1,3 @@
+module Main (module T16453T)  where
+import T16453T
+main = putStrLn "T16453M4"


=====================================
testsuite/tests/typecheck/should_run/T16453M4.stdout
=====================================
@@ -0,0 +1 @@
+T16453T


=====================================
testsuite/tests/typecheck/should_run/T16453T.hs
=====================================
@@ -0,0 +1,2 @@
+module T16453T where
+main = putStrLn "T16453T"


=====================================
testsuite/tests/typecheck/should_run/all.T
=====================================
@@ -135,6 +135,11 @@ test('T14218', normal, compile_and_run, [''])
 test('T14236', normal, compile_and_run, [''])
 test('T14925', normal, compile_and_run, [''])
 test('T14341', normal, compile_and_run, [''])
+test('T16453M0', extra_files(['T16453T.hs']), compile_and_run, [''])
+test('T16453M1', extra_files(['T16453T.hs']), compile_and_run, [''])
+test('T16453M2', extra_files(['T16453T.hs']), compile_and_run, [''])
+test('T16453M3', extra_files(['T16453T.hs']), compile_and_run, [''])
+test('T16453M4', extra_files(['T16453T.hs']), compile_and_run, [''])
 test('UnliftedNewtypesRun', normal, compile_and_run, [''])
 test('UnliftedNewtypesFamilyRun', normal, compile_and_run, [''])
 test('UnliftedNewtypesDependentFamilyRun', normal, compile_and_run, [''])



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/cc480cdcca610621429ca091869af10be8f415f7...1e312fd9c84eb9c49f4d468ff45be79065f2a7be

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/cc480cdcca610621429ca091869af10be8f415f7...1e312fd9c84eb9c49f4d468ff45be79065f2a7be
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20200325/27648d90/attachment-0001.html>


More information about the ghc-commits mailing list