Add more ICEs due to malformed diagnostic::on_unimplemented

This commit is contained in:
Michael Goulet 2024-05-07 23:12:22 -04:00
parent a60f077c38
commit a8f2e33eec
4 changed files with 56 additions and 35 deletions

View File

@ -1,2 +1,26 @@
#[diagnostic::on_unimplemented(aa = "broken")]
pub trait Test {}
pub trait MissingAttr {}
#[diagnostic::on_unimplemented(label = "a", label = "b")]
pub trait DuplicateAttr {}
#[diagnostic::on_unimplemented = "broken"]
pub trait NotMetaList {}
#[diagnostic::on_unimplemented]
pub trait Empty {}
#[diagnostic::on_unimplemented {}]
pub trait WrongDelim {}
#[diagnostic::on_unimplemented(label = "{A:.3}")]
pub trait BadFormatter<A> {}
#[diagnostic::on_unimplemented(label = "test {}")]
pub trait NoImplicitArgs {}
#[diagnostic::on_unimplemented(label = "{missing}")]
pub trait MissingArg {}
#[diagnostic::on_unimplemented(label = "{_}")]
pub trait BadArg {}

View File

@ -0,0 +1,31 @@
//@ edition:2021
//@ aux-build:bad_on_unimplemented.rs
// Do not ICE when encountering a malformed `#[diagnostic::on_unimplemented]` annotation in a
// dependency when incorrectly used (#124651).
extern crate bad_on_unimplemented;
use bad_on_unimplemented::*;
fn missing_attr<T: MissingAttr>(_: T) {}
fn duplicate_attr<T: DuplicateAttr>(_: T) {}
fn not_meta_list<T: NotMetaList>(_: T) {}
fn empty<T: Empty>(_: T) {}
fn wrong_delim<T: WrongDelim>(_: T) {}
fn bad_formatter<T: BadFormatter<()>>(_: T) {}
fn no_implicit_args<T: NoImplicitArgs>(_: T) {}
fn missing_arg<T: MissingArg>(_: T) {}
fn bad_arg<T: BadArg>(_: T) {}
fn main() {
missing_attr(()); //~ ERROR E0277
duplicate_attr(()); //~ ERROR E0277
not_meta_list(()); //~ ERROR E0277
empty(()); //~ ERROR E0277
wrong_delim(()); //~ ERROR E0277
bad_formatter(()); //~ ERROR E0277
no_implicit_args(()); //~ ERROR E0277
missing_arg(()); //~ ERROR E0277
bad_arg(()); //~ ERROR E0277
}

View File

@ -1,17 +0,0 @@
//@ edition:2021
//@ compile-flags:--test
//@ aux-build:bad_on_unimplemented.rs
// Do not ICE when encountering a malformed `#[diagnostic::on_unimplemented]` annotation in a
// dependency when incorrectly used (#124651).
extern crate bad_on_unimplemented;
use bad_on_unimplemented::Test;
fn breakage<T: Test>(_: T) {}
#[test]
fn test() {
breakage(1); //~ ERROR E0277
}

View File

@ -1,17 +0,0 @@
error[E0277]: the trait bound `{integer}: Test` is not satisfied
--> $DIR/on_unimplemented_ice.rs:16:14
|
LL | breakage(1);
| -------- ^ the trait `Test` is not implemented for `{integer}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `breakage`
--> $DIR/on_unimplemented_ice.rs:12:16
|
LL | fn breakage<T: Test>(_: T) {}
| ^^^^ required by this bound in `breakage`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.