Apparently equivalent programs do not behave the same

⚓ Rust    📅 2026-03-10    👤 surdeus    👁️ 1      

surdeus

I had an issue in my code base I didn't understand, so I minimized it to the following (which does not compile)

trait Env<'arena> {
    type Arena;
    fn init() -> Self::Arena;
}

fn eval_arena<'arena, E: Env<'arena>>(_: &'arena E::Arena) {
    todo!()
}

fn eval_bool<E: for<'arena> Env<'arena>>() {
    let arena = E::init();
    eval_arena::<E>(&arena);
}

but turns out that explicitly naming E::Arena apparently makes it work (the following compiles)

trait Env<'arena> {
    type Arena;
    fn init() -> Self::Arena;
}

fn eval_arena<'arena, E: Env<'arena>>(_: &'arena E::Arena) {
    todo!()
}

fn eval_bool<T, E: for<'arena> Env<'arena, Arena = T>>() {
    let arena = E::init();
    eval_arena::<E>(&arena);
}

Why?

5 posts - 3 participants

Read full topic

🏷️ Rust_feed