mirror of https://github.com/rust-lang/rust
60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
//@ check-pass
|
|
//@ revisions: current next
|
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
|
//@[next] compile-flags: -Znext-solver
|
|
|
|
#![allow(non_upper_case_globals)]
|
|
#![allow(dead_code)]
|
|
#![allow(unused_assignments)]
|
|
#![allow(unused_variables)]
|
|
// Test a scenario where we generate a constraint like `?1 <: &?2`.
|
|
// In such a case, it is important that we instantiate `?1` with `&?3`
|
|
// where `?3 <: ?2`, and not with `&?2`. This is a regression test for
|
|
// #18653. The important thing is that we build.
|
|
|
|
use std::cell::RefCell;
|
|
|
|
enum Wrap<A> {
|
|
WrapSome(A),
|
|
WrapNone
|
|
}
|
|
|
|
use Wrap::*;
|
|
|
|
struct T;
|
|
struct U;
|
|
|
|
trait Get<T: ?Sized> {
|
|
fn get(&self) -> &T;
|
|
}
|
|
|
|
impl Get<dyn MyShow + 'static> for Wrap<T> {
|
|
fn get(&self) -> &(dyn MyShow + 'static) {
|
|
static x: usize = 42;
|
|
&x
|
|
}
|
|
}
|
|
|
|
impl Get<usize> for Wrap<U> {
|
|
fn get(&self) -> &usize {
|
|
static x: usize = 55;
|
|
&x
|
|
}
|
|
}
|
|
|
|
trait MyShow { fn dummy(&self) { } }
|
|
impl<'a> MyShow for &'a (dyn MyShow + 'a) { }
|
|
impl MyShow for usize { }
|
|
fn constrain<'a>(rc: RefCell<&'a (dyn MyShow + 'a)>) { }
|
|
|
|
fn main() {
|
|
let mut collection: Wrap<_> = WrapNone;
|
|
|
|
{
|
|
let __arg0 = Get::get(&collection);
|
|
let __args_cell = RefCell::new(__arg0);
|
|
constrain(__args_cell);
|
|
}
|
|
collection = WrapSome(T);
|
|
}
|