Skip to content

Commit

Permalink
Rollup merge of #105181 - bhbs:skip-note, r=estebank
Browse files Browse the repository at this point in the history
Don't add a note for implementing a trait if its inner type is erroneous

Fix #105138
  • Loading branch information
Yuki Okushi authored Dec 3, 2022
2 parents 019795b + 715d4a8 commit 8f36866
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 15 deletions.
35 changes: 20 additions & 15 deletions compiler/rustc_trait_selection/src/traits/select/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -371,23 +371,28 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {

if !candidate_set.ambiguous && no_candidates_apply {
let trait_ref = stack.obligation.predicate.skip_binder().trait_ref;
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();
let self_desc = if self_ty.has_concrete_skeleton() {
Some(self_ty.to_string())
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();
let self_desc = if self_ty.has_concrete_skeleton() {
Some(self_ty.to_string())
} else {
None
};
(trait_desc, self_desc)
});
let cause = if let Conflict::Upstream = conflict {
IntercrateAmbiguityCause::UpstreamCrateUpdate {
trait_desc,
self_desc,
}
} else {
None
IntercrateAmbiguityCause::DownstreamCrate { trait_desc, self_desc }
};
(trait_desc, self_desc)
});
let cause = if let Conflict::Upstream = conflict {
IntercrateAmbiguityCause::UpstreamCrateUpdate { trait_desc, self_desc }
} else {
IntercrateAmbiguityCause::DownstreamCrate { trait_desc, self_desc }
};
debug!(?cause, "evaluate_stack: pushing cause");
self.intercrate_ambiguity_causes.as_mut().unwrap().insert(cause);
debug!(?cause, "evaluate_stack: pushing cause");
self.intercrate_ambiguity_causes.as_mut().unwrap().insert(cause);
}
}
}
}
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/trait-bounds/impl-bound-with-references-error.rs
Original file line number Diff line number Diff line change
@@ -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() {}
24 changes: 24 additions & 0 deletions src/test/ui/trait-bounds/impl-bound-with-references-error.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 8f36866

Please sign in to comment.