Description
For flags that take a single value, rustc should accept the same flag multiple times, with the last flag taking precedence. Currently, when things like --sysroot
or --edition
are set multiple times, that raises an error: "Option 'foo' given more than once". This is extremely problematic when one tries to build up a command-line argument in a compositional way: there are some default flags, and then some component wants to override some defaults, and then the user has a chance to overwrite even more. It's just impossible to do this right now and e.g. change the default edition to 2021 while still giving later / higher-level components the chance to overwrite that default.
This causes problems like compiler-explorer/compiler-explorer#5429, makes compiler-explorer/compiler-explorer#5349 harder to work around, and is also a pain for Miri where we have to do a lot of rustc command-line patching to get cargo and rustdoc to interpret code rather than execute it. It's a problem for ui_test where we usually want the default edition to not be 2015, but may want to overwrite the edition on a per-test basis -- now ui_test needs to support special //@edition
annotations even though //@compile-flags
should be more than enough. I'm sure this list could be continued for a while.
As far as I know, it is fairly standard to allow flags to occur multiple times and have e.g. later values of --edition
overwrite earlier ones, thus enabling constructs like rustc file.rs --edition 2021 $USER_FLAGS
where the user can choose a different edition if they like.
Cc @rust-lang/compiler