Skip to content

Commit

Permalink
Auto merge of #114787 - compiler-errors:issue-114783, r=jackh726
Browse files Browse the repository at this point in the history
Select obligations before processing wf obligation in `compare_method_predicate_entailment`

We need to select obligations before processing the WF obligation for the `IMPLIED_BOUNDS_ENTAILMENT` lint, since it skips over type variables.

Fixes #114783

r? `@jackh726`
  • Loading branch information
bors committed Aug 14, 2023
2 parents e81522a + b6b5a65 commit 3071e0a
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
11 changes: 10 additions & 1 deletion compiler/rustc_hir_analysis/src/check/compare_impl_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,15 @@ fn compare_method_predicate_entailment<'tcx>(
}

if check_implied_wf == CheckImpliedWfMode::Check && !(impl_sig, trait_sig).references_error() {
// Select obligations to make progress on inference before processing
// the wf obligation below.
// FIXME(-Ztrait-solver=next): Not needed when the hack below is removed.
let errors = ocx.select_where_possible();
if !errors.is_empty() {
let reported = infcx.err_ctxt().report_fulfillment_errors(&errors);
return Err(reported);
}

// See #108544. Annoying, we can end up in cases where, because of winnowing,
// we pick param env candidates over a more general impl, leading to more
// stricter lifetime requirements than we would otherwise need. This can
Expand Down Expand Up @@ -378,7 +387,7 @@ fn compare_method_predicate_entailment<'tcx>(
// lifetime parameters.
let outlives_env = OutlivesEnvironment::with_bounds(
param_env,
infcx.implied_bounds_tys(param_env, impl_m_def_id, wf_tys.clone()),
infcx.implied_bounds_tys(param_env, impl_m_def_id, wf_tys),
);
let errors = infcx.resolve_regions(&outlives_env);
if !errors.is_empty() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// check-pass

pub trait Foo {
type Error: Error;

fn foo(&self, stream: &<Self::Error as Error>::Span);
}

pub struct Wrapper<Inner>(Inner);

impl<E: Error, Inner> Foo for Wrapper<Inner>
where
Inner: Foo<Error = E>,
{
type Error = E;

fn foo(&self, stream: &<Self::Error as Error>::Span) {
todo!()
}
}

pub trait Error {
type Span;
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// check-pass

trait AsBufferView {
type Device;
}

trait Error {
type Span;
}

trait Foo {
type Error: Error;
fn foo(&self) -> &<Self::Error as Error>::Span;
}

impl<D: Error, VBuf0> Foo for VBuf0
where
VBuf0: AsBufferView<Device = D>,
{
type Error = D;
fn foo(&self) -> &<Self::Error as Error>::Span {
todo!()
}
}

fn main() {}

0 comments on commit 3071e0a

Please sign in to comment.