Skip to content

rustc should accept the same flag multiple times #122987

Closed
@RalfJung

Description

@RalfJung

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-CLIArea: Command-line interface (CLI) to the compilerC-enhancementCategory: An issue proposing an enhancement or a PR with one.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions