| // 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 |
| |
| #![allow(dropping_copy_types)] |
| |
| 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); |
| } |