diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-09-17 17:28:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-17 17:28:31 +0200 |
| commit | fe3428d9acd26c9cc0cb9281e218b7e9c870aa49 (patch) | |
| tree | 56034de949c1c564bd0902bdc877485121afa1d3 /compiler | |
| parent | 11fe22c3fbc8fd32c8aaf4f48240bfe5ae75bc66 (diff) | |
| parent | ae75a9b33aef4bdd03f33bc75bdf44fe3a48356d (diff) | |
| download | rust-fe3428d9acd26c9cc0cb9281e218b7e9c870aa49.tar.gz rust-fe3428d9acd26c9cc0cb9281e218b7e9c870aa49.zip | |
Rollup merge of #128961 - GKFX:issue-128930-explain-missing-option, r=jieyouxu
Fix #128930: Print documentation of CLI options missing their arg
Fix #128930. Failing to give an argument to CLI options which require it now prints something like:
```
$ rustc --print
error: Argument to option 'print' missing
Usage:
--print [crate-name|file-names|sysroot|target-libdir|cfg|check-cfg|calling-conventions|target-list|target-cpus|target-features|relocation-models|code-models|tls-models|target-spec-json|all-target-specs-json|native-static-libs|stack-protector-strategies|link-args|deployment-target]
Compiler information to print on stdout
```
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_driver_impl/src/lib.rs | 17 | ||||
| -rw-r--r-- | compiler/rustc_session/src/config.rs | 2 |
2 files changed, 16 insertions, 3 deletions
diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 9d4061d16a1..9d856e2466f 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -1218,17 +1218,30 @@ pub fn handle_options(early_dcx: &EarlyDiagCtxt, args: &[String]) -> Option<geto // Parse with *all* options defined in the compiler, we don't worry about // option stability here we just want to parse as much as possible. let mut options = getopts::Options::new(); - for option in config::rustc_optgroups() { + let optgroups = config::rustc_optgroups(); + for option in &optgroups { (option.apply)(&mut options); } let matches = options.parse(args).unwrap_or_else(|e| { - let msg = match e { + let msg: Option<String> = match e { getopts::Fail::UnrecognizedOption(ref opt) => CG_OPTIONS .iter() .map(|&(name, ..)| ('C', name)) .chain(Z_OPTIONS.iter().map(|&(name, ..)| ('Z', name))) .find(|&(_, name)| *opt == name.replace('_', "-")) .map(|(flag, _)| format!("{e}. Did you mean `-{flag} {opt}`?")), + getopts::Fail::ArgumentMissing(ref opt) => { + optgroups.iter().find(|option| option.name == opt).map(|option| { + // Print the help just for the option in question. + let mut options = getopts::Options::new(); + (option.apply)(&mut options); + // getopt requires us to pass a function for joining an iterator of + // strings, even though in this case we expect exactly one string. + options.usage_with_format(|it| { + it.fold(format!("{e}\nUsage:"), |a, b| a + "\n" + &b) + }) + }) + } _ => None, }; early_dcx.early_fatal(msg.unwrap_or_else(|| e.to_string())); diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index 908d50a041e..1132d0efebf 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -1376,7 +1376,7 @@ enum OptionStability { pub struct RustcOptGroup { pub apply: Box<dyn Fn(&mut getopts::Options) -> &mut getopts::Options>, - name: &'static str, + pub name: &'static str, stability: OptionStability, } |
