5568c569c0
This commit fixes several issues with the format string parsing of the `#[diagnostic::on_unimplemented]` attribute that were pointed out by @ehuss. In detail it fixes: * Appearing format specifiers (display, etc). For these we generate a warning that the specifier is unsupported. Otherwise we ignore them * Positional arguments. For these we generate a warning that positional arguments are unsupported in that location and replace them with the format string equivalent (so `{}` or `{n}` where n is the index of the positional argument) * Broken format strings with enclosed }. For these we generate a warning about the broken format string and set the emitted message literally to the provided unformatted string * Unknown format specifiers. For these we generate an additional warning about the unknown specifier. Otherwise we emit the literal string as message. This essentially makes those strings behave like `format!` with the minor difference that we do not generate hard errors but only warnings. After that we continue trying to do something unsuprising (mostly either ignoring the broken parts or falling back to just giving back the literal string as provided). Fix #122391
194 lines
6.5 KiB
Plaintext
194 lines
6.5 KiB
Plaintext
warning: unmatched `}` found
|
|
--> $DIR/broken_format.rs:1:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "{{Test } thing")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: `#[warn(unknown_or_malformed_diagnostic_attributes)]` on by default
|
|
|
|
warning: positional format arguments are not allowed here
|
|
--> $DIR/broken_format.rs:6:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {}")]
|
|
| ^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: only named format arguments with the name of one of the generic types are allowed in this context
|
|
|
|
warning: positional format arguments are not allowed here
|
|
--> $DIR/broken_format.rs:11:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {1:}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: only named format arguments with the name of one of the generic types are allowed in this context
|
|
|
|
warning: invalid format specifier
|
|
--> $DIR/broken_format.rs:16:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:123}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: no format specifier are supported in this position
|
|
|
|
warning: expected `'}'`, found `'!'`
|
|
--> $DIR/broken_format.rs:21:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:!}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
warning: unmatched `}` found
|
|
--> $DIR/broken_format.rs:21:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:!}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
warning: unmatched `}` found
|
|
--> $DIR/broken_format.rs:1:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "{{Test } thing")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
error[E0277]: {{Test } thing
|
|
--> $DIR/broken_format.rs:35:13
|
|
|
|
|
LL | check_1(());
|
|
| ------- ^^ the trait `ImportantTrait1` is not implemented for `()`
|
|
| |
|
|
| required by a bound introduced by this call
|
|
|
|
|
help: this trait has no implementations, consider adding one
|
|
--> $DIR/broken_format.rs:4:1
|
|
|
|
|
LL | trait ImportantTrait1 {}
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
note: required by a bound in `check_1`
|
|
--> $DIR/broken_format.rs:28:20
|
|
|
|
|
LL | fn check_1(_: impl ImportantTrait1) {}
|
|
| ^^^^^^^^^^^^^^^ required by this bound in `check_1`
|
|
|
|
warning: positional format arguments are not allowed here
|
|
--> $DIR/broken_format.rs:6:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {}")]
|
|
| ^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: only named format arguments with the name of one of the generic types are allowed in this context
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
error[E0277]: Test {}
|
|
--> $DIR/broken_format.rs:37:13
|
|
|
|
|
LL | check_2(());
|
|
| ------- ^^ the trait `ImportantTrait2` is not implemented for `()`
|
|
| |
|
|
| required by a bound introduced by this call
|
|
|
|
|
help: this trait has no implementations, consider adding one
|
|
--> $DIR/broken_format.rs:9:1
|
|
|
|
|
LL | trait ImportantTrait2 {}
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
note: required by a bound in `check_2`
|
|
--> $DIR/broken_format.rs:29:20
|
|
|
|
|
LL | fn check_2(_: impl ImportantTrait2) {}
|
|
| ^^^^^^^^^^^^^^^ required by this bound in `check_2`
|
|
|
|
warning: positional format arguments are not allowed here
|
|
--> $DIR/broken_format.rs:11:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {1:}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: only named format arguments with the name of one of the generic types are allowed in this context
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
error[E0277]: Test {1}
|
|
--> $DIR/broken_format.rs:39:13
|
|
|
|
|
LL | check_3(());
|
|
| ------- ^^ the trait `ImportantTrait3` is not implemented for `()`
|
|
| |
|
|
| required by a bound introduced by this call
|
|
|
|
|
help: this trait has no implementations, consider adding one
|
|
--> $DIR/broken_format.rs:14:1
|
|
|
|
|
LL | trait ImportantTrait3 {}
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
note: required by a bound in `check_3`
|
|
--> $DIR/broken_format.rs:30:20
|
|
|
|
|
LL | fn check_3(_: impl ImportantTrait3) {}
|
|
| ^^^^^^^^^^^^^^^ required by this bound in `check_3`
|
|
|
|
warning: invalid format specifier
|
|
--> $DIR/broken_format.rs:16:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:123}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= help: no format specifier are supported in this position
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
error[E0277]: Test ()
|
|
--> $DIR/broken_format.rs:41:13
|
|
|
|
|
LL | check_4(());
|
|
| ------- ^^ the trait `ImportantTrait4` is not implemented for `()`
|
|
| |
|
|
| required by a bound introduced by this call
|
|
|
|
|
help: this trait has no implementations, consider adding one
|
|
--> $DIR/broken_format.rs:19:1
|
|
|
|
|
LL | trait ImportantTrait4 {}
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
note: required by a bound in `check_4`
|
|
--> $DIR/broken_format.rs:31:20
|
|
|
|
|
LL | fn check_4(_: impl ImportantTrait4) {}
|
|
| ^^^^^^^^^^^^^^^ required by this bound in `check_4`
|
|
|
|
warning: expected `'}'`, found `'!'`
|
|
--> $DIR/broken_format.rs:21:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:!}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
warning: unmatched `}` found
|
|
--> $DIR/broken_format.rs:21:32
|
|
|
|
|
LL | #[diagnostic::on_unimplemented(message = "Test {Self:!}")]
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
|
|
error[E0277]: Test {Self:!}
|
|
--> $DIR/broken_format.rs:43:13
|
|
|
|
|
LL | check_5(());
|
|
| ------- ^^ the trait `ImportantTrait5` is not implemented for `()`
|
|
| |
|
|
| required by a bound introduced by this call
|
|
|
|
|
help: this trait has no implementations, consider adding one
|
|
--> $DIR/broken_format.rs:26:1
|
|
|
|
|
LL | trait ImportantTrait5 {}
|
|
| ^^^^^^^^^^^^^^^^^^^^^
|
|
note: required by a bound in `check_5`
|
|
--> $DIR/broken_format.rs:32:20
|
|
|
|
|
LL | fn check_5(_: impl ImportantTrait5) {}
|
|
| ^^^^^^^^^^^^^^^ required by this bound in `check_5`
|
|
|
|
error: aborting due to 5 previous errors; 12 warnings emitted
|
|
|
|
For more information about this error, try `rustc --explain E0277`.
|