on_unimplemented format strings either error or warn or ignore various formatting issues · Issue #122391 · rust-lang/rust (original) (raw)

The following are some unexpected behaviors I see with the formatting strings in the diagnostic::on_unimplemented attribute. I'm not sure that the on_unimplemented attribute should actually be using std's format parsing, but if it is, the following seem like issues with the current implementation.

Broken formatting is ignored

#[diagnostic::on_unimplemented(message = "Test } thing")] trait ImportantTrait {}

Anything after the } is ignored, and not included in the message output.

Expectation: There should be a warning that the string is malformed.

Empty or positional arguments cause an error

#[diagnostic::on_unimplemented(message = "Test {}")] trait ImportantTrait {}

or

#[diagnostic::on_unimplemented(message = "Test {1:}")] trait ImportantTrait {}

These generate an error. However, my understanding of the attribute is that it tries to only generate warnings for things it doesn't understand. I would expect this to also generate a warning.

Format options are ignored

#[diagnostic::on_unimplemented(message = "Test {Self:123}")] trait ImportantTrait {}

This does not generate a warning or error. I would expect it to generate a warning that anything after the : is ignored. This includes width, precision, debug formatting, etc.

Invalid format options do weird things

#[diagnostic::on_unimplemented(message = "Test {Self:!}")] trait ImportantTrait {}

The error message generated with this is the type followed by a !. I would expect this to generate a warning that the format arguments are not valid (similar to how format! works).

Meta

rustc --version --verbose:

rustc 1.78.0-nightly (4a0cc881d 2024-03-11)
binary: rustc
commit-hash: 4a0cc881dcc4d800f10672747f61a94377ff6662
commit-date: 2024-03-11
host: aarch64-apple-darwin
release: 1.78.0-nightly
LLVM version: 18.1.0

cc @weiznich