about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCameron Steffen <cam.steffen94@gmail.com>2021-06-27 18:15:16 -0500
committerCameron Steffen <cam.steffen94@gmail.com>2021-06-30 13:28:15 -0500
commit2a60f090b9d39e5600dcbcf83229bbaec2f02176 (patch)
treef877b21ba28cf7dc22d9e464e5fd2380d6f91139
parent3ddb78a34608848a60f6ca5b6ccfde8340302372 (diff)
downloadrust-2a60f090b9d39e5600dcbcf83229bbaec2f02176.tar.gz
rust-2a60f090b9d39e5600dcbcf83229bbaec2f02176.zip
Add suggestion for missing compile flag group
-rw-r--r--compiler/rustc_driver/src/lib.rs17
-rw-r--r--src/test/ui/invalid-compile-flags/codegen-option-without-group.rs1
-rw-r--r--src/test/ui/invalid-compile-flags/codegen-option-without-group.stderr2
-rw-r--r--src/test/ui/invalid-compile-flags/debug-option-without-group.rs1
-rw-r--r--src/test/ui/invalid-compile-flags/debug-option-without-group.stderr2
5 files changed, 19 insertions, 4 deletions
diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs
index 35a6495946f..2ad2820fac0 100644
--- a/compiler/rustc_driver/src/lib.rs
+++ b/compiler/rustc_driver/src/lib.rs
@@ -29,7 +29,7 @@ use rustc_middle::middle::cstore::MetadataLoader;
 use rustc_save_analysis as save;
 use rustc_save_analysis::DumpHandler;
 use rustc_serialize::json::{self, ToJson};
-use rustc_session::config::nightly_options;
+use rustc_session::config::{nightly_options, CG_OPTIONS, DB_OPTIONS};
 use rustc_session::config::{ErrorOutputType, Input, OutputType, PrintRequest, TrimmedDefPaths};
 use rustc_session::getopts;
 use rustc_session::lint::{Lint, LintId};
@@ -1017,9 +1017,18 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
     for option in config::rustc_optgroups() {
         (option.apply)(&mut options);
     }
-    let matches = options
-        .parse(args)
-        .unwrap_or_else(|f| early_error(ErrorOutputType::default(), &f.to_string()));
+    let matches = options.parse(args).unwrap_or_else(|e| {
+        let msg = match e {
+            getopts::Fail::UnrecognizedOption(ref opt) => CG_OPTIONS
+                .iter()
+                .map(|&(name, ..)| ('C', name))
+                .chain(DB_OPTIONS.iter().map(|&(name, ..)| ('Z', name)))
+                .find(|&(_, name)| *opt == name.replace("_", "-"))
+                .map(|(flag, _)| format!("{}. Did you mean `-{} {}`?", e, flag, opt)),
+            _ => None,
+        };
+        early_error(ErrorOutputType::default(), &msg.unwrap_or_else(|| e.to_string()));
+    });
 
     // For all options we just parsed, we check a few aspects:
     //
diff --git a/src/test/ui/invalid-compile-flags/codegen-option-without-group.rs b/src/test/ui/invalid-compile-flags/codegen-option-without-group.rs
new file mode 100644
index 00000000000..7bbf47a3839
--- /dev/null
+++ b/src/test/ui/invalid-compile-flags/codegen-option-without-group.rs
@@ -0,0 +1 @@
+// compile-flags: --llvm-args
diff --git a/src/test/ui/invalid-compile-flags/codegen-option-without-group.stderr b/src/test/ui/invalid-compile-flags/codegen-option-without-group.stderr
new file mode 100644
index 00000000000..c5a0c29cad9
--- /dev/null
+++ b/src/test/ui/invalid-compile-flags/codegen-option-without-group.stderr
@@ -0,0 +1,2 @@
+error: Unrecognized option: 'llvm-args'. Did you mean `-C llvm-args`?
+
diff --git a/src/test/ui/invalid-compile-flags/debug-option-without-group.rs b/src/test/ui/invalid-compile-flags/debug-option-without-group.rs
new file mode 100644
index 00000000000..86e40c17854
--- /dev/null
+++ b/src/test/ui/invalid-compile-flags/debug-option-without-group.rs
@@ -0,0 +1 @@
+// compile-flags: --unpretty=hir
diff --git a/src/test/ui/invalid-compile-flags/debug-option-without-group.stderr b/src/test/ui/invalid-compile-flags/debug-option-without-group.stderr
new file mode 100644
index 00000000000..0e57e31ad3d
--- /dev/null
+++ b/src/test/ui/invalid-compile-flags/debug-option-without-group.stderr
@@ -0,0 +1,2 @@
+error: Unrecognized option: 'unpretty'. Did you mean `-Z unpretty`?
+