mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			42 lines
		
	
	
		
			904 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			904 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
// Regression test for <https://github.com/rust-lang/rust/issues/73137>
 | 
						|
 | 
						|
//@ run-pass
 | 
						|
//@ edition:2018
 | 
						|
 | 
						|
#![allow(dead_code)]
 | 
						|
use std::future::Future;
 | 
						|
use std::task::{Waker, Wake, Context};
 | 
						|
use std::sync::Arc;
 | 
						|
 | 
						|
struct DummyWaker;
 | 
						|
impl Wake for DummyWaker {
 | 
						|
    fn wake(self: Arc<Self>) {}
 | 
						|
}
 | 
						|
 | 
						|
struct Foo {
 | 
						|
    a: usize,
 | 
						|
    b: &'static u32,
 | 
						|
}
 | 
						|
 | 
						|
#[inline(never)]
 | 
						|
fn nop<T>(_: T) {}
 | 
						|
 | 
						|
fn main() {
 | 
						|
    let mut fut = Box::pin(async {
 | 
						|
        let action = Foo {
 | 
						|
            b: &42,
 | 
						|
            a: async { 0 }.await,
 | 
						|
        };
 | 
						|
 | 
						|
        // An error in the coroutine transform caused `b` to be overwritten with `a` when `b` was
 | 
						|
        // borrowed.
 | 
						|
        nop(&action.b);
 | 
						|
        assert_ne!(0usize, unsafe { std::mem::transmute(action.b) });
 | 
						|
 | 
						|
        async {}.await;
 | 
						|
    });
 | 
						|
    let waker = Waker::from(Arc::new(DummyWaker));
 | 
						|
    let mut cx = Context::from_waker(&waker);
 | 
						|
    let _ = fut.as_mut().poll(&mut cx);
 | 
						|
}
 |