Rollup merge of #105181 - bhbs:skip-note, r=estebank

Don't add a note for implementing a trait if its inner type is erroneous

Fix #105138
This commit is contained in:
Yuki Okushi 2022-12-03 12:51:29 +09:00 committed by GitHub
commit 8f368666b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 15 deletions

View File

@ -371,6 +371,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
if !candidate_set.ambiguous && no_candidates_apply {
let trait_ref = stack.obligation.predicate.skip_binder().trait_ref;
if !trait_ref.references_error() {
let self_ty = trait_ref.self_ty();
let (trait_desc, self_desc) = with_no_trimmed_paths!({
let trait_desc = trait_ref.print_only_trait_path().to_string();
@ -382,7 +383,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
(trait_desc, self_desc)
});
let cause = if let Conflict::Upstream = conflict {
IntercrateAmbiguityCause::UpstreamCrateUpdate { trait_desc, self_desc }
IntercrateAmbiguityCause::UpstreamCrateUpdate {
trait_desc,
self_desc,
}
} else {
IntercrateAmbiguityCause::DownstreamCrate { trait_desc, self_desc }
};
@ -391,6 +395,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
}
}
}
}
return Ok(None);
}

View File

@ -0,0 +1,20 @@
// Regression test for #105138.
// This test ensures that the compiler does not add note
// for implementation of trait whose inner type is erroneous.
pub enum LabelText {
Plain,
}
impl<T> From<T> for LabelText
//~^ ERROR conflicting implementations of trait `From<LabelText>` for type `LabelText` [E0119]
where
T: Into<Cow<'static, str>>,
//~^ ERROR cannot find type `Cow` in this scope [E0412]
{
fn from(text: T) -> Self {
LabelText::Plain(text.into())
}
}
fn main() {}

View File

@ -0,0 +1,24 @@
error[E0412]: cannot find type `Cow` in this scope
--> $DIR/impl-bound-with-references-error.rs:12:13
|
LL | T: Into<Cow<'static, str>>,
| ^^^ not found in this scope
|
help: consider importing this enum
|
LL | use std::borrow::Cow;
|
error[E0119]: conflicting implementations of trait `From<LabelText>` for type `LabelText`
--> $DIR/impl-bound-with-references-error.rs:9:1
|
LL | impl<T> From<T> for LabelText
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0119, E0412.
For more information about an error, try `rustc --explain E0119`.