diff options
| author | Josh Stone <jistone@redhat.com> | 2017-05-18 16:11:22 -0700 |
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2017-05-18 16:11:22 -0700 |
| commit | e86588e2286ac2c0fb4763bf2d8c3046d0abcc22 (patch) | |
| tree | 3c690d41d83eca466d9d0faba0f46badd72b5c70 | |
| parent | 0ed1ec9f9eb8174273867343d01177b5ac13ff4c (diff) | |
| download | rust-e86588e2286ac2c0fb4763bf2d8c3046d0abcc22.tar.gz rust-e86588e2286ac2c0fb4763bf2d8c3046d0abcc22.zip | |
Give a nicer error for non-Unicode arguments to rustc and rustdoc
Previously, any non-Unicode argument would panic rustc: ``` $ rustc $'foo\x80bar' error: internal compiler error: unexpected panic note: the compiler unexpectedly panicked. this is a bug. note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports thread 'rustc' panicked at 'called `Result::unwrap()` on an `Err` value: "foo�bar"', /checkout/src/libcore/result.rs:859 note: Run with `RUST_BACKTRACE=1` for a backtrace. ``` Now it gives a clean error: ``` $ rustc $'foo\x80bar' error: Argument 1 is not valid Unicode: "foo�bar" ``` Maybe fixes #15890, although we still can't *compile* arbitrary file names.
| -rw-r--r-- | src/librustc_driver/lib.rs | 11 | ||||
| -rw-r--r-- | src/librustdoc/lib.rs | 11 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 34f636d0b9a..18a57f78a50 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -1148,9 +1148,18 @@ pub fn diagnostics_registry() -> errors::registry::Registry { Registry::new(&all_errors) } +fn get_args() -> Vec<String> { + env::args_os().enumerate() + .map(|(i, arg)| arg.into_string().unwrap_or_else(|arg| { + early_error(ErrorOutputType::default(), + &format!("Argument {} is not valid Unicode: {:?}", i, arg)) + })) + .collect() +} + pub fn main() { env_logger::init().unwrap(); - let result = run(|| run_compiler(&env::args().collect::<Vec<_>>(), + let result = run(|| run_compiler(&get_args(), &mut RustcDefaultCalls, None, None)); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index bbaa7bc2fb6..f682f6aa763 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -107,12 +107,19 @@ pub fn main() { const STACK_SIZE: usize = 32_000_000; // 32MB env_logger::init().unwrap(); let res = std::thread::Builder::new().stack_size(STACK_SIZE).spawn(move || { - let s = env::args().collect::<Vec<_>>(); - main_args(&s) + get_args().map(|args| main_args(&args)).unwrap_or(1) }).unwrap().join().unwrap_or(101); process::exit(res as i32); } +fn get_args() -> Option<Vec<String>> { + env::args_os().enumerate() + .map(|(i, arg)| arg.into_string().map_err(|arg| { + print_error(format!("Argument {} is not valid Unicode: {:?}", i, arg)); + }).ok()) + .collect() +} + fn stable(g: getopts::OptGroup) -> RustcOptGroup { RustcOptGroup::stable(g) } fn unstable(g: getopts::OptGroup) -> RustcOptGroup { RustcOptGroup::unstable(g) } |
