Closed
Description
I tried this code:
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=e1f645e0ffe95f137fc42c12e783488b
#![feature(async_fn_in_trait)]
trait AsyncTrait {
async fn default_impl() -> &'static str {
"A"
}
async fn call_default_impl() -> &'static str {
Self::default_impl().await
}
}
trait SyncTrait {
fn default_impl() -> &'static str {
"A"
}
fn call_default_impl() -> &'static str {
Self::default_impl()
}
}
struct AsyncType;
impl AsyncTrait for AsyncType {
async fn default_impl() -> &'static str {
"B"
}
}
struct SyncType;
impl SyncTrait for SyncType {
fn default_impl() -> &'static str {
"B"
}
}
#[tokio::main]
async fn main() {
let a = AsyncType::call_default_impl().await;
let b = SyncType::call_default_impl();
println!("{a}, {b}");
}
I expected to see this happen:
SyncType::call_default_impl
calls default_impl
from impl SyncTrait for SyncType
.
My expectation was the same for AsyncType::call_default_impl
of the same pattern.
Instead, this happened:
AsyncType::call_default_impl
calls default_impl
from the trait's default implementation,
instead of the one in impl AsyncTrait for AsyncType
.
So the code prints A, B
Meta
rustc --version --verbose
:
rustc 1.68.0-nightly (afaf3e07a 2023-01-14)
binary: rustc
commit-hash: afaf3e07aaa7ca9873bdb439caec53faffa4230c
commit-date: 2023-01-14
host: x86_64-pc-windows-msvc
release: 1.68.0-nightly
LLVM version: 15.0.6