diff options
-rw-r--r-- | compiler/main/CmdLineParser.hs | 28 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 1186 | ||||
-rw-r--r-- | compiler/main/StaticFlags.hs | 8 | ||||
-rw-r--r-- | compiler/typecheck/TcDeriv.lhs | 2 | ||||
-rw-r--r-- | ghc/InteractiveUI.hs | 22 | ||||
-rw-r--r-- | ghc/Main.hs | 89 | ||||
-rw-r--r-- | testsuite/tests/driver/T4437.hs | 2 |
7 files changed, 706 insertions, 631 deletions
diff --git a/compiler/main/CmdLineParser.hs b/compiler/main/CmdLineParser.hs index a4b9118f9d..561765e106 100644 --- a/compiler/main/CmdLineParser.hs +++ b/compiler/main/CmdLineParser.hs @@ -13,9 +13,9 @@ module CmdLineParser ( - processArgs, OptKind(..), + processArgs, OptKind(..), GhcFlagMode(..), CmdLineP(..), getCmdLineState, putCmdLineState, - Flag(..), + Flag(..), defFlag, defGhcFlag, defGhciFlag, defHiddenFlag, errorsToGhcException, EwM, addErr, addWarn, getArg, getCurLoc, liftEwM, deprecate @@ -42,10 +42,30 @@ import Control.Applicative (Applicative(..)) -------------------------------------------------------- data Flag m = Flag - { flagName :: String, -- Flag, without the leading "-" - flagOptKind :: OptKind m -- What to do if we see it + { flagName :: String, -- Flag, without the leading "-" + flagOptKind :: OptKind m, -- What to do if we see it + flagGhcMode :: GhcFlagMode -- Which modes this flag affects } +defFlag :: String -> OptKind m -> Flag m +defFlag name optKind = Flag name optKind AllModes + +defGhcFlag :: String -> OptKind m -> Flag m +defGhcFlag name optKind = Flag name optKind OnlyGhc + +defGhciFlag :: String -> OptKind m -> Flag m +defGhciFlag name optKind = Flag name optKind OnlyGhci + +defHiddenFlag :: String -> OptKind m -> Flag m +defHiddenFlag name optKind = Flag name optKind HiddenFlag + +-- | GHC flag modes describing when a flag has an effect. +data GhcFlagMode + = OnlyGhc -- ^ The flag only affects the non-interactive GHC + | OnlyGhci -- ^ The flag only affects the interactive GHC + | AllModes -- ^ The flag affects multiple ghc modes + | HiddenFlag -- ^ This flag should not be seen in cli completion + data OptKind m -- Suppose the flag is -f = NoArg (EwM m ()) -- -f all by itself | HasArg (String -> EwM m ()) -- -farg or -f arg diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 9105d7ff82..ebe2aa9af0 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -37,6 +37,7 @@ module DynFlags ( whenCannotGenerateDynamicToo, dynamicTooMkDynamicDynFlags, DynFlags(..), + FlagSpec(..), HasDynFlags(..), ContainsDynFlags(..), RtsOptsEnabled(..), HscTarget(..), isObjectTarget, defaultObjectTarget, @@ -101,6 +102,7 @@ module DynFlags ( flagsAll, flagsDynamic, flagsPackage, + flagsForCompletion, supportedLanguagesAndExtensions, languageExtensions, @@ -210,6 +212,18 @@ import GHC.Foreign (withCString, peekCString) -- * Flag description in docs/users_guide/using.xml provides a detailed -- explanation of flags' usage. +-- Note [Supporting CLI completion] +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- +-- The command line interface completion (in for example bash) is an easy way +-- for the developer to learn what flags are available from GHC. +-- GHC helps by separating which flags are available when compiling with GHC, +-- and which flags are available when using GHCi. +-- A flag is assumed to either work in both these modes, or only in one of them. +-- When adding or changing a flag, please consider for which mode the flag will +-- have effect, and annotate it accordingly. For Flags use defFlag, defGhcFlag, +-- defGhciFlag, and for FlagSpec use flagSpec or flagGhciSpec. + -- ----------------------------------------------------------------------------- -- DynFlags @@ -2149,17 +2163,11 @@ safeFlagCheck cmdl dflags = -- | All dynamic flags option strings. These are the user facing strings for -- enabling and disabling options. allFlags :: [String] -allFlags = map ('-':) $ - [ flagName flag | flag <- dynamic_flags ++ package_flags, ok (flagOptKind flag) ] ++ - map ("fno-"++) fflags ++ - map ("f"++) fflags ++ - map ("X"++) supportedExtensions - where ok (PrefixPred _ _) = False - ok _ = True - fflags = fflags0 ++ fflags1 ++ fflags2 - fflags0 = [ name | (name, _, _) <- fFlags ] - fflags1 = [ name | (name, _, _) <- fWarningFlags ] - fflags2 = [ name | (name, _, _) <- fLangFlags ] +allFlags = [ '-':flagName flag + | flag <- flagsAll + , ok (flagOptKind flag) ] + where ok (PrefixPred _ _) = False + ok _ = True {- - Below we export user facing symbols for GHC dynamic flags for use with the @@ -2180,44 +2188,45 @@ flagsPackage = package_flags --------------- The main flags themselves ------------------ -- See Note [Updating flag description in the User's Guide] +-- See Note [Supporting CLI completion] dynamic_flags :: [Flag (CmdLineP DynFlags)] dynamic_flags = [ - Flag "n" (NoArg (addWarn "The -n flag is deprecated and no longer has any effect")) - , Flag "cpp" (NoArg (setExtensionFlag Opt_Cpp)) - , Flag "F" (NoArg (setGeneralFlag Opt_Pp)) - , Flag "#include" + defFlag "n" (NoArg (addWarn "The -n flag is deprecated and no longer has any effect")) + , defFlag "cpp" (NoArg (setExtensionFlag Opt_Cpp)) + , defFlag "F" (NoArg (setGeneralFlag Opt_Pp)) + , defFlag "#include" (HasArg (\s -> do addCmdlineHCInclude s addWarn "-#include and INCLUDE pragmas are deprecated: They no longer have any effect")) - , Flag "v" (OptIntSuffix setVerbosity) + , defFlag "v" (OptIntSuffix setVerbosity) - , Flag "j" (OptIntSuffix (\n -> upd (\d -> d {parMakeCount = n}))) - , Flag "sig-of" (sepArg setSigOf) + , defGhcFlag "j" (OptIntSuffix (\n -> upd (\d -> d {parMakeCount = n}))) + , defFlag "sig-of" (sepArg setSigOf) -- RTS options ------------------------------------------------------------- - , Flag "H" (HasArg (\s -> upd (\d -> + , defFlag "H" (HasArg (\s -> upd (\d -> d { ghcHeapSize = Just $ fromIntegral (decodeSize s)}))) - , Flag "Rghc-timing" (NoArg (upd (\d -> d { enableTimeStats = True }))) + , defFlag "Rghc-timing" (NoArg (upd (\d -> d { enableTimeStats = True }))) ------- ways --------------------------------------------------------------- - , Flag "prof" (NoArg (addWay WayProf)) - , Flag "eventlog" (NoArg (addWay WayEventLog)) - , Flag "parallel" (NoArg (addWay WayPar)) - , Flag "gransim" (NoArg (addWay WayGran)) - , Flag "smp" (NoArg (addWay WayThreaded >> deprecate "Use -threaded instead")) - , Flag "debug" (NoArg (addWay WayDebug)) - , Flag "ndp" (NoArg (addWay WayNDP)) - , Flag "threaded" (NoArg (addWay WayThreaded)) + , defGhcFlag "prof" (NoArg (addWay WayProf)) + , defGhcFlag "eventlog" (NoArg (addWay WayEventLog)) + , defGhcFlag "parallel" (NoArg (addWay WayPar)) + , defGhcFlag "gransim" (NoArg (addWay WayGran)) + , defGhcFlag "smp" (NoArg (addWay WayThreaded >> deprecate "Use -threaded instead")) + , defGhcFlag "debug" (NoArg (addWay WayDebug)) + , defGhcFlag "ndp" (NoArg (addWay WayNDP)) + , defGhcFlag "threaded" (NoArg (addWay WayThreaded)) - , Flag "ticky" (NoArg (setGeneralFlag Opt_Ticky >> addWay WayDebug)) + , defGhcFlag "ticky" (NoArg (setGeneralFlag Opt_Ticky >> addWay WayDebug)) -- -ticky enables ticky-ticky code generation, and also implies -debug which -- is required to get the RTS ticky support. ----- Linker -------------------------------------------------------- - , Flag "static" (NoArg removeWayDyn) - , Flag "dynamic" (NoArg (addWay WayDyn)) - , Flag "rdynamic" $ noArg $ + , defGhcFlag "static" (NoArg removeWayDyn) + , defGhcFlag "dynamic" (NoArg (addWay WayDyn)) + , defGhcFlag "rdynamic" $ noArg $ #ifdef linux_HOST_OS addOptl "-rdynamic" #elif defined (mingw32_HOST_OS) @@ -2226,328 +2235,331 @@ dynamic_flags = [ -- ignored for compat w/ gcc: id #endif - , Flag "relative-dynlib-paths" (NoArg (setGeneralFlag Opt_RelativeDynlibPaths)) + , defGhcFlag "relative-dynlib-paths" + (NoArg (setGeneralFlag Opt_RelativeDynlibPaths)) ------- Specific phases -------------------------------------------- -- need to appear before -pgmL to be parsed as LLVM flags. - , Flag "pgmlo" (hasArg (\f -> alterSettings (\s -> s { sPgm_lo = (f,[])}))) - , Flag "pgmlc" (hasArg (\f -> alterSettings (\s -> s { sPgm_lc = (f,[])}))) - , Flag "pgmL" (hasArg (\f -> alterSettings (\s -> s { sPgm_L = f}))) - , Flag "pgmP" (hasArg setPgmP) - , Flag "pgmF" (hasArg (\f -> alterSettings (\s -> s { sPgm_F = f}))) - , Flag "pgmc" (hasArg (\f -> alterSettings (\s -> s { sPgm_c = (f,[])}))) - , Flag "pgms" (hasArg (\f -> alterSettings (\s -> s { sPgm_s = (f,[])}))) - , Flag "pgma" (hasArg (\f -> alterSettings (\s -> s { sPgm_a = (f,[])}))) - , Flag "pgml" (hasArg (\f -> alterSettings (\s -> s { sPgm_l = (f,[])}))) - , Flag "pgmdll" (hasArg (\f -> alterSettings (\s -> s { sPgm_dll = (f,[])}))) - , Flag "pgmwindres" (hasArg (\f -> alterSettings (\s -> s { sPgm_windres = f}))) - , Flag "pgmlibtool" (hasArg (\f -> alterSettings (\s -> s { sPgm_libtool = f}))) + , defFlag "pgmlo" (hasArg (\f -> alterSettings (\s -> s { sPgm_lo = (f,[])}))) + , defFlag "pgmlc" (hasArg (\f -> alterSettings (\s -> s { sPgm_lc = (f,[])}))) + , defFlag "pgmL" (hasArg (\f -> alterSettings (\s -> s { sPgm_L = f}))) + , defFlag "pgmP" (hasArg setPgmP) + , defFlag "pgmF" (hasArg (\f -> alterSettings (\s -> s { sPgm_F = f}))) + , defFlag "pgmc" (hasArg (\f -> alterSettings (\s -> s { sPgm_c = (f,[])}))) + , defFlag "pgms" (hasArg (\f -> alterSettings (\s -> s { sPgm_s = (f,[])}))) + , defFlag "pgma" (hasArg (\f -> alterSettings (\s -> s { sPgm_a = (f,[])}))) + , defFlag "pgml" (hasArg (\f -> alterSettings (\s -> s { sPgm_l = (f,[])}))) + , defFlag "pgmdll" (hasArg (\f -> alterSettings (\s -> s { sPgm_dll = (f,[])}))) + , defFlag "pgmwindres" (hasArg (\f -> alterSettings (\s -> s { sPgm_windres = f}))) + , defFlag "pgmlibtool" (hasArg (\f -> alterSettings (\s -> s { sPgm_libtool = f}))) -- need to appear before -optl/-opta to be parsed as LLVM flags. - , Flag "optlo" (hasArg (\f -> alterSettings (\s -> s { sOpt_lo = f : sOpt_lo s}))) - , Flag "optlc" (hasArg (\f -> alterSettings (\s -> s { sOpt_lc = f : sOpt_lc s}))) - , Flag "optL" (hasArg (\f -> alterSettings (\s -> s { sOpt_L = f : sOpt_L s}))) - , Flag "optP" (hasArg addOptP) - , Flag "optF" (hasArg (\f -> alterSettings (\s -> s { sOpt_F = f : sOpt_F s}))) - , Flag "optc" (hasArg addOptc) - , Flag "opta" (hasArg (\f -> alterSettings (\s -> s { sOpt_a = f : sOpt_a s}))) - , Flag "optl" (hasArg addOptl) - , Flag "optwindres" (hasArg (\f -> alterSettings (\s -> s { sOpt_windres = f : sOpt_windres s}))) - - , Flag "split-objs" + , defFlag "optlo" (hasArg (\f -> alterSettings (\s -> s { sOpt_lo = f : sOpt_lo s}))) + , defFlag "optlc" (hasArg (\f -> alterSettings (\s -> s { sOpt_lc = f : sOpt_lc s}))) + , defFlag "optL" (hasArg (\f -> alterSettings (\s -> s { sOpt_L = f : sOpt_L s}))) + , defFlag "optP" (hasArg addOptP) + , defFlag "optF" (hasArg (\f -> alterSettings (\s -> s { sOpt_F = f : sOpt_F s}))) + , defFlag "optc" (hasArg addOptc) + , defFlag "opta" (hasArg (\f -> alterSettings (\s -> s { sOpt_a = f : sOpt_a s}))) + , defFlag "optl" (hasArg addOptl) + , defFlag "optwindres" (hasArg (\f -> alterSettings (\s -> s { sOpt_windres = f : sOpt_windres s}))) + + , defGhcFlag "split-objs" (NoArg (if can_split then setGeneralFlag Opt_SplitObjs else addWarn "ignoring -fsplit-objs")) -------- ghc -M ----------------------------------------------------- - , Flag "dep-suffix" (hasArg addDepSuffix) - , Flag "dep-makefile" (hasArg setDepMakefile) - , Flag "include-pkg-deps" (noArg (setDepIncludePkgDeps True)) - , Flag "exclude-module" (hasArg addDepExcludeMod) + , defGhcFlag "dep-suffix" (hasArg addDepSuffix) + , defGhcFlag "dep-makefile" (hasArg setDepMakefile) + , defGhcFlag "include-pkg-deps" (noArg (setDepIncludePkgDeps True)) + , defGhcFlag "exclude-module" (hasArg addDepExcludeMod) -------- Linking ---------------------------------------------------- - , Flag "no-link" (noArg (\d -> d{ ghcLink=NoLink })) - , Flag "shared" (noArg (\d -> d{ ghcLink=LinkDynLib })) - , Flag "staticlib" (noArg (\d -> d{ ghcLink=LinkStaticLib })) - , Flag "dynload" (hasArg parseDynLibLoaderMode) - , Flag "dylib-install-name" (hasArg setDylibInstallName) + , defGhcFlag "no-link" (noArg (\d -> d{ ghcLink=NoLink })) + , defGhcFlag "shared" (noArg (\d -> d{ ghcLink=LinkDynLib })) + , defGhcFlag "staticlib" (noArg (\d -> d{ ghcLink=LinkStaticLib })) + , defGhcFlag "dynload" (hasArg parseDynLibLoaderMode) + , defGhcFlag "dylib-install-name" (hasArg setDylibInstallName) -- -dll-split is an internal flag, used only during the GHC build - , Flag "dll-split" (hasArg (\f d -> d{ dllSplitFile = Just f, dllSplit = Nothing })) + , defHiddenFlag "dll-split" + (hasArg (\f d -> d{ dllSplitFile = Just f, dllSplit = Nothing })) ------- Libraries --------------------------------------------------- - , Flag "L" (Prefix addLibraryPath) - , Flag "l" (hasArg (addLdInputs . Option . ("-l" ++))) + , defFlag "L" (Prefix addLibraryPath) + , defFlag "l" (hasArg (addLdInputs . Option . ("-l" ++))) ------- Frameworks -------------------------------------------------- -- -framework-path should really be -F ... - , Flag "framework-path" (HasArg addFrameworkPath) - , Flag "framework" (hasArg addCmdlineFramework) + , defFlag "framework-path" (HasArg addFrameworkPath) + , defFlag "framework" (hasArg addCmdlineFramework) ------- Output Redirection ------------------------------------------ - , Flag "odir" (hasArg setObjectDir) - , Flag "o" (sepArg (setOutputFile . Just)) - , Flag "dyno" (sepArg (setDynOutputFile . Just)) - , Flag "ohi" (hasArg (setOutputHi . Just )) - , Flag "osuf" (hasArg setObjectSuf) - , Flag "dynosuf" (hasArg setDynObjectSuf) - , Flag "hcsuf" (hasArg setHcSuf) - , Flag "hisuf" (hasArg setHiSuf) - , Flag "dynhisuf" (hasArg setDynHiSuf) - , Flag "hidir" (hasArg setHiDir) - , Flag "tmpdir" (hasArg setTmpDir) - , Flag "stubdir" (hasArg setStubDir) - , Flag "dumpdir" (hasArg setDumpDir) - , Flag "outputdir" (hasArg setOutputDir) - , Flag "ddump-file-prefix" (hasArg (setDumpPrefixForce . Just)) - - , Flag "dynamic-too" (NoArg (setGeneralFlag Opt_BuildDynamicToo)) + , defGhcFlag "odir" (hasArg setObjectDir) + , defGhcFlag "o" (sepArg (setOutputFile . Just)) + , defGhcFlag "dyno" (sepArg (setDynOutputFile . Just)) + , defGhcFlag "ohi" (hasArg (setOutputHi . Just )) + , defGhcFlag "osuf" (hasArg setObjectSuf) + , defGhcFlag "dynosuf" (hasArg setDynObjectSuf) + , defGhcFlag "hcsuf" (hasArg setHcSuf) + , defGhcFlag "hisuf" (hasArg setHiSuf) + , defGhcFlag "dynhisuf" (hasArg setDynHiSuf) + , defGhcFlag "hidir" (hasArg setHiDir) + , defGhcFlag "tmpdir" (hasArg setTmpDir) + , defGhcFlag "stubdir" (hasArg setStubDir) + , defGhcFlag "dumpdir" (hasArg setDumpDir) + , defGhcFlag "outputdir" (hasArg setOutputDir) + , defGhcFlag "ddump-file-prefix" (hasArg (setDumpPrefixForce . Just)) + + , defGhcFlag "dynamic-too" (NoArg (setGeneralFlag Opt_BuildDynamicToo)) ------- Keeping temporary files ------------------------------------- -- These can be singular (think ghc -c) or plural (think ghc --make) - , Flag "keep-hc-file" (NoArg (setGeneralFlag Opt_KeepHcFiles)) - , Flag "keep-hc-files" (NoArg (setGeneralFlag Opt_KeepHcFiles)) - , Flag "keep-s-file" (NoArg (setGeneralFlag Opt_KeepSFiles)) - , Flag "keep-s-files" (NoArg (setGeneralFlag Opt_KeepSFiles)) - , Flag "keep-llvm-file" (NoArg (do setObjTarget HscLlvm - setGeneralFlag Opt_KeepLlvmFiles)) - , Flag "keep-llvm-files" (NoArg (do setObjTarget HscLlvm - setGeneralFlag Opt_KeepLlvmFiles)) + , defGhcFlag "keep-hc-file" (NoArg (setGeneralFlag Opt_KeepHcFiles)) + , defGhcFlag "keep-hc-files" (NoArg (setGeneralFlag Opt_KeepHcFiles)) + , defGhcFlag "keep-s-file" (NoArg (setGeneralFlag Opt_KeepSFiles)) + , defGhcFlag "keep-s-files" (NoArg (setGeneralFlag Opt_KeepSFiles)) + , defGhcFlag "keep-llvm-file" (NoArg (do setObjTarget HscLlvm + setGeneralFlag Opt_KeepLlvmFiles)) + , defGhcFlag "keep-llvm-files" (NoArg (do setObjTarget HscLlvm + setGeneralFlag Opt_KeepLlvmFiles)) -- This only makes sense as plural - , Flag "keep-tmp-files" (NoArg (setGeneralFlag Opt_KeepTmpFiles)) + , defGhcFlag "keep-tmp-files" (NoArg (setGeneralFlag Opt_KeepTmpFiles)) ------- Miscellaneous ---------------------------------------------- - , Flag "no-auto-link-packages" (NoArg (unSetGeneralFlag Opt_AutoLinkPackages)) - , Flag "no-hs-main" (NoArg (setGeneralFlag Opt_NoHsMain)) - , Flag "with-rtsopts" (HasArg setRtsOpts) - , Flag "rtsopts" (NoArg (setRtsOptsEnabled RtsOptsAll)) - , Flag "rtsopts=all" (NoArg (setRtsOptsEnabled RtsOptsAll)) - , Flag "rtsopts=some" (NoArg (setRtsOptsEnabled RtsOptsSafeOnly)) - , Flag "rtsopts=none" (NoArg (setRtsOptsEnabled RtsOptsNone)) - , Flag "no-rtsopts" (NoArg (setRtsOptsEnabled RtsOptsNone)) - , Flag "main-is" (SepArg setMainIs) - , Flag "haddock" (NoArg (setGeneralFlag Opt_Haddock)) - , Flag "haddock-opts" (hasArg addHaddockOpts) - , Flag "hpcdir" (SepArg setOptHpcDir) - , Flag "ghci-script" (hasArg addGhciScript) - , Flag "interactive-print" (hasArg setInteractivePrint) - , Flag "ticky-allocd" (NoArg (setGeneralFlag Opt_Ticky_Allocd)) - , Flag "ticky-LNE" (NoArg (setGeneralFlag Opt_Ticky_LNE)) - , Flag "ticky-dyn-thunk" (NoArg (setGeneralFlag Opt_Ticky_Dyn_Thunk)) + , defGhcFlag "no-auto-link-packages" (NoArg (unSetGeneralFlag Opt_AutoLinkPackages)) + , defGhcFlag "no-hs-main" (NoArg (setGeneralFlag Opt_NoHsMain)) + , defGhcFlag "with-rtsopts" (HasArg setRtsOpts) + , defGhcFlag "rtsopts" (NoArg (setRtsOptsEnabled RtsOptsAll)) + , defGhcFlag "rtsopts=all" (NoArg (setRtsOptsEnabled RtsOptsAll)) + , defGhcFlag "rtsopts=some" (NoArg (setRtsOptsEnabled RtsOptsSafeOnly)) + , defGhcFlag "rtsopts=none" (NoArg (setRtsOptsEnabled RtsOptsNone)) + , defGhcFlag "no-rtsopts" (NoArg (setRtsOptsEnabled RtsOptsNone)) + , defGhcFlag "main-is" (SepArg setMainIs) + , defGhcFlag "haddock" (NoArg (setGeneralFlag Opt_Haddock)) + , defGhcFlag "haddock-opts" (hasArg addHaddockOpts) + , defGhcFlag "hpcdir" (SepArg setOptHpcDir) + , defGhciFlag "ghci-script" (hasArg addGhciScript) + , defGhciFlag "interactive-print" (hasArg setInteractivePrint) + , defGhcFlag "ticky-allocd" (NoArg (setGeneralFlag Opt_Ticky_Allocd)) + , defGhcFlag "ticky-LNE" (NoArg (setGeneralFlag Opt_Ticky_LNE)) + , defGhcFlag "ticky-dyn-thunk" (NoArg (setGeneralFlag Opt_Ticky_Dyn_Thunk)) ------- recompilation checker -------------------------------------- - , Flag "recomp" (NoArg (do unSetGeneralFlag Opt_ForceRecomp - deprecate "Use -fno-force-recomp instead")) - , Flag "no-recomp" (NoArg (do setGeneralFlag Opt_ForceRecomp - deprecate "Use -fforce-recomp instead")) + , defGhcFlag "recomp" (NoArg (do unSetGeneralFlag Opt_ForceRecomp + deprecate "Use -fno-force-recomp instead")) + , defGhcFlag "no-recomp" (NoArg (do setGeneralFlag Opt_ForceRecomp + deprecate "Use -fforce-recomp instead")) ------ HsCpp opts --------------------------------------------------- - , Flag "D" (AnySuffix (upd . addOptP)) - , Flag "U" (AnySuffix (upd . addOptP)) + , defFlag "D" (AnySuffix (upd . addOptP)) + , defFlag "U" (AnySuffix (upd . addOptP)) ------- Include/Import Paths ---------------------------------------- - , Flag "I" (Prefix addIncludePath) - , Flag "i" (OptPrefix addImportPath) + , defFlag "I" (Prefix addIncludePath) + , defFlag "i" (OptPrefix addImportPath) ------ Output style options ----------------------------------------- - , Flag "dppr-user-length" (intSuffix (\n d -> d{ pprUserLength = n })) - , Flag "dppr-cols" (intSuffix (\n d -> d{ pprCols = n })) - , Flag "dtrace-level" (intSuffix (\n d -> d{ traceLevel = n })) + , defFlag "dppr-user-length" (intSuffix (\n d -> d{ pprUserLength = n })) + , defFlag "dppr-cols" (intSuffix (\n d -> d{ pprCols = n })) + , defGhcFlag "dtrace-level" (intSuffix (\n d -> d{ traceLevel = n })) -- Suppress all that is suppressable in core dumps. -- Except for uniques, as some simplifier phases introduce new varibles that -- have otherwise identical names. - , Flag "dsuppress-all" (NoArg $ do setGeneralFlag Opt_SuppressCoercions - setGeneralFlag Opt_SuppressVarKinds - setGeneralFlag Opt_SuppressModulePrefixes - setGeneralFlag Opt_SuppressTypeApplications - setGeneralFlag Opt_SuppressIdInfo - setGeneralFlag Opt_SuppressTypeSignatures) + , defGhcFlag "dsuppress-all" (NoArg $ do setGeneralFlag Opt_SuppressCoercions + setGeneralFlag Opt_SuppressVarKinds + setGeneralFlag Opt_SuppressModulePrefixes + setGeneralFlag Opt_SuppressTypeApplications + setGeneralFlag Opt_SuppressIdInfo + setGeneralFlag Opt_SuppressTypeSignatures) ------ Debugging ---------------------------------------------------- - , Flag "dstg-stats" (NoArg (setGeneralFlag Opt_StgStats)) - - , Flag "ddump-cmm" (setDumpFlag Opt_D_dump_cmm) - , Flag "ddump-cmm-raw" (setDumpFlag Opt_D_dump_cmm_raw) - , Flag "ddump-cmm-cfg" (setDumpFlag Opt_D_dump_cmm_cfg) - , Flag "ddump-cmm-cbe" (setDumpFlag Opt_D_dump_cmm_cbe) - , Flag "ddump-cmm-proc" (setDumpFlag Opt_D_dump_cmm_proc) - , Flag "ddump-cmm-sink" (setDumpFlag Opt_D_dump_cmm_sink) - , Flag "ddump-cmm-sp" (setDumpFlag Opt_D_dump_cmm_sp) - , Flag "ddump-cmm-procmap" (setDumpFlag Opt_D_dump_cmm_procmap) - , Flag "ddump-cmm-split" (setDumpFlag Opt_D_dump_cmm_split) - , Flag "ddump-cmm-info" (setDumpFlag Opt_D_dump_cmm_info) - , Flag "ddump-cmm-cps" (setDumpFlag Opt_D_dump_cmm_cps) - , Flag "ddump-core-stats" (setDumpFlag Opt_D_dump_core_stats) - , Flag "ddump-asm" (setDumpFlag Opt_D_dump_asm) - , Flag "ddump-asm-native" (setDumpFlag Opt_D_dump_asm_native) - , Flag "ddump-asm-liveness" (setDumpFlag Opt_D_dump_asm_liveness) - , Flag "ddump-asm-regalloc" (setDumpFlag Opt_D_dump_asm_regalloc) - , Flag "ddump-asm-conflicts" (setDumpFlag Opt_D_dump_asm_conflicts) - , Flag "ddump-asm-regalloc-stages" (setDumpFlag Opt_D_dump_asm_regalloc_stages) - , Flag "ddump-asm-stats" (setDumpFlag Opt_D_dump_asm_stats) - , Flag "ddump-asm-expanded" (setDumpFlag Opt_D_dump_asm_expanded) - , Flag "ddump-llvm" (NoArg (do setObjTarget HscLlvm - setDumpFlag' Opt_D_dump_llvm)) - , Flag "ddump-deriv" (setDumpFlag Opt_D_dump_deriv) - , Flag "ddump-ds" (setDumpFlag Opt_D_dump_ds) - , Flag "ddump-foreign" (setDumpFlag Opt_D_dump_foreign) - , Flag "ddump-inlinings" (setDumpFlag Opt_D_dump_inlinings) - , Flag "ddump-rule-firings" (setDumpFlag Opt_D_dump_rule_firings) - , Flag "ddump-rule-rewrites" (setDumpFlag Opt_D_dump_rule_rewrites) - , Flag "ddump-simpl-trace" (setDumpFlag Opt_D_dump_simpl_trace) - , Flag "ddump-occur-anal" (setDumpFlag Opt_D_dump_occur_anal) - , Flag "ddump-parsed" (setDumpFlag Opt_D_dump_parsed) - , Flag "ddump-rn" (setDumpFlag Opt_D_dump_rn) - , Flag "ddump-simpl" (setDumpFlag Opt_D_dump_simpl) - , Flag "ddump-simpl-iterations" (setDumpFlag Opt_D_dump_simpl_iterations) - , Flag "ddump-spec" (setDumpFlag Opt_D_dump_spec) - , Flag "ddump-prep" (setDumpFlag Opt_D_dump_prep) - , Flag "ddump-stg" (setDumpFlag Opt_D_dump_stg) - , Flag "ddump-call-arity" (setDumpFlag Opt_D_dump_call_arity) - , Flag "ddump-stranal" (setDumpFlag Opt_D_dump_stranal) - , Flag "ddump-strsigs" (setDumpFlag Opt_D_dump_strsigs) - , Flag "ddump-tc" (setDumpFlag Opt_D_dump_tc) - , Flag "ddump-types" (setDumpFlag Opt_D_dump_types) - , Flag "ddump-rules" (setDumpFlag Opt_D_dump_rules) - , Flag "ddump-cse" (setDumpFlag Opt_D_dump_cse) - , Flag "ddump-worker-wrapper" (setDumpFlag Opt_D_dump_worker_wrapper) - , Flag "ddump-rn-trace" (setDumpFlag Opt_D_dump_rn_trace) - , Flag "ddump-if-trace" (setDumpFlag Opt_D_dump_if_trace) - , Flag "ddump-cs-trace" (setDumpFlag Opt_D_dump_cs_trace) - , Flag "ddump-tc-trace" (NoArg (do { setDumpFlag' Opt_D_dump_tc_trace - ; setDumpFlag' Opt_D_dump_cs_trace })) - , Flag "ddump-vt-trace" (setDumpFlag Opt_D_dump_vt_trace) - , Flag "ddump-splices" (setDumpFlag Opt_D_dump_splices) - , Flag "ddump-rn-stats" (setDumpFlag Opt_D_dump_rn_stats) - , Flag "ddump-opt-cmm" (setDumpFlag Opt_D_dump_opt_cmm) - , Flag "ddump-simpl-stats" (setDumpFlag Opt_D_dump_simpl_stats) - , Flag "ddump-bcos" (setDumpFlag Opt_D_dump_BCOs) - , Flag "dsource-stats" (setDumpFlag Opt_D_source_stats) - , Flag "dverbose-core2core" (NoArg (do setVerbosity (Just 2) - setVerboseCore2Core)) - , Flag "dverbose-stg2stg" (setDumpFlag Opt_D_verbose_stg2stg) - , Flag "ddump-hi" (setDumpFlag Opt_D_dump_hi) - , Flag "ddump-minimal-imports" (NoArg (setGeneralFlag Opt_D_dump_minimal_imports)) - , Flag "ddump-vect" (setDumpFlag Opt_D_dump_vect) - , Flag "ddump-hpc" (setDumpFlag Opt_D_dump_ticked) -- back compat - , Flag "ddump-ticked" (setDumpFlag Opt_D_dump_ticked) - , Flag "ddump-mod-cycles" (setDumpFlag Opt_D_dump_mod_cycles) - , Flag "ddump-mod-map" (setDumpFlag Opt_D_dump_mod_map) - , Flag "ddump-view-pattern-commoning" (setDumpFlag Opt_D_dump_view_pattern_commoning) - , Flag "ddump-to-file" (NoArg (setGeneralFlag Opt_DumpToFile)) - , Flag "ddump-hi-diffs" (setDumpFlag Opt_D_dump_hi_diffs) - , Flag "ddump-rtti" (setDumpFlag Opt_D_dump_rtti) - , Flag "dcore-lint" (NoArg (setGeneralFlag Opt_DoCoreLinting)) - , Flag "dstg-lint" (NoArg (setGeneralFlag Opt_DoStgLinting)) - , Flag "dcmm-lint" (NoArg (setGeneralFlag Opt_DoCmmLinting)) - , Flag "dasm-lint" (NoArg (setGeneralFlag Opt_DoAsmLinting)) - , Flag "dshow-passes" (NoArg (do forceRecompile - setVerbosity $ Just 2)) - , Flag "dfaststring-stats" (NoArg (setGeneralFlag Opt_D_faststring_stats)) - , Flag "dno-llvm-mangler" (NoArg (setGeneralFlag Opt_NoLlvmMangler)) -- hidden flag + , defGhcFlag "dstg-stats" (NoArg (setGeneralFlag Opt_StgStats)) + + , defGhcFlag "ddump-cmm" (setDumpFlag Opt_D_dump_cmm) + , defGhcFlag "ddump-cmm-raw" (setDumpFlag Opt_D_dump_cmm_raw) + , defGhcFlag "ddump-cmm-cfg" (setDumpFlag Opt_D_dump_cmm_cfg) + , defGhcFlag "ddump-cmm-cbe" (setDumpFlag Opt_D_dump_cmm_cbe) + , defGhcFlag "ddump-cmm-proc" (setDumpFlag Opt_D_dump_cmm_proc) + , defGhcFlag "ddump-cmm-sink" (setDumpFlag Opt_D_dump_cmm_sink) + , defGhcFlag "ddump-cmm-sp" (setDumpFlag Opt_D_dump_cmm_sp) + , defGhcFlag "ddump-cmm-procmap" (setDumpFlag Opt_D_dump_cmm_procmap) + , defGhcFlag "ddump-cmm-split" (setDumpFlag Opt_D_dump_cmm_split) + , defGhcFlag "ddump-cmm-info" (setDumpFlag Opt_D_dump_cmm_info) + , defGhcFlag "ddump-cmm-cps" (setDumpFlag Opt_D_dump_cmm_cps) + , defGhcFlag "ddump-core-stats" (setDumpFlag Opt_D_dump_core_stats) + , defGhcFlag "ddump-asm" (setDumpFlag Opt_D_dump_asm) + , defGhcFlag "ddump-asm-native" (setDumpFlag Opt_D_dump_asm_native) + , defGhcFlag "ddump-asm-liveness" (setDumpFlag Opt_D_dump_asm_liveness) + , defGhcFlag "ddump-asm-regalloc" (setDumpFlag Opt_D_dump_asm_regalloc) + , defGhcFlag "ddump-asm-conflicts" (setDumpFlag Opt_D_dump_asm_conflicts) + , defGhcFlag "ddump-asm-regalloc-stages" (setDumpFlag Opt_D_dump_asm_regalloc_stages) + , defGhcFlag "ddump-asm-stats" (setDumpFlag Opt_D_dump_asm_stats) + , defGhcFlag "ddump-asm-expanded" (setDumpFlag Opt_D_dump_asm_expanded) + , defGhcFlag "ddump-llvm" (NoArg (do setObjTarget HscLlvm + setDumpFlag' Opt_D_dump_llvm)) + , defGhcFlag "ddump-deriv" (setDumpFlag Opt_D_dump_deriv) + , defGhcFlag "ddump-ds" (setDumpFlag Opt_D_dump_ds) + , defGhcFlag "ddump-foreign" (setDumpFlag Opt_D_dump_foreign) + , defGhcFlag "ddump-inlinings" (setDumpFlag Opt_D_dump_inlinings) + , defGhcFlag "ddump-rule-firings" (setDumpFlag Opt_D_dump_rule_firings) + , defGhcFlag "ddump-rule-rewrites" (setDumpFlag Opt_D_dump_rule_rewrites) + , defGhcFlag "ddump-simpl-trace" (setDumpFlag Opt_D_dump_simpl_trace) + , defGhcFlag "ddump-occur-anal" (setDumpFlag Opt_D_dump_occur_anal) + , defGhcFlag "ddump-parsed" (setDumpFlag Opt_D_dump_parsed) + , defGhcFlag "ddump-rn" (setDumpFlag Opt_D_dump_rn) + , defGhcFlag "ddump-simpl" (setDumpFlag Opt_D_dump_simpl) + , defGhcFlag "ddump-simpl-iterations" (setDumpFlag Opt_D_dump_simpl_iterations) + , defGhcFlag "ddump-spec" (setDumpFlag Opt_D_dump_spec) + , defGhcFlag "ddump-prep" (setDumpFlag Opt_D_dump_prep) + , defGhcFlag "ddump-stg" (setDumpFlag Opt_D_dump_stg) + , defGhcFlag "ddump-call-arity" (setDumpFlag Opt_D_dump_call_arity) + , defGhcFlag "ddump-stranal" (setDumpFlag Opt_D_dump_stranal) + , defGhcFlag "ddump-strsigs" (setDumpFlag Opt_D_dump_strsigs) + , defGhcFlag "ddump-tc" (setDumpFlag Opt_D_dump_tc) + , defGhcFlag "ddump-types" (setDumpFlag Opt_D_dump_types) + , defGhcFlag "ddump-rules" (setDumpFlag Opt_D_dump_rules) + , defGhcFlag "ddump-cse" (setDumpFlag Opt_D_dump_cse) + , defGhcFlag "ddump-worker-wrapper" (setDumpFlag Opt_D_dump_worker_wrapper) + , defGhcFlag "ddump-rn-trace" (setDumpFlag Opt_D_dump_rn_trace) + , defGhcFlag "ddump-if-trace" (setDumpFlag Opt_D_dump_if_trace) + , defGhcFlag "ddump-cs-trace" (setDumpFlag Opt_D_dump_cs_trace) + , defGhcFlag "ddump-tc-trace" (NoArg (do + setDumpFlag' Opt_D_dump_tc_trace + setDumpFlag' Opt_D_dump_cs_trace)) + , defGhcFlag "ddump-vt-trace" (setDumpFlag Opt_D_dump_vt_trace) + , defGhcFlag "ddump-splices" (setDumpFlag Opt_D_dump_splices) + , defGhcFlag "ddump-rn-stats" (setDumpFlag Opt_D_dump_rn_stats) + , defGhcFlag "ddump-opt-cmm" (setDumpFlag Opt_D_dump_opt_cmm) + , defGhcFlag "ddump-simpl-stats" (setDumpFlag Opt_D_dump_simpl_stats) + , defGhcFlag "ddump-bcos" (setDumpFlag Opt_D_dump_BCOs) + , defGhcFlag "dsource-stats" (setDumpFlag Opt_D_source_stats) + , defGhcFlag "dverbose-core2core" (NoArg (do setVerbosity (Just 2) + setVerboseCore2Core)) + , defGhcFlag "dverbose-stg2stg" (setDumpFlag Opt_D_verbose_stg2stg) + , defGhcFlag "ddump-hi" (setDumpFlag Opt_D_dump_hi) + , defGhcFlag "ddump-minimal-imports" (NoArg (setGeneralFlag Opt_D_dump_minimal_imports)) + , defGhcFlag "ddump-vect" (setDumpFlag Opt_D_dump_vect) + , defGhcFlag "ddump-hpc" (setDumpFlag Opt_D_dump_ticked) -- back compat + , defGhcFlag "ddump-ticked" (setDumpFlag Opt_D_dump_ticked) + , defGhcFlag "ddump-mod-cycles" (setDumpFlag Opt_D_dump_mod_cycles) + , defGhcFlag "ddump-mod-map" (setDumpFlag Opt_D_dump_mod_map) + , defGhcFlag "ddump-view-pattern-commoning" (setDumpFlag Opt_D_dump_view_pattern_commoning) + , defGhcFlag "ddump-to-file" (NoArg (setGeneralFlag Opt_DumpToFile)) + , defGhcFlag "ddump-hi-diffs" (setDumpFlag Opt_D_dump_hi_diffs) + , defGhcFlag "ddump-rtti" (setDumpFlag Opt_D_dump_rtti) + , defGhcFlag "dcore-lint" (NoArg (setGeneralFlag Opt_DoCoreLinting)) + , defGhcFlag "dstg-lint" (NoArg (setGeneralFlag Opt_DoStgLinting)) + , defGhcFlag "dcmm-lint" (NoArg (setGeneralFlag Opt_DoCmmLinting)) + , defGhcFlag "dasm-lint" (NoArg (setGeneralFlag Opt_DoAsmLinting)) + , defGhcFlag "dshow-passes" (NoArg (do forceRecompile + setVerbosity $ Just 2)) + , defGhcFlag "dfaststring-stats" (NoArg (setGeneralFlag Opt_D_faststring_stats)) + , defGhcFlag "dno-llvm-mangler" (NoArg (setGeneralFlag Opt_NoLlvmMangler)) -- hidden flag ------ Machine dependant (-m<blah>) stuff --------------------------- - , Flag "msse" (versionSuffix (\maj min d -> d{ sseVersion = Just (maj, min) })) - , Flag "mavx" (noArg (\d -> d{ avx = True })) - , Flag "mavx2" (noArg (\d -> d{ avx2 = True })) - , Flag "mavx512cd" (noArg (\d -> d{ avx512cd = True })) - , Flag "mavx512er" (noArg (\d -> d{ avx512er = True })) - , Flag "mavx512f" (noArg (\d -> d{ avx512f = True })) - , Flag "mavx512pf" (noArg (\d -> d{ avx512pf = True })) + , defGhcFlag "msse" (versionSuffix (\maj min d -> d{ sseVersion = Just (maj, min) })) + , defGhcFlag "mavx" (noArg (\d -> d{ avx = True })) + , defGhcFlag "mavx2" (noArg (\d -> d{ avx2 = True })) + , defGhcFlag "mavx512cd" (noArg (\d -> d{ avx512cd = True })) + , defGhcFlag "mavx512er" (noArg (\d -> d{ avx512er = True })) + , defGhcFlag "mavx512f" (noArg (\d -> d{ avx512f = True })) + , defGhcFlag "mavx512pf" (noArg (\d -> d{ avx512pf = True })) ------ Warning opts ------------------------------------------------- - , Flag "W" (NoArg (mapM_ setWarningFlag minusWOpts)) - , Flag "Werror" (NoArg (setGeneralFlag Opt_WarnIsError)) - , Flag "Wwarn" (NoArg (unSetGeneralFlag Opt_WarnIsError)) - , Flag "Wall" (NoArg (mapM_ setWarningFlag minusWallOpts)) - , Flag "Wnot" (NoArg (do upd (\dfs -> dfs {warningFlags = IntSet.empty}) - deprecate "Use -w instead")) - , Flag "w" (NoArg (upd (\dfs -> dfs {warningFlags = IntSet.empty}))) + , defFlag "W" (NoArg (mapM_ setWarningFlag minusWOpts)) + , defFlag "Werror" (NoArg (setGeneralFlag Opt_WarnIsError)) + , defFlag "Wwarn" (NoArg (unSetGeneralFlag Opt_WarnIsError)) + , defFlag "Wall" (NoArg (mapM_ setWarningFlag minusWallOpts)) + , defFlag "Wnot" (NoArg (do upd (\dfs -> dfs {warningFlags = IntSet.empty}) + deprecate "Use -w instead")) + , defFlag "w" (NoArg (upd (\dfs -> dfs {warningFlags = IntSet.empty}))) ------ Plugin flags ------------------------------------------------ - , Flag "fplugin-opt" (hasArg addPluginModuleNameOption) - , Flag "fplugin" (hasArg addPluginModuleName) + , defGhcFlag "fplugin-opt" (hasArg addPluginModuleNameOption) + , defGhcFlag "fplugin" (hasArg addPluginModuleName) ------ Optimisation flags ------------------------------------------ - , Flag "O" (noArgM (setOptLevel 1)) - , Flag "Onot" (noArgM (\dflags -> do deprecate "Use -O0 instead" - setOptLevel 0 dflags)) - , Flag "Odph" (noArgM setDPHOpt) - , Flag "O" (optIntSuffixM (\mb_n -> setOptLevel (mb_n `orElse` 1))) + , defGhcFlag "O" (noArgM (setOptLevel 1)) + , defGhcFlag "Onot" (noArgM (\dflags -> do deprecate "Use -O0 instead" + setOptLevel 0 dflags)) + , defGhcFlag "Odph" (noArgM setDPHOpt) + , defGhcFlag "O" (optIntSuffixM (\mb_n -> setOptLevel (mb_n `orElse` 1))) -- If the number is missing, use 1 - , Flag "fmax-relevant-binds" (intSuffix (\n d -> d{ maxRelevantBinds = Just n })) - , Flag "fno-max-relevant-binds" (noArg (\d -> d{ maxRelevantBinds = Nothing })) - , Flag "fsimplifier-phases" (intSuffix (\n d -> d{ simplPhases = n })) - , Flag "fmax-simplifier-iterations" (intSuffix (\n d -> d{ maxSimplIterations = n })) - , Flag "fsimpl-tick-factor" (intSuffix (\n d -> d{ simplTickFactor = n })) - , Flag "fspec-constr-threshold" (intSuffix (\n d -> d{ specConstrThreshold = Just n })) - , Flag "fno-spec-constr-threshold" (noArg (\d -> d{ specConstrThreshold = Nothing })) - , Flag "fspec-constr-count" (intSuffix (\n d -> d{ specConstrCount = Just n })) - , Flag "fno-spec-constr-count" (noArg (\d -> d{ specConstrCount = Nothing })) - , Flag "fspec-constr-recursive" (intSuffix (\n d -> d{ specConstrRecursive = n })) - , Flag "fliberate-case-threshold" (intSuffix (\n d -> d{ liberateCaseThreshold = Just n })) - , Flag "fno-liberate-case-threshold" (noArg (\d -> d{ liberateCaseThreshold = Nothing })) - , Flag "frule-check" (sepArg (\s d -> d{ ruleCheck = Just s })) - , Flag "fcontext-stack" (intSuffix (\n d -> d{ ctxtStkDepth = n })) - , Flag "ftype-function-depth" (intSuffix (\n d -> d{ tyFunStkDepth = n })) - , Flag "fstrictness-before" (intSuffix (\n d -> d{ strictnessBefore = n : strictnessBefore d })) - , Flag "ffloat-lam-args" (intSuffix (\n d -> d{ floatLamArgs = Just n })) - , Flag "ffloat-all-lams" (noArg (\d -> d{ floatLamArgs = Nothing })) - - , Flag "fhistory-size" (intSuffix (\n d -> d{ historySize = n })) - - , Flag "funfolding-creation-threshold" (intSuffix (\n d -> d {ufCreationThreshold = n})) - , Flag "funfolding-use-threshold" (intSuffix (\n d -> d {ufUseThreshold = n})) - , Flag "funfolding-fun-discount" (intSuffix (\n d -> d {ufFunAppDiscount = n})) - , Flag "funfolding-dict-discount" (intSuffix (\n d -> d {ufDictDiscount = n})) - , Flag "funfolding-keeness-factor" (floatSuffix (\n d -> d {ufKeenessFactor = n})) - - , Flag "fmax-worker-args" (intSuffix (\n d -> d {maxWorkerArgs = n})) - - , Flag "fghci-hist-size" (intSuffix (\n d -> d {ghciHistSize = n})) - , Flag "fmax-inline-alloc-size" (intSuffix (\n d -> d{ maxInlineAllocSize = n })) - , Flag "fmax-inline-memcpy-insns" (intSuffix (\n d -> d{ maxInlineMemcpyInsns = n })) - , Flag "fmax-inline-memset-insns" (intSuffix (\n d -> d{ maxInlineMemsetInsns = n })) + , defFlag "fmax-relevant-binds" (intSuffix (\n d -> d{ maxRelevantBinds = Just n })) + , defFlag "fno-max-relevant-binds" (noArg (\d -> d{ maxRelevantBinds = Nothing })) + , defFlag "fsimplifier-phases" (intSuffix (\n d -> d{ simplPhases = n })) + , defFlag "fmax-simplifier-iterations" (intSuffix (\n d -> d{ maxSimplIterations = n })) + , defFlag "fsimpl-tick-factor" (intSuffix (\n d -> d{ simplTickFactor = n })) + , defFlag "fspec-constr-threshold" (intSuffix (\n d -> d{ specConstrThreshold = Just n })) + , defFlag "fno-spec-constr-threshold" (noArg (\d -> d{ specConstrThreshold = Nothing })) + , defFlag "fspec-constr-count" (intSuffix (\n d -> d{ specConstrCount = Just n })) + , defFlag "fno-spec-constr-count" (noArg (\d -> d{ specConstrCount = Nothing })) + , defFlag "fspec-constr-recursive" (intSuffix (\n d -> d{ specConstrRecursive = n })) + , defFlag "fliberate-case-threshold" (intSuffix (\n d -> d{ liberateCaseThreshold = Just n })) + , defFlag "fno-liberate-case-threshold" (noArg (\d -> d{ liberateCaseThreshold = Nothing })) + , defFlag "frule-check" (sepArg (\s d -> d{ ruleCheck = Just s })) + , defFlag "fcontext-stack" (intSuffix (\n d -> d{ ctxtStkDepth = n })) + , defFlag "ftype-function-depth" (intSuffix (\n d -> d{ tyFunStkDepth = n })) + , defFlag "fstrictness-before" (intSuffix (\n d -> d{ strictnessBefore = n : strictnessBefore d })) + , defFlag "ffloat-lam-args" (intSuffix (\n d -> d{ floatLamArgs = Just n })) + , defFlag "ffloat-all-lams" (noArg (\d -> d{ floatLamArgs = Nothing })) + + , defFlag "fhistory-size" (intSuffix (\n d -> d{ historySize = n })) + + , defFlag "funfolding-creation-threshold" (intSuffix (\n d -> d {ufCreationThreshold = n})) + , defFlag "funfolding-use-threshold" (intSuffix (\n d -> d {ufUseThreshold = n})) + , defFlag "funfolding-fun-discount" (intSuffix (\n d -> d {ufFunAppDiscount = n})) + , defFlag "funfolding-dict-discount" (intSuffix (\n d -> d {ufDictDiscount = n})) + , defFlag "funfolding-keeness-factor" (floatSuffix (\n d -> d {ufKeenessFactor = n})) + + , defFlag "fmax-worker-args" (intSuffix (\n d -> d {maxWorkerArgs = n})) + + , defGhciFlag "fghci-hist-size" (intSuffix (\n d -> d {ghciHistSize = n})) + , defGhcFlag "fmax-inline-alloc-size" (intSuffix (\n d -> d{ maxInlineAllocSize = n })) + , defGhcFlag "fmax-inline-memcpy-insns" (intSuffix (\n d -> d{ maxInlineMemcpyInsns = n })) + , defGhcFlag "fmax-inline-memset-insns" (intSuffix (\n d -> d{ maxInlineMemsetInsns = n })) ------ Profiling ---------------------------------------------------- -- OLD profiling flags - , Flag "auto-all" (noArg (\d -> d { profAuto = ProfAutoAll } )) - , Flag "no-auto-all" (noArg (\d -> d { profAuto = NoProfAuto } )) - , Flag "auto" (noArg (\d -> d { profAuto = ProfAutoExports } )) - , Flag "no-auto" (noArg (\d -> d { profAuto = NoProfAuto } )) - , Flag "caf-all" (NoArg (setGeneralFlag Opt_AutoSccsOnIndividualCafs)) - , Flag "no-caf-all" (NoArg (unSetGeneralFlag Opt_AutoSccsOnIndividualCafs)) + , defGhcFlag "auto-all" (noArg (\d -> d { profAuto = ProfAutoAll } )) + , defGhcFlag "no-auto-all" (noArg (\d -> d { profAuto = NoProfAuto } )) + , defGhcFlag "auto" (noArg (\d -> d { profAuto = ProfAutoExports } )) + , defGhcFlag "no-auto" (noArg (\d -> d { profAuto = NoProfAuto } )) + , defGhcFlag "caf-all" (NoArg (setGeneralFlag Opt_AutoSccsOnIndividualCafs)) + , defGhcFlag "no-caf-all" (NoArg (unSetGeneralFlag Opt_AutoSccsOnIndividualCafs)) -- NEW profiling flags - , Flag "fprof-auto" (noArg (\d -> d { profAuto = ProfAutoAll } )) - , Flag "fprof-auto-top" (noArg (\d -> d { profAuto = ProfAutoTop } )) - , Flag "fprof-auto-exported" (noArg (\d -> d { profAuto = ProfAutoExports } )) - , Flag "fprof-auto-calls" (noArg (\d -> d { profAuto = ProfAutoCalls } )) - , Flag "fno-prof-auto" (noArg (\d -> d { profAuto = NoProfAuto } )) + , defGhcFlag "fprof-auto" (noArg (\d -> d { profAuto = ProfAutoAll } )) + , defGhcFlag "fprof-auto-top" (noArg (\d -> d { profAuto = ProfAutoTop } )) + , defGhcFlag "fprof-auto-exported" (noArg (\d -> d { profAuto = ProfAutoExports } )) + , defGhcFlag "fprof-auto-calls" (noArg (\d -> d { profAuto = ProfAutoCalls } )) + , defGhcFlag "fno-prof-auto" (noArg (\d -> d { profAuto = NoProfAuto } )) ------ Compiler flags ----------------------------------------------- - , Flag "fasm" (NoArg (setObjTarget HscAsm)) - , Flag "fvia-c" (NoArg + , defGhcFlag "fasm" (NoArg (setObjTarget HscAsm)) + , defGhcFlag "fvia-c" (NoArg (addWarn "The -fvia-c flag does nothing; it will be removed in a future GHC release")) - , Flag "fvia-C" (NoArg + , defGhcFlag "fvia-C" (NoArg (addWarn "The -fvia-C flag does nothing; it will be removed in a future GHC release")) - , Flag "fllvm" (NoArg (setObjTarget HscLlvm)) + , defGhcFlag "fllvm" (NoArg (setObjTarget HscLlvm)) - , Flag "fno-code" (NoArg (do upd $ \d -> d{ ghcLink=NoLink } - setTarget HscNothing)) - , Flag "fbyte-code" (NoArg (setTarget HscInterpreted)) - , Flag "fobject-code" (NoArg (setTargetWithPlatform defaultHscTarget)) - , Flag "fglasgow-exts" (NoArg (enableGlasgowExts >> deprecate "Use individual extensions instead")) - , Flag "fno-glasgow-exts" (NoArg (disableGlasgowExts >> deprecate "Use individual extensions instead")) + , defFlag "fno-code" (NoArg (do upd $ \d -> d{ ghcLink=NoLink } + setTarget HscNothing)) + , defFlag "fbyte-code" (NoArg (setTarget HscInterpreted)) + , defFlag "fobject-code" (NoArg (setTargetWithPlatform defaultHscTarget)) + , defFlag "fglasgow-exts" (NoArg (enableGlasgowExts >> deprecate "Use individual extensions instead")) + , defFlag "fno-glasgow-exts" (NoArg (disableGlasgowExts >> deprecate "Use individual extensions instead")) ------ Safe Haskell flags ------------------------------------------- - , Flag "fpackage-trust" (NoArg setPackageTrust) - , Flag "fno-safe-infer" (noArg (\d -> d { safeInfer = False } )) - , Flag "fPIC" (NoArg (setGeneralFlag Opt_PIC)) - , Flag "fno-PIC" (NoArg (unSetGeneralFlag Opt_PIC)) + , defFlag "fpackage-trust" (NoArg setPackageTrust) + , defFlag "fno-safe-infer" (noArg (\d -> d { safeInfer = False } )) + , defGhcFlag "fPIC" (NoArg (setGeneralFlag Opt_PIC)) + , defGhcFlag "fno-PIC" (NoArg (unSetGeneralFlag Opt_PIC)) ] ++ map (mkFlag turnOn "" setGeneralFlag ) negatableFlags ++ map (mkFlag turnOff "no-" unSetGeneralFlag) negatableFlags @@ -2563,62 +2575,88 @@ dynamic_flags = [ ++ map (mkFlag turnOff "XNo" unSetExtensionFlag) xFlags ++ map (mkFlag turnOn "X" setLanguage) languageFlags ++ map (mkFlag turnOn "X" setSafeHaskell) safeHaskellFlags - ++ [ Flag "XGenerics" (NoArg (deprecate "it does nothing; look into -XDefaultSignatures and -XDeriveGeneric for generic programming support.")) - , Flag "XNoGenerics" (NoArg (deprecate "it does nothing; look into -XDefaultSignatures and -XDeriveGeneric for generic programming support.")) ] + ++ [ defFlag "XGenerics" (NoArg (deprecate "it does nothing; look into -XDefaultSignatures and -XDeriveGeneric for generic programming support.")) + , defFlag "XNoGenerics" (NoArg (deprecate "it does nothing; look into -XDefaultSignatures and -XDeriveGeneric for generic programming support.")) ] +-- See Note [Supporting CLI completion] package_flags :: [Flag (CmdLineP DynFlags)] package_flags = [ ------- Packages ---------------------------------------------------- - Flag "package-db" (HasArg (addPkgConfRef . PkgConfFile)) - , Flag "clear-package-db" (NoArg clearPkgConf) - , Flag "no-global-package-db" (NoArg removeGlobalPkgConf) - , Flag "no-user-package-db" (NoArg removeUserPkgConf) - , Flag "global-package-db" (NoArg (addPkgConfRef GlobalPkgConf)) - , Flag "user-package-db" (NoArg (addPkgConfRef UserPkgConf)) + defFlag "package-db" (HasArg (addPkgConfRef . PkgConfFile)) + , defFlag "clear-package-db" (NoArg clearPkgConf) + , defFlag "no-global-package-db" (NoArg removeGlobalPkgConf) + , defFlag "no-user-package-db" (NoArg removeUserPkgConf) + , defFlag "global-package-db" (NoArg (addPkgConfRef GlobalPkgConf)) + , defFlag "user-package-db" (NoArg (addPkgConfRef UserPkgConf)) -- backwards compat with GHC<=7.4 : - , Flag "package-conf" (HasArg $ \path -> do - addPkgConfRef (PkgConfFile path) - deprecate "Use -package-db instead") - , Flag "no-user-package-conf" (NoArg $ do - removeUserPkgConf - deprecate "Use -no-user-package-db instead") - - , Flag "package-name" (HasArg $ \name -> do - upd (setPackageKey name) - deprecate "Use -this-package-key instead") - , Flag "this-package-key" (hasArg setPackageKey) - , Flag "package-id" (HasArg exposePackageId) - , Flag "package" (HasArg exposePackage) - , Flag "package-key" (HasArg exposePackageKey) - , Flag "hide-package" (HasArg hidePackage) - , Flag "hide-all-packages" (NoArg (setGeneralFlag Opt_HideAllPackages)) - , Flag "ignore-package" (HasArg ignorePackage) - , Flag "syslib" (HasArg (\s -> do exposePackage s - deprecate "Use -package instead")) - , Flag "distrust-all-packages" (NoArg (setGeneralFlag Opt_DistrustAllPackages)) - , Flag "trust" (HasArg trustPackage) - , Flag "distrust" (HasArg distrustPackage) + , defFlag "package-conf" (HasArg $ \path -> do + addPkgConfRef (PkgConfFile path) + deprecate "Use -package-db instead") + , defFlag "no-user-package-conf" (NoArg $ do + removeUserPkgConf + deprecate "Use -no-user-package-db instead") + + , defGhcFlag "package-name" (HasArg $ \name -> do + upd (setPackageKey name) + deprecate "Use -this-package-key instead") + , defGhcFlag "this-package-key" (hasArg setPackageKey) + , defFlag "package-id" (HasArg exposePackageId) + , defFlag "package" (HasArg exposePackage) + , defFlag "package-key" (HasArg exposePackageKey) + , defFlag "hide-package" (HasArg hidePackage) + , defFlag "hide-all-packages" (NoArg (setGeneralFlag Opt_HideAllPackages)) + , defFlag "ignore-package" (HasArg ignorePackage) + , defFlag "syslib" (HasArg (\s -> do exposePackage s + deprecate "Use -package instead")) + , defFlag "distrust-all-packages" (NoArg (setGeneralFlag Opt_DistrustAllPackages)) + , defFlag "trust" (HasArg trustPackage) + , defFlag "distrust" (HasArg distrustPackage) ] +-- | Make a list of flags for shell completion. +-- Filter all available flags into two groups, for interactive GHC vs all other. +flagsForCompletion :: Bool -> [String] +flagsForCompletion isInteractive + = [ '-':flagName flag + | flag <- flagsAll + , modeFilter (flagGhcMode flag) + ] + where + modeFilter AllModes = True + modeFilter OnlyGhci = isInteractive + modeFilter OnlyGhc = not isInteractive + modeFilter HiddenFlag = False + type TurnOnFlag = Bool -- True <=> we are turning the flag on -- False <=> we are turning the flag off turnOn :: TurnOnFlag; turnOn = True turnOff :: TurnOnFlag; turnOff = False -type FlagSpec flag - = ( String -- Flag in string form - , flag -- Flag in internal form - , TurnOnFlag -> DynP ()) -- Extra action to run when the flag is found - -- Typically, emit a warning or error +data FlagSpec flag + = FlagSpec + { flagSpecName :: String -- ^ Flag in string form + , flagSpecFlag :: flag -- ^ Flag in internal form + , flagSpecAction :: (TurnOnFlag -> DynP ()) + -- ^ Extra action to run when the flag is found + -- Typically, emit a warning or error + , flagSpecGhcMode :: GhcFlagMode + -- ^ In which ghc mode the flag has effect + } + +flagSpec :: (String, flag, (TurnOnFlag -> DynP ())) -> FlagSpec flag +flagSpec (name, flag, act) = FlagSpec name flag act AllModes + +flagGhciSpec :: (String, flag, (TurnOnFlag -> DynP ())) -> FlagSpec flag +flagGhciSpec (name, flag, act) = FlagSpec name flag act OnlyGhci mkFlag :: TurnOnFlag -- ^ True <=> it should be turned on -> String -- ^ The flag prefix -> (flag -> DynP ()) -- ^ What to do when the flag is found -> FlagSpec flag -- ^ Specification of this particular flag -> Flag (CmdLineP DynFlags) -mkFlag turn_on flagPrefix f (name, flag, extra_action) - = Flag (flagPrefix ++ name) (NoArg (f flag >> extra_action turn_on)) +mkFlag turn_on flagPrefix f (FlagSpec name flag extra_action mode) + = Flag (flagPrefix ++ name) (NoArg (f flag >> extra_action turn_on)) mode deprecatedForExtension :: String -> TurnOnFlag -> DynP () deprecatedForExtension lang turn_on @@ -2640,199 +2678,204 @@ nop _ = return () fWarningFlags :: [FlagSpec WarningFlag] fWarningFlags = [ -- See Note [Updating flag description in the User's Guide] +-- See Note [Supporting CLI completion] -- Please keep the list of flags below sorted alphabetically - ( "warn-alternative-layout-rule-transitional", Opt_WarnAlternativeLayoutRuleTransitional, nop ), - ( "warn-amp", Opt_WarnAMP, + flagSpec ( "warn-alternative-layout-rule-transitional", Opt_WarnAlternativeLayoutRuleTransitional, nop ), + flagSpec ( "warn-amp", Opt_WarnAMP, \_ -> deprecate "it has no effect, and will be removed in GHC 7.12" ), - ( "warn-auto-orphans", Opt_WarnAutoOrphans, nop ), - ( "warn-deprecations", Opt_WarnWarningsDeprecations, nop ), - ( "warn-deprecated-flags", Opt_WarnDeprecatedFlags, nop ), - ( "warn-dodgy-exports", Opt_WarnDodgyExports, nop ), - ( "warn-dodgy-foreign-imports", Opt_WarnDodgyForeignImports, nop ), - ( "warn-dodgy-imports", Opt_WarnDodgyImports, nop ), - ( "warn-empty-enumerations", Opt_WarnEmptyEnumerations, nop ), - ( "warn-context-quantification", Opt_WarnContextQuantification, nop ), - ( "warn-duplicate-constraints", Opt_WarnDuplicateConstraints, nop ), - ( "warn-duplicate-exports", Opt_WarnDuplicateExports, nop ), - ( "warn-hi-shadowing", Opt_WarnHiShadows, nop ), - ( "warn-implicit-prelude", Opt_WarnImplicitPrelude, nop ), - ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns, nop ), - ( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd, nop ), - ( "warn-incomplete-uni-patterns", Opt_WarnIncompleteUniPatterns, nop ), - ( "warn-inline-rule-shadowing", Opt_WarnInlineRuleShadowing, nop ), - ( "warn-identities", Opt_WarnIdentities, nop ), - ( "warn-missing-fields", Opt_WarnMissingFields, nop ), - ( "warn-missing-import-lists", Opt_WarnMissingImportList, nop ), - ( "warn-missing-local-sigs", Opt_WarnMissingLocalSigs, nop ), - ( "warn-missing-methods", Opt_WarnMissingMethods, nop ), - ( "warn-missing-signatures", Opt_WarnMissingSigs, nop ), - ( "warn-missing-exported-sigs", Opt_WarnMissingExportedSigs, nop ), - ( "warn-monomorphism-restriction", Opt_WarnMonomorphism, nop ), - ( "warn-name-shadowing", Opt_WarnNameShadowing, nop ), - ( "warn-orphans", Opt_WarnOrphans, nop ), - ( "warn-overflowed-literals", Opt_WarnOverflowedLiterals, nop ), - ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns, nop ), - ( "warn-pointless-pragmas", Opt_WarnPointlessPragmas, nop ), - ( "warn-safe", Opt_WarnSafe, setWarnSafe ), - ( "warn-trustworthy-safe", Opt_WarnTrustworthySafe, nop ), - ( "warn-tabs", Opt_WarnTabs, nop ), - ( "warn-type-defaults", Opt_WarnTypeDefaults, nop ), - ( "warn-typed-holes", Opt_WarnTypedHoles, nop ), - ( "warn-unrecognised-pragmas", Opt_WarnUnrecognisedPragmas, nop ), - ( "warn-unsafe", Opt_WarnUnsafe, setWarnUnsafe ), - ( "warn-unsupported-calling-conventions", Opt_WarnUnsupportedCallingConventions, nop ), - ( "warn-unsupported-llvm-version", Opt_WarnUnsupportedLlvmVersion, nop ), - ( "warn-unused-binds", Opt_WarnUnusedBinds, nop ), - ( "warn-unused-do-bind", Opt_WarnUnusedDoBind, nop ), - ( "warn-unused-imports", Opt_WarnUnusedImports, nop ), - ( "warn-unused-matches", Opt_WarnUnusedMatches, nop ), - ( "warn-warnings-deprecations", Opt_WarnWarningsDeprecations, nop ), - ( "warn-wrong-do-bind", Opt_WarnWrongDoBind, nop ) ] + flagSpec ( "warn-auto-orphans", Opt_WarnAutoOrphans, nop ), + flagSpec ( "warn-deprecations", Opt_WarnWarningsDeprecations, nop ), + flagSpec ( "warn-deprecated-flags", Opt_WarnDeprecatedFlags, nop ), + flagSpec ( "warn-dodgy-exports", Opt_WarnDodgyExports, nop ), + flagSpec ( "warn-dodgy-foreign-imports", Opt_WarnDodgyForeignImports, nop ), + flagSpec ( "warn-dodgy-imports", Opt_WarnDodgyImports, nop ), + flagSpec ( "warn-empty-enumerations", Opt_WarnEmptyEnumerations, nop ), + flagSpec ( "warn-context-quantification", Opt_WarnContextQuantification, nop ), + flagSpec ( "warn-duplicate-constraints", Opt_WarnDuplicateConstraints, nop ), + flagSpec ( "warn-duplicate-exports", Opt_WarnDuplicateExports, nop ), + flagSpec ( "warn-hi-shadowing", Opt_WarnHiShadows, nop ), + flagSpec ( "warn-implicit-prelude", Opt_WarnImplicitPrelude, nop ), + flagSpec ( "warn-incomplete-patterns", Opt_WarnIncompletePatterns, nop ), + flagSpec ( "warn-incomplete-record-updates", Opt_WarnIncompletePatternsRecUpd, nop ), + flagSpec ( "warn-incomplete-uni-patterns", Opt_WarnIncompleteUniPatterns, nop ), + flagSpec ( "warn-inline-rule-shadowing", Opt_WarnInlineRuleShadowing, nop ), + flagSpec ( "warn-identities", Opt_WarnIdentities, nop ), + flagSpec ( "warn-missing-fields", Opt_WarnMissingFields, nop ), + flagSpec ( "warn-missing-import-lists", Opt_WarnMissingImportList, nop ), + flagSpec ( "warn-missing-local-sigs", Opt_WarnMissingLocalSigs, nop ), + flagSpec ( "warn-missing-methods", Opt_WarnMissingMethods, nop ), + flagSpec ( "warn-missing-signatures", Opt_WarnMissingSigs, nop ), + flagSpec ( "warn-missing-exported-sigs", Opt_WarnMissingExportedSigs, nop ), + flagSpec ( "warn-monomorphism-restriction", Opt_WarnMonomorphism, nop ), + flagSpec ( "warn-name-shadowing", Opt_WarnNameShadowing, nop ), + flagSpec ( "warn-orphans", Opt_WarnOrphans, nop ), + flagSpec ( "warn-overflowed-literals", Opt_WarnOverflowedLiterals, nop ), + flagSpec ( "warn-overlapping-patterns", Opt_WarnOverlappingPatterns, nop ), + flagSpec ( "warn-pointless-pragmas", Opt_WarnPointlessPragmas, nop ), + flagSpec ( "warn-safe", Opt_WarnSafe, setWarnSafe ), + flagSpec ( "warn-trustworthy-safe", Opt_WarnTrustworthySafe, nop ), + flagSpec ( "warn-tabs", Opt_WarnTabs, nop ), + flagSpec ( "warn-type-defaults", Opt_WarnTypeDefaults, nop ), + flagSpec ( "warn-typed-holes", Opt_WarnTypedHoles, nop ), + flagSpec ( "warn-unrecognised-pragmas", Opt_WarnUnrecognisedPragmas, nop ), + flagSpec ( "warn-unsafe", Opt_WarnUnsafe, setWarnUnsafe ), + flagSpec ( "warn-unsupported-calling-conventions", Opt_WarnUnsupportedCallingConventions, nop ), + flagSpec ( "warn-unsupported-llvm-version", Opt_WarnUnsupportedLlvmVersion, nop ), + flagSpec ( "warn-unused-binds", Opt_WarnUnusedBinds, nop ), + flagSpec ( "warn-unused-do-bind", Opt_WarnUnusedDoBind, nop ), + flagSpec ( "warn-unused-imports", Opt_WarnUnusedImports, nop ), + flagSpec ( "warn-unused-matches", Opt_WarnUnusedMatches, nop ), + flagSpec ( "warn-warnings-deprecations", Opt_WarnWarningsDeprecations, nop ), + flagSpec ( "warn-wrong-do-bind", Opt_WarnWrongDoBind, nop ) ] -- | These @-\<blah\>@ flags can all be reversed with @-no-\<blah\>@ negatableFlags :: [FlagSpec GeneralFlag] negatableFlags = [ - ( "ignore-dot-ghci", Opt_IgnoreDotGhci, nop ) ] + flagGhciSpec ( "ignore-dot-ghci", Opt_IgnoreDotGhci, nop ) ] -- | These @-d\<blah\>@ flags can all be reversed with @-dno-\<blah\>@ dFlags :: [FlagSpec GeneralFlag] dFlags = [ -- See Note [Updating flag description in the User's Guide] +-- See Note [Supporting CLI completion] -- Please keep the list of flags below sorted alphabetically - ( "ppr-case-as-let", Opt_PprCaseAsLet, nop), - ( "suppress-coercions", Opt_SuppressCoercions, nop), - ( "suppress-idinfo", Opt_SuppressIdInfo, nop), - ( "suppress-module-prefixes", Opt_SuppressModulePrefixes, nop), - ( "suppress-type-applications", Opt_SuppressTypeApplications, nop), - ( "suppress-type-signatures", Opt_SuppressTypeSignatures, nop), - ( "suppress-uniques", Opt_SuppressUniques, nop), - ( "suppress-var-kinds", Opt_SuppressVarKinds, nop)] + flagSpec ( "ppr-case-as-let", Opt_PprCaseAsLet, nop), + flagSpec ( "suppress-coercions", Opt_SuppressCoercions, nop), + flagSpec ( "suppress-idinfo", Opt_SuppressIdInfo, nop), + flagSpec ( "suppress-module-prefixes", Opt_SuppressModulePrefixes, nop), + flagSpec ( "suppress-type-applications", Opt_SuppressTypeApplications, nop), + flagSpec ( "suppress-type-signatures", Opt_SuppressTypeSignatures, nop), + flagSpec ( "suppress-uniques", Opt_SuppressUniques, nop), + flagSpec ( "suppress-var-kinds", Opt_SuppressVarKinds, nop)] -- | These @-f\<blah\>@ flags can all be reversed with @-fno-\<blah\>@ fFlags :: [FlagSpec GeneralFlag] fFlags = [ -- See Note [Updating flag description in the User's Guide] +-- See Note [Supporting CLI completion] -- Please keep the list of flags below sorted alphabetically - ( "break-on-error", Opt_BreakOnError, nop ), - ( "break-on-exception", Opt_BreakOnException, nop ), - ( "building-cabal-package", Opt_BuildingCabalPackage, nop ), - ( "call-arity", Opt_CallArity, nop ), - ( "case-merge", Opt_CaseMerge, nop ), - ( "cmm-elim-common-blocks", Opt_CmmElimCommonBlocks, nop ), - ( "cmm-sink", Opt_CmmSink, nop ), - ( "cse", Opt_CSE, nop ), - ( "defer-type-errors", Opt_DeferTypeErrors, nop ), - ( "dicts-cheap", Opt_DictsCheap, nop ), - ( "dicts-strict", Opt_DictsStrict, nop ), - ( "dmd-tx-dict-sel", Opt_DmdTxDictSel, nop ), - ( "do-eta-reduction", Opt_DoEtaReduction, nop ), - ( "do-lambda-eta-expansion", Opt_DoLambdaEtaExpansion, nop ), - ( "eager-blackholing", Opt_EagerBlackHoling, nop ), - ( "embed-manifest", Opt_EmbedManifest, nop ), - ( "enable-rewrite-rules", Opt_EnableRewriteRules, nop ), - ( "error-spans", Opt_ErrorSpans, nop ), - ( "excess-precision", Opt_ExcessPrecision, nop ), - ( "expose-all-unfoldings", Opt_ExposeAllUnfoldings, nop ), - ( "ext-core", Opt_EmitExternalCore, - \_ -> deprecate "it has no effect, and will be removed in GHC 7.12" ), - ( "flat-cache", Opt_FlatCache, nop ), - ( "float-in", Opt_FloatIn, nop ), - ( "force-recomp", Opt_ForceRecomp, nop ), - ( "full-laziness", Opt_FullLaziness, nop ), - ( "fun-to-thunk", Opt_FunToThunk, nop ), - ( "gen-manifest", Opt_GenManifest, nop ), - ( "ghci-history", Opt_GhciHistory, nop ), - ( "ghci-sandbox", Opt_GhciSandbox, nop ), - ( "helpful-errors", Opt_HelpfulErrors, nop ), - ( "hpc", Opt_Hpc, nop ), - ( "hpc-no-auto", Opt_Hpc_No_Auto, nop ), - ( "ignore-asserts", Opt_IgnoreAsserts, nop ), - ( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas, nop ), - ( "implicit-import-qualified", Opt_ImplicitImportQualified, nop ), - ( "irrefutable-tuples", Opt_IrrefutableTuples, nop ), - ( "kill-absence", Opt_KillAbsence, nop), - ( "kill-one-shot", Opt_KillOneShot, nop), - ( "late-dmd-anal", Opt_LateDmdAnal, nop ), - ( "liberate-case", Opt_LiberateCase, nop ), - ( "llvm-pass-vectors-in-regs", Opt_LlvmPassVectorsInRegisters, nop), - ( "llvm-tbaa", Opt_LlvmTBAA, nop), - ( "loopification", Opt_Loopification, nop ), - ( "omit-interface-pragmas", Opt_OmitInterfacePragmas, nop ), - ( "omit-yields", Opt_OmitYields, nop ), - ( "pedantic-bottoms", Opt_PedanticBottoms, nop ), - ( "pre-inlining", Opt_SimplPreInlining, nop ), - ( "print-bind-contents", Opt_PrintBindContents, nop ), - ( "print-bind-result", Opt_PrintBindResult, nop ), - ( "print-evld-with-show", Opt_PrintEvldWithShow, nop ), - ( "print-explicit-foralls", Opt_PrintExplicitForalls, nop ), - ( "print-explicit-kinds", Opt_PrintExplicitKinds, nop ), - ( "prof-cafs", Opt_AutoSccsOnIndividualCafs, nop ), - ( "prof-count-entries", Opt_ProfCountEntries, nop ), - ( "regs-graph", Opt_RegsGraph, nop ), - ( "regs-iterative", Opt_RegsIterative, nop ), - ( "rewrite-rules", Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ), - ( "shared-implib", Opt_SharedImplib, nop ), - ( "simple-list-literals", Opt_SimpleListLiterals, nop ), - ( "spec-constr", Opt_SpecConstr, nop ), - ( "specialise", Opt_Specialise, nop ), - ( "specialise-aggressively", Opt_SpecialiseAggressively, nop ), - ( "static-argument-transformation", Opt_StaticArgumentTransformation, nop ), - ( "strictness", Opt_Strictness, nop ), - ( "use-rpaths", Opt_RPath, nop ), - ( "write-interface", Opt_WriteInterface, nop ), - ( "unbox-small-strict-fields", Opt_UnboxSmallStrictFields, nop ), - ( "unbox-strict-fields", Opt_UnboxStrictFields, nop ), - ( "vectorisation-avoidance", Opt_VectorisationAvoidance, nop ), - ( "vectorise", Opt_Vectorise, nop ) + flagGhciSpec ( "break-on-error", Opt_BreakOnError, nop ), + flagGhciSpec ( "break-on-exception", Opt_BreakOnException, nop ), + flagSpec ( "building-cabal-package", Opt_BuildingCabalPackage, nop ), + flagSpec ( "call-arity", Opt_CallArity, nop ), + flagSpec ( "case-merge", Opt_CaseMerge, nop ), + flagSpec ( "cmm-elim-common-blocks", Opt_CmmElimCommonBlocks, nop ), + flagSpec ( "cmm-sink", Opt_CmmSink, nop ), + flagSpec ( "cse", Opt_CSE, nop ), + flagSpec ( "defer-type-errors", Opt_DeferTypeErrors, nop ), + flagSpec ( "dicts-cheap", Opt_DictsCheap, nop ), + flagSpec ( "dicts-strict", Opt_DictsStrict, nop ), + flagSpec ( "dmd-tx-dict-sel", Opt_DmdTxDictSel, nop ), + flagSpec ( "do-eta-reduction", Opt_DoEtaReduction, nop ), + flagSpec ( "do-lambda-eta-expansion", Opt_DoLambdaEtaExpansion, nop ), + flagSpec ( "eager-blackholing", Opt_EagerBlackHoling, nop ), + flagSpec ( "embed-manifest", Opt_EmbedManifest, nop ), + flagSpec ( "enable-rewrite-rules", Opt_EnableRewriteRules, nop ), + flagSpec ( "error-spans", Opt_ErrorSpans, nop ), + flagSpec ( "excess-precision", Opt_ExcessPrecision, nop ), + flagSpec ( "expose-all-unfoldings", Opt_ExposeAllUnfoldings, nop ), + flagSpec ( "ext-core", Opt_EmitExternalCore, + \_ -> deprecate "it has no effect, and will be removed in GHC 7.12" ), + flagSpec ( "flat-cache", Opt_FlatCache, nop ), + flagSpec ( "float-in", Opt_FloatIn, nop ), + flagSpec ( "force-recomp", Opt_ForceRecomp, nop ), + flagSpec ( "full-laziness", Opt_FullLaziness, nop ), + flagSpec ( "fun-to-thunk", Opt_FunToThunk, nop ), + flagSpec ( "gen-manifest", Opt_GenManifest, nop ), + flagSpec ( "ghci-history", Opt_GhciHistory, nop ), + flagSpec ( "ghci-sandbox", Opt_GhciSandbox, nop ), + flagSpec ( "helpful-errors", Opt_HelpfulErrors, nop ), + flagSpec ( "hpc", Opt_Hpc, nop ), + flagSpec ( "hpc-no-auto", Opt_Hpc_No_Auto, nop ), + flagSpec ( "ignore-asserts", Opt_IgnoreAsserts, nop ), + flagSpec ( "ignore-interface-pragmas", Opt_IgnoreInterfacePragmas, nop ), + flagGhciSpec ( "implicit-import-qualified", Opt_ImplicitImportQualified, nop ), + flagSpec ( "irrefutable-tuples", Opt_IrrefutableTuples, nop ), + flagSpec ( "kill-absence", Opt_KillAbsence, nop), + flagSpec ( "kill-one-shot", Opt_KillOneShot, nop), + flagSpec ( "late-dmd-anal", Opt_LateDmdAnal, nop ), + flagSpec ( "liberate-case", Opt_LiberateCase, nop ), + flagSpec ( "llvm-pass-vectors-in-regs", Opt_LlvmPassVectorsInRegisters, nop), + flagSpec ( "llvm-tbaa", Opt_LlvmTBAA, nop), + flagSpec ( "loopification", Opt_Loopification, nop ), + flagSpec ( "omit-interface-pragmas", Opt_OmitInterfacePragmas, nop ), + flagSpec ( "omit-yields", Opt_OmitYields, nop ), + flagSpec ( "pedantic-bottoms", Opt_PedanticBottoms, nop ), + flagSpec ( "pre-inlining", Opt_SimplPreInlining, nop ), + flagGhciSpec ( "print-bind-contents", Opt_PrintBindContents, nop ), + flagGhciSpec ( "print-bind-result", Opt_PrintBindResult, nop ), + flagGhciSpec ( "print-evld-with-show", Opt_PrintEvldWithShow, nop ), + flagSpec ( "print-explicit-foralls", Opt_PrintExplicitForalls, nop ), + flagSpec ( "print-explicit-kinds", Opt_PrintExplicitKinds, nop ), + flagSpec ( "prof-cafs", Opt_AutoSccsOnIndividualCafs, nop ), + flagSpec ( "prof-count-entries", Opt_ProfCountEntries, nop ), + flagSpec ( "regs-graph", Opt_RegsGraph, nop ), + flagSpec ( "regs-iterative", Opt_RegsIterative, nop ), + flagSpec ( "rewrite-rules", Opt_EnableRewriteRules, useInstead "enable-rewrite-rules" ), + flagSpec ( "shared-implib", Opt_SharedImplib, nop ), + flagSpec ( "simple-list-literals", Opt_SimpleListLiterals, nop ), + flagSpec ( "spec-constr", Opt_SpecConstr, nop ), + flagSpec ( "specialise", Opt_Specialise, nop ), + flagSpec ( "specialise-aggressively", Opt_SpecialiseAggressively, nop ), + flagSpec ( "static-argument-transformation", Opt_StaticArgumentTransformation, nop ), + flagSpec ( "strictness", Opt_Strictness, nop ), + flagSpec ( "use-rpaths", Opt_RPath, nop ), + flagSpec ( "write-interface", Opt_WriteInterface, nop ), + flagSpec ( "unbox-small-strict-fields", Opt_UnboxSmallStrictFields, nop ), + flagSpec ( "unbox-strict-fields", Opt_UnboxStrictFields, nop ), + flagSpec ( "vectorisation-avoidance", Opt_VectorisationAvoidance, nop ), + flagSpec ( "vectorise", Opt_Vectorise, nop ) ] -- | These @-f\<blah\>@ flags can all be reversed with @-fno-\<blah\>@ fLangFlags :: [FlagSpec ExtensionFlag] fLangFlags = [ -- See Note [Updating flag description in the User's Guide] - ( "th", Opt_TemplateHaskell, +-- See Note [Supporting CLI completion] + flagSpec ( "th", Opt_TemplateHaskell, \on -> deprecatedForExtension "TemplateHaskell" on >> checkTemplateHaskellOk on ), - ( "fi", Opt_ForeignFunctionInterface, + flagSpec ( "fi", Opt_ForeignFunctionInterface, deprecatedForExtension "ForeignFunctionInterface" ), - ( "ffi", Opt_ForeignFunctionInterface, + flagSpec ( "ffi", Opt_ForeignFunctionInterface, deprecatedForExtension "ForeignFunctionInterface" ), - ( "arrows", Opt_Arrows, + flagSpec ( "arrows", Opt_Arrows, deprecatedForExtension "Arrows" ), - ( "implicit-prelude", Opt_ImplicitPrelude, + flagSpec ( "implicit-prelude", Opt_ImplicitPrelude, deprecatedForExtension "ImplicitPrelude" ), - ( "bang-patterns", Opt_BangPatterns, + flagSpec ( "bang-patterns", Opt_BangPatterns, deprecatedForExtension "BangPatterns" ), - ( "monomorphism-restriction", Opt_MonomorphismRestriction, + flagSpec ( "monomorphism-restriction", Opt_MonomorphismRestriction, deprecatedForExtension "MonomorphismRestriction" ), - ( "mono-pat-binds", Opt_MonoPatBinds, + flagSpec ( "mono-pat-binds", Opt_MonoPatBinds, deprecatedForExtension "MonoPatBinds" ), - ( "extended-default-rules", Opt_ExtendedDefaultRules, + flagSpec ( "extended-default-rules", Opt_ExtendedDefaultRules, deprecatedForExtension "ExtendedDefaultRules" ), - ( "implicit-params", Opt_ImplicitParams, + flagSpec ( "implicit-params", Opt_ImplicitParams, deprecatedForExtension "ImplicitParams" ), - ( "scoped-type-variables", Opt_ScopedTypeVariables, + flagSpec ( "scoped-type-variables", Opt_ScopedTypeVariables, deprecatedForExtension "ScopedTypeVariables" ), - ( "parr", Opt_ParallelArrays, + flagSpec ( "parr", Opt_ParallelArrays, deprecatedForExtension "ParallelArrays" ), - ( "PArr", Opt_ParallelArrays, + flagSpec ( "PArr", Opt_ParallelArrays, deprecatedForExtension "ParallelArrays" ), - ( "allow-overlapping-instances", Opt_OverlappingInstances, + flagSpec ( "allow-overlapping-instances", Opt_OverlappingInstances, deprecatedForExtension "OverlappingInstances" ), - ( "allow-undecidable-instances", Opt_UndecidableInstances, + flagSpec ( "allow-undecidable-instances", Opt_UndecidableInstances, deprecatedForExtension "UndecidableInstances" ), - ( "allow-incoherent-instances", Opt_IncoherentInstances, + flagSpec ( "allow-incoherent-instances", Opt_IncoherentInstances, deprecatedForExtension "IncoherentInstances" ) ] supportedLanguages :: [String] -supportedLanguages = [ name | (name, _, _) <- languageFlags ] +supportedLanguages = map flagSpecName languageFlags supportedLanguageOverlays :: [String] -supportedLanguageOverlays = [ name | (name, _, _) <- safeHaskellFlags ] +supportedLanguageOverlays = map flagSpecName safeHaskellFlags supportedExtensions :: [String] -supportedExtensions = [ name' | (name, _, _) <- xFlags, name' <- [name, "No" ++ name] ] +supportedExtensions + = concatMap (\name -> [name, "No" ++ name]) (map flagSpecName xFlags) supportedLanguagesAndExtensions :: [String] supportedLanguagesAndExtensions = @@ -2841,8 +2884,8 @@ supportedLanguagesAndExtensions = -- | These -X<blah> flags cannot be reversed with -XNo<blah> languageFlags :: [FlagSpec Language] languageFlags = [ - ( "Haskell98", Haskell98, nop ), - ( "Haskell2010", Haskell2010, nop ) + flagSpec ( "Haskell98", Haskell98, nop ), + flagSpec ( "Haskell2010", Haskell2010, nop ) ] -- | These -X<blah> flags cannot be reversed with -XNo<blah> @@ -2850,122 +2893,123 @@ languageFlags = [ -- features can be used. safeHaskellFlags :: [FlagSpec SafeHaskellMode] safeHaskellFlags = [mkF Sf_Unsafe, mkF Sf_Trustworthy, mkF Sf_Safe] - where mkF flag = (show flag, flag, nop) + where mkF flag = flagSpec (show flag, flag, nop) -- | These -X<blah> flags can all be reversed with -XNo<blah> xFlags :: [FlagSpec ExtensionFlag] xFlags = [ -- See Note [Updating flag description in the User's Guide] +-- See Note [Supporting CLI completion] -- Please keep the list of flags below sorted alphabetically - ( "AllowAmbiguousTypes", Opt_AllowAmbiguousTypes, nop), - ( "AlternativeLayoutRule", Opt_AlternativeLayoutRule, nop ), - ( "AlternativeLayoutRuleTransitional",Opt_AlternativeLayoutRuleTransitional, nop ), - ( "Arrows", Opt_Arrows, nop ), - ( "AutoDeriveTypeable", Opt_AutoDeriveTypeable, nop ), - ( "BangPatterns", Opt_BangPatterns, nop ), - ( "BinaryLiterals", Opt_BinaryLiterals, nop ), - ( "CApiFFI", Opt_CApiFFI, nop ), - ( "CPP", Opt_Cpp, nop ), - ( "ConstrainedClassMethods", Opt_ConstrainedClassMethods, nop ), - ( "ConstraintKinds", Opt_ConstraintKinds, nop ), - ( "DataKinds", Opt_DataKinds, nop ), - ( "DatatypeContexts", Opt_DatatypeContexts, + flagSpec ( "AllowAmbiguousTypes", Opt_AllowAmbiguousTypes, nop), + flagSpec ( "AlternativeLayoutRule", Opt_AlternativeLayoutRule, nop ), + flagSpec ( "AlternativeLayoutRuleTransitional",Opt_AlternativeLayoutRuleTransitional, nop ), + flagSpec ( "Arrows", Opt_Arrows, nop ), + flagSpec ( "AutoDeriveTypeable", Opt_AutoDeriveTypeable, nop ), + flagSpec ( "BangPatterns", Opt_BangPatterns, nop ), + flagSpec ( "BinaryLiterals", Opt_BinaryLiterals, nop ), + flagSpec ( "CApiFFI", Opt_CApiFFI, nop ), + flagSpec ( "CPP", Opt_Cpp, nop ), + flagSpec ( "ConstrainedClassMethods", Opt_ConstrainedClassMethods, nop ), + flagSpec ( "ConstraintKinds", Opt_ConstraintKinds, nop ), + flagSpec ( "DataKinds", Opt_DataKinds, nop ), + flagSpec ( "DatatypeContexts", Opt_DatatypeContexts, \ turn_on -> when turn_on $ deprecate $ "It was widely considered a misfeature, " ++ "and has been removed from the Haskell language." ), - ( "DefaultSignatures", Opt_DefaultSignatures, nop ), - ( "DeriveAnyClass", Opt_DeriveAnyClass, nop ), - ( "DeriveDataTypeable", Opt_DeriveDataTypeable, nop ), - ( "DeriveFoldable", Opt_DeriveFoldable, nop ), - ( "DeriveFunctor", Opt_DeriveFunctor, nop ), - ( "DeriveGeneric", Opt_DeriveGeneric, nop ), - ( "DeriveTraversable", Opt_DeriveTraversable, nop ), - ( "DisambiguateRecordFields", Opt_DisambiguateRecordFields, nop ), - ( "DoAndIfThenElse", Opt_DoAndIfThenElse, nop ), - ( "DoRec", Opt_RecursiveDo, + flagSpec ( "DefaultSignatures", Opt_DefaultSignatures, nop ), + flagSpec ( "DeriveAnyClass", Opt_DeriveAnyClass, nop ), + flagSpec ( "DeriveDataTypeable", Opt_DeriveDataTypeable, nop ), + flagSpec ( "DeriveFoldable", Opt_DeriveFoldable, nop ), + flagSpec ( "DeriveFunctor", Opt_DeriveFunctor, nop ), + flagSpec ( "DeriveGeneric", Opt_DeriveGeneric, nop ), + flagSpec ( "DeriveTraversable", Opt_DeriveTraversable, nop ), + flagSpec ( "DisambiguateRecordFields", Opt_DisambiguateRecordFields, nop ), + flagSpec ( "DoAndIfThenElse", Opt_DoAndIfThenElse, nop ), + flagSpec ( "DoRec", Opt_RecursiveDo, deprecatedForExtension "RecursiveDo" ), - ( "EmptyCase", Opt_EmptyCase, nop ), - ( "EmptyDataDecls", Opt_EmptyDataDecls, nop ), - ( "ExistentialQuantification", Opt_ExistentialQuantification, nop ), - ( "ExplicitForAll", Opt_ExplicitForAll, nop ), - ( "ExplicitNamespaces", Opt_ExplicitNamespaces, nop ), - ( "ExtendedDefaultRules", Opt_ExtendedDefaultRules, nop ), - ( "FlexibleContexts", Opt_FlexibleContexts, nop ), - ( "FlexibleInstances", Opt_FlexibleInstances, nop ), - ( "ForeignFunctionInterface", Opt_ForeignFunctionInterface, nop ), - ( "FunctionalDependencies", Opt_FunctionalDependencies, nop ), - ( "GADTSyntax", Opt_GADTSyntax, nop ), - ( "GADTs", Opt_GADTs, nop ), - ( "GHCForeignImportPrim", Opt_GHCForeignImportPrim, nop ), - ( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving, + flagSpec ( "EmptyCase", Opt_EmptyCase, nop ), + flagSpec ( "EmptyDataDecls", Opt_EmptyDataDecls, nop ), + flagSpec ( "ExistentialQuantification", Opt_ExistentialQuantification, nop ), + flagSpec ( "ExplicitForAll", Opt_ExplicitForAll, nop ), + flagSpec ( "ExplicitNamespaces", Opt_ExplicitNamespaces, nop ), + flagSpec ( "ExtendedDefaultRules", Opt_ExtendedDefaultRules, nop ), + flagSpec ( "FlexibleContexts", Opt_FlexibleContexts, nop ), + flagSpec ( "FlexibleInstances", Opt_FlexibleInstances, nop ), + flagSpec ( "ForeignFunctionInterface", Opt_ForeignFunctionInterface, nop ), + flagSpec ( "FunctionalDependencies", Opt_FunctionalDependencies, nop ), + flagSpec ( "GADTSyntax", Opt_GADTSyntax, nop ), + flagSpec ( "GADTs", Opt_GADTs, nop ), + flagSpec ( "GHCForeignImportPrim", Opt_GHCForeignImportPrim, nop ), + flagSpec ( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving, setGenDeriving ), - ( "ImplicitParams", Opt_ImplicitParams, nop ), - ( "ImplicitPrelude", Opt_ImplicitPrelude, nop ), - ( "ImpredicativeTypes", Opt_ImpredicativeTypes, nop), - ( "IncoherentInstances", Opt_IncoherentInstances, setIncoherentInsts ), - ( "InstanceSigs", Opt_InstanceSigs, nop ), - ( "InterruptibleFFI", Opt_InterruptibleFFI, nop ), - ( "JavaScriptFFI", Opt_JavaScriptFFI, nop ), - ( "KindSignatures", Opt_KindSignatures, nop ), - ( "LambdaCase", Opt_LambdaCase, nop ), - ( "LiberalTypeSynonyms", Opt_LiberalTypeSynonyms, nop ), - ( "MagicHash", Opt_MagicHash, nop ), - ( "MonadComprehensions", Opt_MonadComprehensions, nop), - ( "MonoLocalBinds", Opt_MonoLocalBinds, nop ), - ( "MonoPatBinds", Opt_MonoPatBinds, + flagSpec ( "ImplicitParams", Opt_ImplicitParams, nop ), + flagSpec ( "ImplicitPrelude", Opt_ImplicitPrelude, nop ), + flagSpec ( "ImpredicativeTypes", Opt_ImpredicativeTypes, nop), + flagSpec ( "IncoherentInstances", Opt_IncoherentInstances, setIncoherentInsts ), + flagSpec ( "InstanceSigs", Opt_InstanceSigs, nop ), + flagSpec ( "InterruptibleFFI", Opt_InterruptibleFFI, nop ), + flagSpec ( "JavaScriptFFI", Opt_JavaScriptFFI, nop ), + flagSpec ( "KindSignatures", Opt_KindSignatures, nop ), + flagSpec ( "LambdaCase", Opt_LambdaCase, nop ), + flagSpec ( "LiberalTypeSynonyms", Opt_LiberalTypeSynonyms, nop ), + flagSpec ( "MagicHash", Opt_MagicHash, nop ), + flagSpec ( "MonadComprehensions", Opt_MonadComprehensions, nop), + flagSpec ( "MonoLocalBinds", Opt_MonoLocalBinds, nop ), + flagSpec ( "MonoPatBinds", Opt_MonoPatBinds, \ turn_on -> when turn_on $ deprecate "Experimental feature now removed; has no effect" ), - ( "MonomorphismRestriction", Opt_MonomorphismRestriction, nop ), - ( "MultiParamTypeClasses", Opt_MultiParamTypeClasses, nop ), - ( "MultiWayIf", Opt_MultiWayIf, nop ), - ( "NPlusKPatterns", Opt_NPlusKPatterns, nop ), - ( "NamedFieldPuns", Opt_RecordPuns, nop ), - ( "NegativeLiterals", Opt_NegativeLiterals, nop ), - ( "NondecreasingIndentation", Opt_NondecreasingIndentation, nop ), - ( "NullaryTypeClasses", Opt_NullaryTypeClasses, + flagSpec ( "MonomorphismRestriction", Opt_MonomorphismRestriction, nop ), + flagSpec ( "MultiParamTypeClasses", Opt_MultiParamTypeClasses, nop ), + flagSpec ( "MultiWayIf", Opt_MultiWayIf, nop ), + flagSpec ( "NPlusKPatterns", Opt_NPlusKPatterns, nop ), + flagSpec ( "NamedFieldPuns", Opt_RecordPuns, nop ), + flagSpec ( "NegativeLiterals", Opt_NegativeLiterals, nop ), + flagSpec ( "NondecreasingIndentation", Opt_NondecreasingIndentation, nop ), + flagSpec ( "NullaryTypeClasses", Opt_NullaryTypeClasses, deprecatedForExtension "MultiParamTypeClasses" ), - ( "NumDecimals", Opt_NumDecimals, nop), - ( "OverlappingInstances", Opt_OverlappingInstances, setOverlappingInsts), - ( "OverloadedLists", Opt_OverloadedLists, nop), - ( "OverloadedStrings", Opt_OverloadedStrings, nop ), - ( "PackageImports", Opt_PackageImports, nop ), - ( "ParallelArrays", Opt_ParallelArrays, nop ), - ( "ParallelListComp", Opt_ParallelListComp, nop ), - ( "PatternGuards", Opt_PatternGuards, nop ), - ( "PatternSignatures", Opt_ScopedTypeVariables, + flagSpec ( "NumDecimals", Opt_NumDecimals, nop), + flagSpec ( "OverlappingInstances", Opt_OverlappingInstances, setOverlappingInsts), + flagSpec ( "OverloadedLists", Opt_OverloadedLists, nop), + flagSpec ( "OverloadedStrings", Opt_OverloadedStrings, nop ), + flagSpec ( "PackageImports", Opt_PackageImports, nop ), + flagSpec ( "ParallelArrays", Opt_ParallelArrays, nop ), + flagSpec ( "ParallelListComp", Opt_ParallelListComp, nop ), + flagSpec ( "PatternGuards", Opt_PatternGuards, nop ), + flagSpec ( "PatternSignatures", Opt_ScopedTypeVariables, deprecatedForExtension "ScopedTypeVariables" ), - ( "PatternSynonyms", Opt_PatternSynonyms, nop ), - ( "PolyKinds", Opt_PolyKinds, nop ), - ( "PolymorphicComponents", Opt_RankNTypes, nop), - ( "PostfixOperators", Opt_PostfixOperators, nop ), - ( "QuasiQuotes", Opt_QuasiQuotes, nop ), - ( "Rank2Types", Opt_RankNTypes, nop), - ( "RankNTypes", Opt_RankNTypes, nop ), - ( "RebindableSyntax", Opt_RebindableSyntax, nop ), - ( "RecordPuns", Opt_RecordPuns, + flagSpec ( "PatternSynonyms", Opt_PatternSynonyms, nop ), + flagSpec ( "PolyKinds", Opt_PolyKinds, nop ), + flagSpec ( "PolymorphicComponents", Opt_RankNTypes, nop), + flagSpec ( "PostfixOperators", Opt_PostfixOperators, nop ), + flagSpec ( "QuasiQuotes", Opt_QuasiQuotes, nop ), + flagSpec ( "Rank2Types", Opt_RankNTypes, nop), + flagSpec ( "RankNTypes", Opt_RankNTypes, nop ), + flagSpec ( "RebindableSyntax", Opt_RebindableSyntax, nop ), + flagSpec ( "RecordPuns", Opt_RecordPuns, deprecatedForExtension "NamedFieldPuns" ), - ( "RecordWildCards", Opt_RecordWildCards, nop ), - ( "RecursiveDo", Opt_RecursiveDo, nop ), - ( "RelaxedLayout", Opt_RelaxedLayout, nop ), - ( "RelaxedPolyRec", Opt_RelaxedPolyRec, + flagSpec ( "RecordWildCards", Opt_RecordWildCards, nop ), + flagSpec ( "RecursiveDo", Opt_RecursiveDo, nop ), + flagSpec ( "RelaxedLayout", Opt_RelaxedLayout, nop ), + flagSpec ( "RelaxedPolyRec", Opt_RelaxedPolyRec, \ turn_on -> unless turn_on $ deprecate "You can't turn off RelaxedPolyRec any more" ), - ( "RoleAnnotations", Opt_RoleAnnotations, nop ), - ( "ScopedTypeVariables", Opt_ScopedTypeVariables, nop ), - ( "StandaloneDeriving", Opt_StandaloneDeriving, nop ), - ( "TemplateHaskell", Opt_TemplateHaskell, + flagSpec ( "RoleAnnotations", Opt_RoleAnnotations, nop ), + flagSpec ( "ScopedTypeVariables", Opt_ScopedTypeVariables, nop ), + flagSpec ( "StandaloneDeriving", Opt_StandaloneDeriving, nop ), + flagSpec ( "TemplateHaskell", Opt_TemplateHaskell, checkTemplateHaskellOk ), - ( "TraditionalRecordSyntax", Opt_TraditionalRecordSyntax, nop ), - ( "TransformListComp", Opt_TransformListComp, nop ), - ( "TupleSections", Opt_TupleSections, nop ), - ( "TypeFamilies", Opt_TypeFamilies, nop ), - ( "TypeOperators", Opt_TypeOperators, nop ), - ( "TypeSynonymInstances", Opt_TypeSynonymInstances, nop ), - ( "UnboxedTuples", Opt_UnboxedTuples, nop ), - ( "UndecidableInstances", Opt_UndecidableInstances, nop ), - ( "UnicodeSyntax", Opt_UnicodeSyntax, nop ), - ( "UnliftedFFITypes", Opt_UnliftedFFITypes, nop ), - ( "ViewPatterns", Opt_ViewPatterns, nop ) + flagSpec ( "TraditionalRecordSyntax", Opt_TraditionalRecordSyntax, nop ), + flagSpec ( "TransformListComp", Opt_TransformListComp, nop ), + flagSpec ( "TupleSections", Opt_TupleSections, nop ), + flagSpec ( "TypeFamilies", Opt_TypeFamilies, nop ), + flagSpec ( "TypeOperators", Opt_TypeOperators, nop ), + flagSpec ( "TypeSynonymInstances", Opt_TypeSynonymInstances, nop ), + flagSpec ( "UnboxedTuples", Opt_UnboxedTuples, nop ), + flagSpec ( "UndecidableInstances", Opt_UndecidableInstances, nop ), + flagSpec ( "UnicodeSyntax", Opt_UnicodeSyntax, nop ), + flagSpec ( "UnliftedFFITypes", Opt_UnliftedFFITypes, nop ), + flagSpec ( "ViewPatterns", Opt_ViewPatterns, nop ) ] defaultFlags :: Settings -> [GeneralFlag] diff --git a/compiler/main/StaticFlags.hs b/compiler/main/StaticFlags.hs index 123db17f9f..4b4403a3ea 100644 --- a/compiler/main/StaticFlags.hs +++ b/compiler/main/StaticFlags.hs @@ -119,17 +119,17 @@ staticFlags = unsafePerformIO $ do flagsStatic :: [Flag IO] flagsStatic = [ ------ Debugging ---------------------------------------------------- - Flag "dppr-debug" (PassFlag addOptEwM) - , Flag "dno-debug-output" (PassFlag addOptEwM) + defFlag "dppr-debug" (PassFlag addOptEwM) + , defFlag "dno-debug-output" (PassFlag addOptEwM) -- rest of the debugging flags are dynamic ------ Compiler flags ----------------------------------------------- -- All other "-fno-<blah>" options cancel out "-f<blah>" on the hsc cmdline - , Flag "fno-" + , defFlag "fno-" (PrefixPred (\s -> isStaticFlag ("f"++s)) (\s -> removeOptEwM ("-f"++s))) -- Pass all remaining "-f<blah>" options to hsc - , Flag "f" (AnySuffixPred isStaticFlag addOptEwM) + , defFlag "f" (AnySuffixPred isStaticFlag addOptEwM) ] diff --git a/compiler/typecheck/TcDeriv.lhs b/compiler/typecheck/TcDeriv.lhs index aac4a7b94e..786cea9277 100644 --- a/compiler/typecheck/TcDeriv.lhs +++ b/compiler/typecheck/TcDeriv.lhs @@ -1438,7 +1438,7 @@ checkFlag flag (dflags, _, _) where why = ptext (sLit "You need ") <> text flag_str <+> ptext (sLit "to derive an instance for this class") - flag_str = case [ s | (s, f, _) <- xFlags, f==flag ] of + flag_str = case [ flagSpecName f | f <- xFlags , flagSpecFlag f == flag ] of [s] -> s other -> pprPanic "checkFlag" (ppr other) diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs index 03a67905a7..35a86a5e5a 100644 --- a/ghc/InteractiveUI.hs +++ b/ghc/InteractiveUI.hs @@ -2021,11 +2021,13 @@ showDynFlags show_all dflags = do text "warning settings:" $$ nest 2 (vcat (map (setting wopt) DynFlags.fWarningFlags)) where - setting test (str, f, _) + setting test flag | quiet = empty - | is_on = fstr str - | otherwise = fnostr str - where is_on = test f dflags + | is_on = fstr name + | otherwise = fnostr name + where name = flagSpecName flag + f = flagSpecFlag flag + is_on = test f dflags quiet = not show_all && test f default_dflags == is_on default_dflags = defaultDynFlags (settings dflags) @@ -2033,7 +2035,7 @@ showDynFlags show_all dflags = do fstr str = text "-f" <> text str fnostr str = text "-fno-" <> text str - (ghciFlags,others) = partition (\(_, f, _) -> f `elem` flgs) + (ghciFlags,others) = partition (\f -> flagSpecFlag f `elem` flgs) DynFlags.fFlags flgs = [ Opt_PrintExplicitForalls , Opt_PrintExplicitKinds @@ -2382,11 +2384,13 @@ showLanguages' show_all dflags = nest 2 (vcat (map (setting xopt) DynFlags.xFlags)) ] where - setting test (str, f, _) + setting test flag | quiet = empty - | is_on = text "-X" <> text str - | otherwise = text "-XNo" <> text str - where is_on = test f dflags + | is_on = text "-X" <> text name + | otherwise = text "-XNo" <> text name + where name = flagSpecName flag + f = flagSpecFlag flag + is_on = test f dflags quiet = not show_all && test f default_dflags == is_on default_dflags = diff --git a/ghc/Main.hs b/ghc/Main.hs index 4fd7803f7b..050145dfdb 100644 --- a/ghc/Main.hs +++ b/ghc/Main.hs @@ -107,10 +107,10 @@ main = do case mode of Left preStartupMode -> do case preStartupMode of - ShowSupportedExtensions -> showSupportedExtensions - ShowVersion -> showVersion - ShowNumVersion -> putStrLn cProjectVersion - ShowOptions -> showOptions + ShowSupportedExtensions -> showSupportedExtensions + ShowVersion -> showVersion + ShowNumVersion -> putStrLn cProjectVersion + ShowOptions isInteractive -> showOptions isInteractive Right postStartupMode -> -- start our GHC session GHC.runGhc mbMinusB $ do @@ -378,16 +378,16 @@ type Mode = Either PreStartupMode PostStartupMode type PostStartupMode = Either PreLoadMode PostLoadMode data PreStartupMode - = ShowVersion -- ghc -V/--version - | ShowNumVersion -- ghc --numeric-version - | ShowSupportedExtensions -- ghc --supported-extensions - | ShowOptions -- ghc --show-options + = ShowVersion -- ghc -V/--version + | ShowNumVersion -- ghc --numeric-version + | ShowSupportedExtensions -- ghc --supported-extensions + | ShowOptions Bool {- isInteractive -} -- ghc --show-options showVersionMode, showNumVersionMode, showSupportedExtensionsMode, showOptionsMode :: Mode showVersionMode = mkPreStartupMode ShowVersion showNumVersionMode = mkPreStartupMode ShowNumVersion showSupportedExtensionsMode = mkPreStartupMode ShowSupportedExtensions -showOptionsMode = mkPreStartupMode ShowOptions +showOptionsMode = mkPreStartupMode (ShowOptions False) mkPreStartupMode :: PreStartupMode -> Mode mkPreStartupMode = Left @@ -528,18 +528,18 @@ type ModeM = CmdLineP (Maybe (Mode, String), [String], [Located String]) mode_flags :: [Flag ModeM] mode_flags = [ ------- help / version ---------------------------------------------- - Flag "?" (PassFlag (setMode showGhcUsageMode)) - , Flag "-help" (PassFlag (setMode showGhcUsageMode)) - , Flag "V" (PassFlag (setMode showVersionMode)) - , Flag "-version" (PassFlag (setMode showVersionMode)) - , Flag "-numeric-version" (PassFlag (setMode showNumVersionMode)) - , Flag "-info" (PassFlag (setMode showInfoMode)) - , Flag "-show-options" (PassFlag (setMode showOptionsMode)) - , Flag "-supported-languages" (PassFlag (setMode showSupportedExtensionsMode)) - , Flag "-supported-extensions" (PassFlag (setMode showSupportedExtensionsMode)) - , Flag "-show-packages" (PassFlag (setMode showPackagesMode)) + defFlag "?" (PassFlag (setMode showGhcUsageMode)) + , defFlag "-help" (PassFlag (setMode showGhcUsageMode)) + , defFlag "V" (PassFlag (setMode showVersionMode)) + , defFlag "-version" (PassFlag (setMode showVersionMode)) + , defFlag "-numeric-version" (PassFlag (setMode showNumVersionMode)) + , defFlag "-info" (PassFlag (setMode showInfoMode)) + , defFlag "-show-options" (PassFlag (setMode showOptionsMode)) + , defFlag "-supported-languages" (PassFlag (setMode showSupportedExtensionsMode)) + , defFlag "-supported-extensions" (PassFlag (setMode showSupportedExtensionsMode)) + , defFlag "-show-packages" (PassFlag (setMode showPackagesMode)) ] ++ - [ Flag k' (PassFlag (setMode (printSetting k))) + [ defFlag k' (PassFlag (setMode (printSetting k))) | k <- ["Project version", "Booter version", "Stage", @@ -565,20 +565,20 @@ mode_flags = replaceSpace c = c ] ++ ------- interfaces ---------------------------------------------------- - [ Flag "-show-iface" (HasArg (\f -> setMode (showInterfaceMode f) + [ defFlag "-show-iface" (HasArg (\f -> setMode (showInterfaceMode f) "--show-iface")) ------- primary modes ------------------------------------------------ - , Flag "c" (PassFlag (\f -> do setMode (stopBeforeMode StopLn) f - addFlag "-no-link" f)) - , Flag "M" (PassFlag (setMode doMkDependHSMode)) - , Flag "E" (PassFlag (setMode (stopBeforeMode anyHsc))) - , Flag "C" (PassFlag (setMode (stopBeforeMode HCc))) - , Flag "S" (PassFlag (setMode (stopBeforeMode (As False)))) - , Flag "-make" (PassFlag (setMode doMakeMode)) - , Flag "-interactive" (PassFlag (setMode doInteractiveMode)) - , Flag "-abi-hash" (PassFlag (setMode doAbiHashMode)) - , Flag "e" (SepArg (\s -> setMode (doEvalMode s) "-e")) + , defFlag "c" (PassFlag (\f -> do setMode (stopBeforeMode StopLn) f + addFlag "-no-link" f)) + , defFlag "M" (PassFlag (setMode doMkDependHSMode)) + , defFlag "E" (PassFlag (setMode (stopBeforeMode anyHsc))) + , defFlag "C" (PassFlag (setMode (stopBeforeMode HCc))) + , defFlag "S" (PassFlag (setMode (stopBeforeMode (As False)))) + , defFlag "-make" (PassFlag (setMode doMakeMode)) + , defFlag "-interactive" (PassFlag (setMode doInteractiveMode)) + , defFlag "-abi-hash" (PassFlag (setMode doAbiHashMode)) + , defFlag "e" (SepArg (\s -> setMode (doEvalMode s) "-e")) ] setMode :: Mode -> String -> EwM ModeM () @@ -612,6 +612,14 @@ setMode newMode newFlag = liftEwM $ do errs) -- Saying e.g. --interactive --interactive is OK _ | oldFlag == newFlag -> ((oldMode, oldFlag), errs) + + -- --interactive and --show-options are used together + (Right (Right DoInteractive), Left (ShowOptions _)) -> + ((Left (ShowOptions True), + "--interactive --show-options"), errs) + (Left (ShowOptions _), (Right (Right DoInteractive))) -> + ((Left (ShowOptions True), + "--show-options --interactive"), errs) -- Otherwise, complain _ -> let err = flagMismatchErr oldFlag newFlag in ((oldMode, oldFlag), err : errs) @@ -711,20 +719,19 @@ showSupportedExtensions = mapM_ putStrLn supportedLanguagesAndExtensions showVersion :: IO () showVersion = putStrLn (cProjectName ++ ", version " ++ cProjectVersion) -showOptions :: IO () -showOptions = putStr (unlines availableOptions) +showOptions :: Bool -> IO () +showOptions isInteractive = putStr (unlines availableOptions) where - availableOptions = map ((:) '-') $ - getFlagNames mode_flags ++ - getFlagNames flagsDynamic ++ - (filterUnwantedStatic . getFlagNames $ flagsStatic) ++ - flagsStaticNames - getFlagNames opts = map getFlagName opts - getFlagName (Flag name _) = name + availableOptions = map ('-':) $ + getFlagNames mode_flags ++ + flagsForCompletion isInteractive ++ + (filterUnwantedStatic . getFlagNames $ flagsStatic) ++ + flagsStaticNames + getFlagNames opts = map flagName opts -- this is a hack to get rid of two unwanted entries that get listed -- as static flags. Hopefully this hack will disappear one day together -- with static flags - filterUnwantedStatic = filter (\x -> not (x `elem` ["f", "fno-"])) + filterUnwantedStatic = filter (`notElem`["f", "fno-"]) showGhcUsage :: DynFlags -> IO () showGhcUsage = showUsage False diff --git a/testsuite/tests/driver/T4437.hs b/testsuite/tests/driver/T4437.hs index 1dfaa8b03a..f8b2f98c66 100644 --- a/testsuite/tests/driver/T4437.hs +++ b/testsuite/tests/driver/T4437.hs @@ -8,7 +8,7 @@ import Language.Haskell.Extension main :: IO () main = do - let ghcExtensions = [ ext | (ext, _, _) <- xFlags ] + let ghcExtensions = map flagSpecName xFlags cabalExtensions = map show [ toEnum 0 :: KnownExtension .. ] ghcOnlyExtensions = ghcExtensions \\ cabalExtensions cabalOnlyExtensions = cabalExtensions \\ ghcExtensions |