Given the following function:
use std::io::{BufRead, stdin};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
stdinlock
I cannot answer the why of your question, but I can state that the current1 implementation of non-lexical lifetimes allows the original code to compile:
#![feature(nll)]
use std::io::{BufRead, stdin};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
stdinlock
.lines()
.count()
}
Playground
1 1.25.0-nightly (2018-01-11 73ac5d6)
This seems to be a bug in the compiler. You can make the compiler happy by using an explicit return
statement:
use std::io::{stdin, BufRead};
fn foo() -> usize {
let stdin = stdin();
let stdinlock = stdin.lock();
return stdinlock
.lines()
.count();
}
fn main() {}
playground
As mentioned in the comments, there are multiple Rust issues related to this: