#![feature(never_type)]
#![feature(try_trait_v2)]
#![feature(try_trait_v2_residual)]
#![feature(min_specialization)]
#![allow(unused, clippy::disallowed_names)]
use std::{io, ops::ControlFlow};
fn wibble() -> io::Result<Option<()>> {
Ok(Some(()))
}
#[derive(Debug)]
#[must_use]
enum Foo<T> {
Out(T),
Res,
}
pub trait Try: FromResidual {
type Output;
type Residual;
fn from_output(output: Self::Output) -> Self;
fn branch(self) -> ControlFlow<Self::Residual, Self::Output>;
}
pub trait FromResidual<R = <Self as Try>::Residual> {
fn from_residual(residual: R) -> Self;
}
pub trait Residual<O>: Sized {
type TryType: Try<Output = O, Residual = Self>;
}
impl<T> Try for Foo<T> {
type Output = T;
type Residual = Foo<!>;
#[inline]
fn from_output(output: Self::Output) -> Self {
todo!()
}
#[inline]
fn branch(self) -> std::ops::ControlFlow<Self::Residual, Self::Output> {
todo!()
}
}
impl<T> FromResidual<Foo<!>> for Foo<T> {
#[inline]
#[track_caller]
default fn from_residual(residual: Foo<!>) -> Self {
todo!()
}
}
impl<T> Residual<T> for Foo<!> {
type TryType = Foo<T>;
}
struct OrdOnly<T: Ord>(T);
trait SpecTrait<U> {
fn f();
}
impl<T, U> SpecTrait<U> for T {
default fn f() {}
}
impl<T: Ord> SpecTrait<()> for OrdOnly<T> {
fn f() {}
}
impl<T: Ord> SpecTrait<OrdOnly<T>> for () {
fn f() {}
}
impl<T: Ord, U: Ord, V: Ord> SpecTrait<(OrdOnly<T>, OrdOnly<U>)> for &[OrdOnly<V>] {
fn f() {}
}
fn main() {}