diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 34f636d0b9a12..18a57f78a5037 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 { + 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::>(), + let result = run(|| run_compiler(&get_args(), &mut RustcDefaultCalls, None, None)); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index bbaa7bc2fb65e..f682f6aa763c5 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::>(); - 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> { + 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) }