Auto merge of #80132 - matthewjasper:revert-eval-order, r=nikomatsakis
Revert change to trait evaluation order This change breaks some code and doesn't appear to enable any new code. closes #79902 r? `@nikomatsakis`
This commit is contained in:
commit
1b6b06a03a
2 changed files with 42 additions and 3 deletions
|
@ -334,7 +334,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
fn vtable_impl(
|
fn vtable_impl(
|
||||||
&mut self,
|
&mut self,
|
||||||
impl_def_id: DefId,
|
impl_def_id: DefId,
|
||||||
mut substs: Normalized<'tcx, SubstsRef<'tcx>>,
|
substs: Normalized<'tcx, SubstsRef<'tcx>>,
|
||||||
cause: ObligationCause<'tcx>,
|
cause: ObligationCause<'tcx>,
|
||||||
recursion_depth: usize,
|
recursion_depth: usize,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
|
@ -356,9 +356,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
// relying on projections in the impl-trait-ref.
|
// relying on projections in the impl-trait-ref.
|
||||||
//
|
//
|
||||||
// e.g., `impl<U: Tr, V: Iterator<Item=U>> Foo<<U as Tr>::T> for V`
|
// e.g., `impl<U: Tr, V: Iterator<Item=U>> Foo<<U as Tr>::T> for V`
|
||||||
substs.obligations.append(&mut impl_obligations);
|
impl_obligations.extend(substs.obligations);
|
||||||
|
|
||||||
ImplSourceUserDefinedData { impl_def_id, substs: substs.value, nested: substs.obligations }
|
ImplSourceUserDefinedData { impl_def_id, substs: substs.value, nested: impl_obligations }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn confirm_object_candidate(
|
fn confirm_object_candidate(
|
||||||
|
|
39
src/test/ui/traits/impl-evaluation-order.rs
Normal file
39
src/test/ui/traits/impl-evaluation-order.rs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// Regression test for #79902
|
||||||
|
|
||||||
|
// Check that evaluation (which is used to determine whether to copy a type in
|
||||||
|
// MIR building) evaluates bounds from normalizing an impl after evaluating
|
||||||
|
// any bounds on the impl.
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
trait A {
|
||||||
|
type B;
|
||||||
|
}
|
||||||
|
trait M {}
|
||||||
|
|
||||||
|
struct G<T, U>(*const T, *const U);
|
||||||
|
|
||||||
|
impl<T, U> Clone for G<T, U> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
G { ..*self }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, U> Copy for G<T, U::B>
|
||||||
|
where
|
||||||
|
T: A<B = U>,
|
||||||
|
U: A,
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
impl A for () {
|
||||||
|
type B = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_m<T: M>(_: T) {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = G(&(), &());
|
||||||
|
drop(x);
|
||||||
|
drop(x);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue