From 5629efc513ad87a1a43f6b0e6921858d1f7ff64f Mon Sep 17 00:00:00 2001 From: beetrees Date: Mon, 15 May 2023 18:34:32 +0000 Subject: [PATCH 1/4] Make `arg_expand_all` not short-circuit on first error --- compiler/rustc_driver_impl/src/args.rs | 43 +++++++++++++------ compiler/rustc_driver_impl/src/lib.rs | 2 +- src/librustdoc/lib.rs | 2 +- src/tools/tidy/src/ui_tests.rs | 6 +-- .../commandline-argfile-badutf8.args | 0 .../commandline-argfile-badutf8.rs | 2 +- .../commandline-argfile-badutf8.stderr | 2 + .../argfile}/commandline-argfile-missing.rs | 2 +- .../commandline-argfile-missing.stderr | 2 + .../argfile/commandline-argfile-multiple.rs | 14 ++++++ .../commandline-argfile-multiple.stderr | 6 +++ .../{ => argfile}/commandline-argfile.args | 0 .../{ => argfile}/commandline-argfile.rs | 2 +- .../commandline-argfile-badutf8.stderr | 2 - .../commandline-argfile-missing.stderr | 2 - .../commandline-argfile-badutf8.args | 0 .../commandline-argfile-badutf8.rs | 2 +- .../commandline-argfile-badutf8.stderr | 2 + .../argfile}/commandline-argfile-missing.rs | 2 +- .../commandline-argfile-missing.stderr | 2 + .../argfile/commandline-argfile-multiple.rs | 14 ++++++ .../commandline-argfile-multiple.stderr | 6 +++ .../ui/{ => argfile}/commandline-argfile.args | 0 tests/ui/{ => argfile}/commandline-argfile.rs | 2 +- tests/ui/commandline-argfile-badutf8.stderr | 2 - tests/ui/commandline-argfile-missing.stderr | 2 - 26 files changed, 88 insertions(+), 33 deletions(-) rename tests/rustdoc-ui/{ => argfile}/commandline-argfile-badutf8.args (100%) rename tests/rustdoc-ui/{ => argfile}/commandline-argfile-badutf8.rs (69%) create mode 100644 tests/rustdoc-ui/argfile/commandline-argfile-badutf8.stderr rename tests/{ui => rustdoc-ui/argfile}/commandline-argfile-missing.rs (81%) create mode 100644 tests/rustdoc-ui/argfile/commandline-argfile-missing.stderr create mode 100644 tests/rustdoc-ui/argfile/commandline-argfile-multiple.rs create mode 100644 tests/rustdoc-ui/argfile/commandline-argfile-multiple.stderr rename tests/rustdoc-ui/{ => argfile}/commandline-argfile.args (100%) rename tests/rustdoc-ui/{ => argfile}/commandline-argfile.rs (72%) delete mode 100644 tests/rustdoc-ui/commandline-argfile-badutf8.stderr delete mode 100644 tests/rustdoc-ui/commandline-argfile-missing.stderr rename tests/ui/{ => argfile}/commandline-argfile-badutf8.args (100%) rename tests/ui/{ => argfile}/commandline-argfile-badutf8.rs (69%) create mode 100644 tests/ui/argfile/commandline-argfile-badutf8.stderr rename tests/{rustdoc-ui => ui/argfile}/commandline-argfile-missing.rs (81%) create mode 100644 tests/ui/argfile/commandline-argfile-missing.stderr create mode 100644 tests/ui/argfile/commandline-argfile-multiple.rs create mode 100644 tests/ui/argfile/commandline-argfile-multiple.stderr rename tests/ui/{ => argfile}/commandline-argfile.args (100%) rename tests/ui/{ => argfile}/commandline-argfile.rs (72%) delete mode 100644 tests/ui/commandline-argfile-badutf8.stderr delete mode 100644 tests/ui/commandline-argfile-missing.stderr diff --git a/compiler/rustc_driver_impl/src/args.rs b/compiler/rustc_driver_impl/src/args.rs index 654d7636da200..5f6fdaaa47c3d 100644 --- a/compiler/rustc_driver_impl/src/args.rs +++ b/compiler/rustc_driver_impl/src/args.rs @@ -1,3 +1,5 @@ +use rustc_session::config::ErrorOutputType; +use rustc_span::ErrorGuaranteed; use std::error; use std::fmt; use std::fs; @@ -5,47 +7,60 @@ use std::io; use rustc_session::EarlyErrorHandler; -fn arg_expand(arg: String) -> Result, Error> { +fn arg_expand(arg: &str) -> Result, Error> { if let Some(path) = arg.strip_prefix('@') { let file = match fs::read_to_string(path) { Ok(file) => file, Err(ref err) if err.kind() == io::ErrorKind::InvalidData => { - return Err(Error::Utf8Error(Some(path.to_string()))); + return Err(Error::Utf8Error(path.to_string())); } Err(err) => return Err(Error::IOError(path.to_string(), err)), }; Ok(file.lines().map(ToString::to_string).collect()) } else { - Ok(vec![arg]) + Ok(vec![arg.to_string()]) } } +/// Replaces any `@file` arguments with the contents of `file`, with each line of `file` as a +/// separate argument. +/// /// **Note:** This function doesn't interpret argument 0 in any special way. /// If this function is intended to be used with command line arguments, /// `argv[0]` must be removed prior to calling it manually. -pub fn arg_expand_all(handler: &EarlyErrorHandler, at_args: &[String]) -> Vec { - let mut args = Vec::new(); +pub fn arg_expand_all( + handler: &EarlyErrorHandler, + at_args: &[String], +) -> Result, ErrorGuaranteed> { + let mut res = Ok(Vec::new()); for arg in at_args { - match arg_expand(arg.clone()) { - Ok(arg) => args.extend(arg), - Err(err) => handler.early_error(format!("Failed to load argument file: {err}")), + match arg_expand(arg) { + Ok(arg) => { + if let Ok(args) = &mut res { + args.extend(arg) + } + } + Err(err) => { + res = + Err(handler + .early_error_no_abort(format!("failed to load argument file: {err}"))) + } } } - args + res } #[derive(Debug)] -pub enum Error { - Utf8Error(Option), +enum Error { + Utf8Error(String), IOError(String, io::Error), } impl fmt::Display for Error { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Error::Utf8Error(None) => write!(fmt, "Utf8 error"), - Error::Utf8Error(Some(path)) => write!(fmt, "Utf8 error in {path}"), - Error::IOError(path, err) => write!(fmt, "IO Error: {path}: {err}"), + Error::Utf8Error(path) => write!(fmt, "UTF-8 error in {path}"), + Error::IOError(path, err) => write!(fmt, "IO error: {path}: {err}"), } } } diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 7bbed0877f07b..0a1735f414781 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -280,7 +280,7 @@ fn run_compiler( // the compiler with @empty_file as argv[0] and no more arguments. let at_args = at_args.get(1..).unwrap_or_default(); - let args = args::arg_expand_all(&early_error_handler, at_args); + let args = args::arg_expand_all(&early_error_handler, at_args)?; let Some(matches) = handle_options(&early_error_handler, &args) else { return Ok(()) }; diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 8220df5d4f373..e97cdedc35b93 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -715,7 +715,7 @@ fn main_args(handler: &mut EarlyErrorHandler, at_args: &[String]) -> MainResult // the compiler with @empty_file as argv[0] and no more arguments. let at_args = at_args.get(1..).unwrap_or_default(); - let args = rustc_driver::args::arg_expand_all(handler, at_args); + let args = rustc_driver::args::arg_expand_all(handler, at_args)?; let mut options = getopts::Options::new(); for option in opts() { diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs index 3414924007b90..0f2bf5afb2fc2 100644 --- a/src/tools/tidy/src/ui_tests.rs +++ b/src/tools/tidy/src/ui_tests.rs @@ -11,7 +11,7 @@ use std::path::{Path, PathBuf}; const ENTRY_LIMIT: usize = 900; // FIXME: The following limits should be reduced eventually. const ISSUES_ENTRY_LIMIT: usize = 1891; -const ROOT_ENTRY_LIMIT: usize = 866; +const ROOT_ENTRY_LIMIT: usize = 860; const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[ "rs", // test source files @@ -25,8 +25,8 @@ const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[ const EXTENSION_EXCEPTION_PATHS: &[&str] = &[ "tests/ui/asm/named-asm-labels.s", // loading an external asm file to test named labels lint "tests/ui/check-cfg/my-awesome-platform.json", // testing custom targets with cfgs - "tests/ui/commandline-argfile-badutf8.args", // passing args via a file - "tests/ui/commandline-argfile.args", // passing args via a file + "tests/ui/argfile/commandline-argfile-badutf8.args", // passing args via a file + "tests/ui/argfile/commandline-argfile.args", // passing args via a file "tests/ui/crate-loading/auxiliary/libfoo.rlib", // testing loading a manually created rlib "tests/ui/include-macros/data.bin", // testing including data with the include macros "tests/ui/include-macros/file.txt", // testing including data with the include macros diff --git a/tests/rustdoc-ui/commandline-argfile-badutf8.args b/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.args similarity index 100% rename from tests/rustdoc-ui/commandline-argfile-badutf8.args rename to tests/rustdoc-ui/argfile/commandline-argfile-badutf8.args diff --git a/tests/rustdoc-ui/commandline-argfile-badutf8.rs b/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.rs similarity index 69% rename from tests/rustdoc-ui/commandline-argfile-badutf8.rs rename to tests/rustdoc-ui/argfile/commandline-argfile-badutf8.rs index e2984e3ca97ac..7b0ca8872c188 100644 --- a/tests/rustdoc-ui/commandline-argfile-badutf8.rs +++ b/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.rs @@ -1,6 +1,6 @@ // Check to see if we can get parameters from an @argsfile file // -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-badutf8.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-badutf8.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.stderr b/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.stderr new file mode 100644 index 0000000000000..b4c0d4c20d75f --- /dev/null +++ b/tests/rustdoc-ui/argfile/commandline-argfile-badutf8.stderr @@ -0,0 +1,2 @@ +error: failed to load argument file: UTF-8 error in $DIR/commandline-argfile-badutf8.args + diff --git a/tests/ui/commandline-argfile-missing.rs b/tests/rustdoc-ui/argfile/commandline-argfile-missing.rs similarity index 81% rename from tests/ui/commandline-argfile-missing.rs rename to tests/rustdoc-ui/argfile/commandline-argfile-missing.rs index 5a6465bd06469..b209aa4b1859c 100644 --- a/tests/ui/commandline-argfile-missing.rs +++ b/tests/rustdoc-ui/argfile/commandline-argfile-missing.rs @@ -2,7 +2,7 @@ // // normalize-stderr-test: "os error \d+" -> "os error $$ERR" // normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING " -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-missing.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-missing.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/rustdoc-ui/argfile/commandline-argfile-missing.stderr b/tests/rustdoc-ui/argfile/commandline-argfile-missing.stderr new file mode 100644 index 0000000000000..28a20debf1cca --- /dev/null +++ b/tests/rustdoc-ui/argfile/commandline-argfile-missing.stderr @@ -0,0 +1,2 @@ +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) + diff --git a/tests/rustdoc-ui/argfile/commandline-argfile-multiple.rs b/tests/rustdoc-ui/argfile/commandline-argfile-multiple.rs new file mode 100644 index 0000000000000..2ddc0b10d8c1f --- /dev/null +++ b/tests/rustdoc-ui/argfile/commandline-argfile-multiple.rs @@ -0,0 +1,14 @@ +// Check to see if we can get parameters from an @argsfile file +// +// normalize-stderr-test: "os error \d+" -> "os error $$ERR" +// normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING " +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-missing.args @{{src-base}}/argfile/commandline-argfile-badutf8.args @{{src-base}}/argfile/commandline-argfile-missing2.args + +#[cfg(not(cmdline_set))] +compile_error!("cmdline_set not set"); + +#[cfg(not(unbroken))] +compile_error!("unbroken not set"); + +fn main() { +} diff --git a/tests/rustdoc-ui/argfile/commandline-argfile-multiple.stderr b/tests/rustdoc-ui/argfile/commandline-argfile-multiple.stderr new file mode 100644 index 0000000000000..f9a6bb784bffd --- /dev/null +++ b/tests/rustdoc-ui/argfile/commandline-argfile-multiple.stderr @@ -0,0 +1,6 @@ +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) + +error: failed to load argument file: UTF-8 error in $DIR/commandline-argfile-badutf8.args + +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing2.args: No such file or directory (os error $ERR) + diff --git a/tests/rustdoc-ui/commandline-argfile.args b/tests/rustdoc-ui/argfile/commandline-argfile.args similarity index 100% rename from tests/rustdoc-ui/commandline-argfile.args rename to tests/rustdoc-ui/argfile/commandline-argfile.args diff --git a/tests/rustdoc-ui/commandline-argfile.rs b/tests/rustdoc-ui/argfile/commandline-argfile.rs similarity index 72% rename from tests/rustdoc-ui/commandline-argfile.rs rename to tests/rustdoc-ui/argfile/commandline-argfile.rs index cc8c8722c1c35..82fcbc202184f 100644 --- a/tests/rustdoc-ui/commandline-argfile.rs +++ b/tests/rustdoc-ui/argfile/commandline-argfile.rs @@ -1,7 +1,7 @@ // Check to see if we can get parameters from an @argsfile file // // check-pass -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/rustdoc-ui/commandline-argfile-badutf8.stderr b/tests/rustdoc-ui/commandline-argfile-badutf8.stderr deleted file mode 100644 index 9af6fc0a518df..0000000000000 --- a/tests/rustdoc-ui/commandline-argfile-badutf8.stderr +++ /dev/null @@ -1,2 +0,0 @@ -error: Failed to load argument file: Utf8 error in $DIR/commandline-argfile-badutf8.args - diff --git a/tests/rustdoc-ui/commandline-argfile-missing.stderr b/tests/rustdoc-ui/commandline-argfile-missing.stderr deleted file mode 100644 index 179ad83100419..0000000000000 --- a/tests/rustdoc-ui/commandline-argfile-missing.stderr +++ /dev/null @@ -1,2 +0,0 @@ -error: Failed to load argument file: IO Error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) - diff --git a/tests/ui/commandline-argfile-badutf8.args b/tests/ui/argfile/commandline-argfile-badutf8.args similarity index 100% rename from tests/ui/commandline-argfile-badutf8.args rename to tests/ui/argfile/commandline-argfile-badutf8.args diff --git a/tests/ui/commandline-argfile-badutf8.rs b/tests/ui/argfile/commandline-argfile-badutf8.rs similarity index 69% rename from tests/ui/commandline-argfile-badutf8.rs rename to tests/ui/argfile/commandline-argfile-badutf8.rs index e2984e3ca97ac..7b0ca8872c188 100644 --- a/tests/ui/commandline-argfile-badutf8.rs +++ b/tests/ui/argfile/commandline-argfile-badutf8.rs @@ -1,6 +1,6 @@ // Check to see if we can get parameters from an @argsfile file // -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-badutf8.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-badutf8.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/ui/argfile/commandline-argfile-badutf8.stderr b/tests/ui/argfile/commandline-argfile-badutf8.stderr new file mode 100644 index 0000000000000..b4c0d4c20d75f --- /dev/null +++ b/tests/ui/argfile/commandline-argfile-badutf8.stderr @@ -0,0 +1,2 @@ +error: failed to load argument file: UTF-8 error in $DIR/commandline-argfile-badutf8.args + diff --git a/tests/rustdoc-ui/commandline-argfile-missing.rs b/tests/ui/argfile/commandline-argfile-missing.rs similarity index 81% rename from tests/rustdoc-ui/commandline-argfile-missing.rs rename to tests/ui/argfile/commandline-argfile-missing.rs index 5a6465bd06469..b209aa4b1859c 100644 --- a/tests/rustdoc-ui/commandline-argfile-missing.rs +++ b/tests/ui/argfile/commandline-argfile-missing.rs @@ -2,7 +2,7 @@ // // normalize-stderr-test: "os error \d+" -> "os error $$ERR" // normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING " -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-missing.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-missing.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/ui/argfile/commandline-argfile-missing.stderr b/tests/ui/argfile/commandline-argfile-missing.stderr new file mode 100644 index 0000000000000..28a20debf1cca --- /dev/null +++ b/tests/ui/argfile/commandline-argfile-missing.stderr @@ -0,0 +1,2 @@ +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) + diff --git a/tests/ui/argfile/commandline-argfile-multiple.rs b/tests/ui/argfile/commandline-argfile-multiple.rs new file mode 100644 index 0000000000000..2ddc0b10d8c1f --- /dev/null +++ b/tests/ui/argfile/commandline-argfile-multiple.rs @@ -0,0 +1,14 @@ +// Check to see if we can get parameters from an @argsfile file +// +// normalize-stderr-test: "os error \d+" -> "os error $$ERR" +// normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING " +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile-missing.args @{{src-base}}/argfile/commandline-argfile-badutf8.args @{{src-base}}/argfile/commandline-argfile-missing2.args + +#[cfg(not(cmdline_set))] +compile_error!("cmdline_set not set"); + +#[cfg(not(unbroken))] +compile_error!("unbroken not set"); + +fn main() { +} diff --git a/tests/ui/argfile/commandline-argfile-multiple.stderr b/tests/ui/argfile/commandline-argfile-multiple.stderr new file mode 100644 index 0000000000000..f9a6bb784bffd --- /dev/null +++ b/tests/ui/argfile/commandline-argfile-multiple.stderr @@ -0,0 +1,6 @@ +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) + +error: failed to load argument file: UTF-8 error in $DIR/commandline-argfile-badutf8.args + +error: failed to load argument file: IO error: $DIR/commandline-argfile-missing2.args: No such file or directory (os error $ERR) + diff --git a/tests/ui/commandline-argfile.args b/tests/ui/argfile/commandline-argfile.args similarity index 100% rename from tests/ui/commandline-argfile.args rename to tests/ui/argfile/commandline-argfile.args diff --git a/tests/ui/commandline-argfile.rs b/tests/ui/argfile/commandline-argfile.rs similarity index 72% rename from tests/ui/commandline-argfile.rs rename to tests/ui/argfile/commandline-argfile.rs index fc1ba0c8d677d..9895180f78ac6 100644 --- a/tests/ui/commandline-argfile.rs +++ b/tests/ui/argfile/commandline-argfile.rs @@ -1,7 +1,7 @@ // Check to see if we can get parameters from an @argsfile file // // build-pass -// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile.args +// compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile.args #[cfg(not(cmdline_set))] compile_error!("cmdline_set not set"); diff --git a/tests/ui/commandline-argfile-badutf8.stderr b/tests/ui/commandline-argfile-badutf8.stderr deleted file mode 100644 index 9af6fc0a518df..0000000000000 --- a/tests/ui/commandline-argfile-badutf8.stderr +++ /dev/null @@ -1,2 +0,0 @@ -error: Failed to load argument file: Utf8 error in $DIR/commandline-argfile-badutf8.args - diff --git a/tests/ui/commandline-argfile-missing.stderr b/tests/ui/commandline-argfile-missing.stderr deleted file mode 100644 index 179ad83100419..0000000000000 --- a/tests/ui/commandline-argfile-missing.stderr +++ /dev/null @@ -1,2 +0,0 @@ -error: Failed to load argument file: IO Error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) - From 7a2e583c55d79f0efc99d18c5f3cd8e4d82129be Mon Sep 17 00:00:00 2001 From: beetrees Date: Mon, 15 May 2023 18:35:14 +0000 Subject: [PATCH 2/4] Refactor argument UTF-8 checking into `rustc_driver::args::raw_args()` --- compiler/rustc_driver_impl/src/args.rs | 29 +++++++++++++++++++++----- compiler/rustc_driver_impl/src/lib.rs | 13 ++---------- src/librustdoc/lib.rs | 25 ++++------------------ 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/compiler/rustc_driver_impl/src/args.rs b/compiler/rustc_driver_impl/src/args.rs index 5f6fdaaa47c3d..3a1a08f458a32 100644 --- a/compiler/rustc_driver_impl/src/args.rs +++ b/compiler/rustc_driver_impl/src/args.rs @@ -1,9 +1,5 @@ -use rustc_session::config::ErrorOutputType; use rustc_span::ErrorGuaranteed; -use std::error; -use std::fmt; -use std::fs; -use std::io; +use std::{env, error, fmt, fs, io}; use rustc_session::EarlyErrorHandler; @@ -50,6 +46,29 @@ pub fn arg_expand_all( res } +/// Gets the raw unprocessed command-line arguments as Unicode strings, without doing any further +/// processing (e.g., without `@file` expansion). +/// +/// This function is identical to [`env::args()`] except that it emits an error when it encounters +/// non-Unicode arguments instead of panicking. +pub fn raw_args(handler: &EarlyErrorHandler) -> Result, ErrorGuaranteed> { + let mut res = Ok(Vec::new()); + for (i, arg) in env::args_os().enumerate() { + match arg.into_string() { + Ok(arg) => { + if let Ok(args) = &mut res { + args.push(arg); + } + } + Err(arg) => { + res = Err(handler + .early_error_no_abort(format!("argument {i} is not valid Unicode: {arg:?}"))) + } + } + } + res +} + #[derive(Debug)] enum Error { Utf8Error(String), diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 0a1735f414781..230f473975c51 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -1565,17 +1565,8 @@ pub fn main() -> ! { signal_handler::install(); let mut callbacks = TimePassesCallbacks::default(); install_ice_hook(DEFAULT_BUG_REPORT_URL, |_| ()); - let exit_code = catch_with_exit_code(|| { - let args = env::args_os() - .enumerate() - .map(|(i, arg)| { - arg.into_string().unwrap_or_else(|arg| { - handler.early_error(format!("argument {i} is not valid Unicode: {arg:?}")) - }) - }) - .collect::>(); - RunCompiler::new(&args, &mut callbacks).run() - }); + let exit_code = + catch_with_exit_code(|| RunCompiler::new(&args::raw_args(&handler)?, &mut callbacks).run()); if let Some(format) = callbacks.time_passes { let end_rss = get_resident_set_size(); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index e97cdedc35b93..31952ef4b3249 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -175,19 +175,15 @@ pub fn main() { init_logging(&handler); rustc_driver::init_env_logger(&handler, "RUSTDOC_LOG"); - let exit_code = rustc_driver::catch_with_exit_code(|| match get_args(&handler) { - Some(args) => main_args(&mut handler, &args), - _ => - { - #[allow(deprecated)] - Err(ErrorGuaranteed::unchecked_claim_error_was_emitted()) - } + let exit_code = rustc_driver::catch_with_exit_code(|| { + let at_args = rustc_driver::args::raw_args(&handler)?; + main_args(&mut handler, &at_args) }); process::exit(exit_code); } fn init_logging(handler: &EarlyErrorHandler) { - let color_logs = match std::env::var("RUSTDOC_LOG_COLOR").as_deref() { + let color_logs = match env::var("RUSTDOC_LOG_COLOR").as_deref() { Ok("always") => true, Ok("never") => false, Ok("auto") | Err(VarError::NotPresent) => io::stdout().is_terminal(), @@ -217,19 +213,6 @@ fn init_logging(handler: &EarlyErrorHandler) { tracing::subscriber::set_global_default(subscriber).unwrap(); } -fn get_args(handler: &EarlyErrorHandler) -> Option> { - env::args_os() - .enumerate() - .map(|(i, arg)| { - arg.into_string() - .map_err(|arg| { - handler.early_warn(format!("Argument {i} is not valid Unicode: {arg:?}")); - }) - .ok() - }) - .collect() -} - fn opts() -> Vec { let stable: fn(_, fn(&mut getopts::Options) -> &mut _) -> _ = RustcOptGroup::stable; let unstable: fn(_, fn(&mut getopts::Options) -> &mut _) -> _ = RustcOptGroup::unstable; From 7a3ce2de6a607e2bab2214c2a40e6f25db56128c Mon Sep 17 00:00:00 2001 From: beetrees Date: Mon, 15 May 2023 18:37:47 +0000 Subject: [PATCH 3/4] Use `rustc_driver::args::raw_args()` in Clippy --- src/tools/clippy/src/driver.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/clippy/src/driver.rs b/src/tools/clippy/src/driver.rs index 1d89477dcc16b..05e02a4087144 100644 --- a/src/tools/clippy/src/driver.rs +++ b/src/tools/clippy/src/driver.rs @@ -209,7 +209,7 @@ pub fn main() { }); exit(rustc_driver::catch_with_exit_code(move || { - let mut orig_args: Vec = env::args().collect(); + let mut orig_args: Vec = rustc_driver::args::raw_args(&handler)?; let has_sysroot_arg = arg_value(&orig_args, "--sysroot", |_| true).is_some(); let sys_root_env = std::env::var("SYSROOT").ok(); From 9eb689a565d37487c5b8cf5cfeab06bc83183a89 Mon Sep 17 00:00:00 2001 From: beetrees Date: Mon, 15 May 2023 21:22:18 +0100 Subject: [PATCH 4/4] Use `rustc_driver::args::raw_args()` in Miri --- src/tools/miri/src/bin/miri.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tools/miri/src/bin/miri.rs b/src/tools/miri/src/bin/miri.rs index 97718f1f4a9f7..229de9f6adb99 100644 --- a/src/tools/miri/src/bin/miri.rs +++ b/src/tools/miri/src/bin/miri.rs @@ -291,6 +291,8 @@ fn main() { // (`install_ice_hook` might change `RUST_BACKTRACE`.) let env_snapshot = env::vars_os().collect::>(); + let args = rustc_driver::args::raw_args(&handler).unwrap_or_else(|_| std::process::exit(rustc_driver::EXIT_FAILURE)); + // If the environment asks us to actually be rustc, then do that. if let Some(crate_kind) = env::var_os("MIRI_BE_RUSTC") { // Earliest rustc setup. @@ -307,7 +309,7 @@ fn main() { // We cannot use `rustc_driver::main` as we need to adjust the CLI arguments. run_compiler( - env::args().collect(), + args, target_crate, &mut MiriBeRustCompilerCalls { target_crate }, ) @@ -328,7 +330,7 @@ fn main() { // If user has explicitly enabled/disabled isolation let mut isolation_enabled: Option = None; - for arg in env::args() { + for arg in args { if rustc_args.is_empty() { // Very first arg: binary name. rustc_args.push(arg);