#![feature(never_type, specialization)] #![allow(incomplete_features)] use std::iter::{self, Empty}; trait Trait { type Out: Iterator; fn f(&self) -> Option; } impl Trait for T { default type Out = !; //~ ERROR: `!` is not an iterator default fn f(&self) -> Option { None } } struct X; impl Trait for X { type Out = Empty; fn f(&self) -> Option { Some(iter::empty()) } } fn f(a: T) { if let Some(iter) = a.f() { println!("Some"); for x in iter { println!("x = {}", x); } } } pub fn main() { f(10); }