Auto merge of #124683 - estebank:issue-124651, r=compiler-errors

Do not ICE on foreign malformed `diagnostic::on_unimplemented`

Fix #124651.
This commit is contained in:
bors 2024-05-08 00:54:38 +00:00
commit a60f077c38
4 changed files with 44 additions and 6 deletions

View File

@ -499,12 +499,14 @@ impl<'tcx> OnUnimplementedDirective {
}
if is_diagnostic_namespace_variant {
tcx.emit_node_span_lint(
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
vec![item.span()],
MalformedOnUnimplementedAttrLint::new(item.span()),
);
if let Some(def_id) = item_def_id.as_local() {
tcx.emit_node_span_lint(
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
tcx.local_def_id_to_hir_id(def_id),
vec![item.span()],
MalformedOnUnimplementedAttrLint::new(item.span()),
);
}
} else {
// nothing found
tcx.dcx().emit_err(NoValueInOnUnimplemented { span: item.span() });

View File

@ -0,0 +1,2 @@
#[diagnostic::on_unimplemented(aa = "broken")]
pub trait Test {}

View File

@ -0,0 +1,17 @@
//@ 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

@ -0,0 +1,17 @@
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`.