| // Test that we don't ICE for a typeck error that only shows up in dropck |
| // issue #135039 |
| //@ edition:2018 |
| |
| pub trait AuthUser { |
| type Id; |
| } |
| |
| pub trait AuthnBackend { |
| type User: AuthUser; |
| } |
| |
| pub struct AuthSession<Backend: AuthnBackend> { |
| user: Option<Backend::User>, |
| data: Option<<<Backend as AuthnBackend>::User as AuthUser>::Id>, |
| } |
| |
| pub trait Authz: Sized { |
| type AuthnBackend: AuthnBackend<User = Self>; |
| } |
| |
| pub trait Query<User: Authz> { |
| type Output; |
| async fn run(&self) -> Result<Self::Output, ()>; |
| } |
| |
| pub async fn run_query<User: Authz, Q: Query<User> + 'static>( |
| auth: AuthSession<User::AuthnBackend>, |
| //~^ ERROR the trait bound `User: AuthUser` is not satisfied [E0277] |
| //~| ERROR the trait bound `User: AuthUser` is not satisfied [E0277] |
| query: Q, |
| ) -> Result<Q::Output, ()> { |
| let user = auth.user; |
| query.run().await |
| } |
| |
| fn main() {} |