Closed
Description
Today when I tried this piece of code:
#![feature(async_await, gen_future)]
use core::task::Context;
use core::task::Poll;
use core::pin::Pin;
use core::future::Future;
use std::future::poll_with_tls_context;
struct CountdownFuture(u32);
impl Future for CountdownFuture {
type Output = ();
fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
if self.0 == 0 {
Poll::Ready(())
} else {
self.0 -= 1;
Poll::Pending
}
}
}
fn main() {
let mut fut = CountdownFuture(3);
let pin = Pin::new(&mut fut);
let res = poll_with_tls_context(pin);
println!("{:?}", res);
}
I expected to see a line of debug formatted output representing a Poll::Pending
state is set for variable res
. However, when I execute this piece of code, a compile error occurred:
Finished dev [unoptimized + debuginfo] target(s) in 0.32s
Running `target\debug\test-futures.exe`
thread 'main' panicked at 'TLS Context not set. This is a rustc bug. Please file an issue on https://github.com/rust-lang/rust.', src\libcore\option.rs:1036:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: process didn't exit successfully: `target\debug\test-futures.exe` (exit code: 101)
And with RUST_BACKTRACE=1
:
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running `target\debug\test-futures.exe`
thread 'main' panicked at 'TLS Context not set. This is a rustc bug. Please file an issue on https://github.com/rust-lang/rust.', src\libcore\option.rs:1036:5
stack backtrace:
0: backtrace::backtrace::trace_unsynchronized
at C:\Users\appveyor\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.25\src\backtrace\mod.rs:66
1: std::sys_common::backtrace::_print
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\sys_common\backtrace.rs:47
2: std::sys_common::backtrace::print
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\sys_common\backtrace.rs:36
3: std::panicking::default_hook::{{closure}}
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:197
4: std::panicking::default_hook
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:211
5: std::panicking::rust_panic_with_hook
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:474
6: std::panicking::continue_panic_fmt
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:381
7: std::panicking::rust_begin_panic
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:308
8: core::panicking::panic_fmt
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libcore\panicking.rs:85
9: core::option::expect_failed
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libcore\option.rs:1036
10: core::option::Option<core::ptr::non_null::NonNull<core::task::wake::Context>>::expect<core::ptr::non_null::NonNull<core::task::wake::Context>>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\src\libcore\option.rs:314
11: std::future::get_task_context<closure,core::task::poll::Poll<()>>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\src\libstd\future.rs:95
12: std::future::poll_with_tls_context<test_futures::CountdownFuture>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\src\libstd\future.rs:114
13: test_futures::main
at .\src\main.rs:27
14: std::rt::lang_start::{{closure}}<()>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\src\libstd\rt.rs:64
15: std::rt::lang_start_internal::{{closure}}
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\rt.rs:49
16: std::panicking::try::do_call<closure,i32>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:293
17: panic_unwind::__rust_maybe_catch_panic
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libpanic_unwind\lib.rs:85
18: std::panicking::try
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panicking.rs:272
19: std::panic::catch_unwind
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\panic.rs:388
20: std::rt::lang_start_internal
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\/src\libstd\rt.rs:48
21: std::rt::lang_start<()>
at /rustc/627486af15d222bcba336b12ea92a05237cc9ab1\src\libstd\rt.rs:64
22: main
23: invoke_main
at d:\agent\_work\3\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
24: __scrt_common_main_seh
at d:\agent\_work\3\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
25: BaseThreadInitThunk
26: RtlUserThreadStart
error: process didn't exit successfully: `target\debug\test-futures.exe` (exit code: 101)
It seems that there is an internal issue with rustc
itself. Does anyone met the same problem or similar issues as me? Or is there something wrong with my code? BTW, I doubt that I may need to change a executor function other than poll_with_tls_context
.
Here's my rustc
version:
PS D:\RustProjects\test-futures> rustc -V
rustc 1.37.0-nightly (627486af1 2019-06-02)
I'm using rustc
target nightly-x86_64-pc-windows-msvc
on Windows 10.