совпадение временного члена живет недостаточно долго

Следующий код не компилируется (playground):

#![allow(unused)]
use std::cell::RefCell;

enum Token {
    A,
    B,
}

struct Thing {
    c: Token,
}

fn main() {
    let a = RefCell::new(Thing { c: Token::A });

    if let Token::A = a.borrow().c {
        //Error!
    }
}

Это терпит неудачу с этой ошибкой:

error[E0597]: `a` does not live long enough
  --> src/main.rs:16:23
   |
16 |     if let Token::A = a.borrow().c {
   |                       ^ borrowed value does not live long enough
...
19 | }
   | - `a` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

Если я добавлю что-нибудь после оператора, даже один ;, тогда он будет работать нормально:

if let Token::A = a.borrow().c { 
};  // Ok

Я предполагаю, что это связано с тем, что значение if используется в качестве возврата main, поэтому заимствование в if let каким-то образом расширяется. Но этого быть не должно, это просто ()! Или я чего-то не понимаю?

Кстати, то же самое происходит с:

match a.borrow().c {
    _ => ()
}

person rodrigo    schedule 04.07.2018    source источник
comment
Я пытался использовать feature(nll), без файла cookie. Используя let b: () = a.borrow().c;, компилятор хочет, чтобы b имел тип Token (НЕ &Token). Итак, у нас есть заимствование без какой-либо выдающейся ссылки... oO   -  person Matthieu M.    schedule 05.07.2018
comment
В частности, этот код работает с NLL с экспериментальной реализацией полония (#![feature(nll)] + RUSTFLAGS='-Z polonius').   -  person Shepmaster    schedule 05.07.2018