Skip to content

Commit

Permalink
Report the note when specified in diagnostic::on_unimplemented
Browse files Browse the repository at this point in the history
Signed-off-by: FedericoBruzzone <federico.bruzzone.i@gmail.com>
  • Loading branch information
FedericoBruzzone committed Sep 10, 2024
1 parent adf8d16 commit 5168584
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 47 deletions.
15 changes: 10 additions & 5 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1317,7 +1317,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let actual_prefix = rcvr_ty.prefix_string(self.tcx);
info!("unimplemented_traits.len() == {}", unimplemented_traits.len());
let mut long_ty_file = None;
let (primary_message, label) = if unimplemented_traits.len() == 1
let (primary_message, label, notes) = if unimplemented_traits.len() == 1
&& unimplemented_traits_only
{
unimplemented_traits
Expand All @@ -1327,16 +1327,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if trait_ref.self_ty().references_error() || rcvr_ty.references_error()
{
// Avoid crashing.
return (None, None);
return (None, None, Vec::new());
}
let OnUnimplementedNote { message, label, .. } = self
let OnUnimplementedNote { message, label, notes, .. } = self
.err_ctxt()
.on_unimplemented_note(trait_ref, &obligation, &mut long_ty_file);
(message, label)
(message, label, notes)
})
.unwrap()
} else {
(None, None)
(None, None, Vec::new())
};
let primary_message = primary_message.unwrap_or_else(|| {
format!(
Expand All @@ -1363,6 +1363,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
"the following trait bounds were not satisfied:\n{bound_list}"
));
}
for note in notes {
debug!("FCB {}", note);
err.note(note);
}

suggested_derive = self.suggest_derive(&mut err, unsatisfied_predicates);

unsatisfied_bounds = true;
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/methods/suggest-convert-ptr-to-ref.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ note: the method `to_string` exists on the type `&u8`
= note: the following trait bounds were not satisfied:
`*const u8: std::fmt::Display`
which is required by `*const u8: ToString`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead

error[E0599]: `*mut u8` doesn't implement `std::fmt::Display`
--> $DIR/suggest-convert-ptr-to-ref.rs:8:22
Expand All @@ -25,6 +26,7 @@ note: the method `to_string` exists on the type `&&mut u8`
= note: the following trait bounds were not satisfied:
`*mut u8: std::fmt::Display`
which is required by `*mut u8: ToString`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead

error[E0599]: no method named `make_ascii_lowercase` found for raw pointer `*mut u8` in the current scope
--> $DIR/suggest-convert-ptr-to-ref.rs:9:7
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/traits/custom-on-unimplemented-diagnostic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#[diagnostic::on_unimplemented(message = "my message", label = "my label", note = "my note")]
pub trait ProviderLt {}

pub trait ProviderExt {
fn request<R>(&self) {
todo!()
}
}

impl<T: ?Sized + ProviderLt> ProviderExt for T {}

struct B;

fn main() {
B.request();
}
//~^^ my message [E0599]
//~| my label
//~| my note
32 changes: 32 additions & 0 deletions tests/ui/traits/custom-on-unimplemented-diagnostic.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error[E0599]: my message
--> $DIR/custom-on-unimplemented-diagnostic.rs:15:7
|
LL | struct B;
| -------- method `request` not found for this struct because it doesn't satisfy `B: ProviderExt` or `B: ProviderLt`
...
LL | B.request();
| ^^^^^^^ my label
|
note: trait bound `B: ProviderLt` was not satisfied
--> $DIR/custom-on-unimplemented-diagnostic.rs:10:18
|
LL | impl<T: ?Sized + ProviderLt> ProviderExt for T {}
| ^^^^^^^^^^ ----------- -
| |
| unsatisfied trait bound introduced here
= note: my note
note: the trait `ProviderLt` must be implemented
--> $DIR/custom-on-unimplemented-diagnostic.rs:2:1
|
LL | pub trait ProviderLt {}
| ^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
note: `ProviderExt` defines an item `request`, perhaps you need to implement it
--> $DIR/custom-on-unimplemented-diagnostic.rs:4:1
|
LL | pub trait ProviderExt {
| ^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0599`.
15 changes: 15 additions & 0 deletions tests/ui/traits/on-unimplemented-diagnostic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
pub trait ProviderLt {}

pub trait ProviderExt {
fn request<R>(&self) {
todo!()
}
}

impl<T: ?Sized + ProviderLt> ProviderExt for T {}

struct B;

fn main() {
B.request(); //~ ERROR 14:7: 14:14: the method `request` exists for struct `B`, but its trait bounds were not satisfied [E0599]
}
31 changes: 31 additions & 0 deletions tests/ui/traits/on-unimplemented-diagnostic.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
error[E0599]: the method `request` exists for struct `B`, but its trait bounds were not satisfied
--> $DIR/on-unimplemented-diagnostic.rs:14:7
|
LL | struct B;
| -------- method `request` not found for this struct because it doesn't satisfy `B: ProviderExt` or `B: ProviderLt`
...
LL | B.request();
| ^^^^^^^ method cannot be called on `B` due to unsatisfied trait bounds
|
note: trait bound `B: ProviderLt` was not satisfied
--> $DIR/on-unimplemented-diagnostic.rs:9:18
|
LL | impl<T: ?Sized + ProviderLt> ProviderExt for T {}
| ^^^^^^^^^^ ----------- -
| |
| unsatisfied trait bound introduced here
note: the trait `ProviderLt` must be implemented
--> $DIR/on-unimplemented-diagnostic.rs:1:1
|
LL | pub trait ProviderLt {}
| ^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
note: `ProviderExt` defines an item `request`, perhaps you need to implement it
--> $DIR/on-unimplemented-diagnostic.rs:3:1
|
LL | pub trait ProviderExt {
| ^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0599`.
17 changes: 0 additions & 17 deletions tests/ui/traits/on_unimplemented_long_types.rs

This file was deleted.

25 changes: 0 additions & 25 deletions tests/ui/traits/on_unimplemented_long_types.stderr

This file was deleted.

0 comments on commit 5168584

Please sign in to comment.