mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
![]() Emit dropck normalization errors in borrowck Borrowck generally assumes that any queries it runs for type checking will succeed, thinking that HIR typeck will have errored first if there was a problem. However as of #98641, dropck isn't run on HIR, so there's no direct guarantee that it doesn't error. While a type being well-formed might be expected to ensure that its fields are well-formed, this is not the case for types containing a type projection: ```rust pub trait AuthUser { type Id; } pub trait AuthnBackend { type User: AuthUser; } pub struct AuthSession<Backend: AuthnBackend> { data: Option<<<Backend as AuthnBackend>::User as AuthUser>::Id>, } pub trait Authz: Sized { type AuthnBackend: AuthnBackend<User = Self>; } pub fn run_query<User: Authz>(auth: AuthSession<User::AuthnBackend>) {} // ^ No User: AuthUser bound is required or inferred. ``` While improvements to trait solving might fix this in the future, for now we go for a pragmatic solution of emitting an error from borrowck (by rerunning dropck outside of a query) and making drop elaboration check if an error has been emitted previously before panicking for a failed normalization. Closes #103899 Closes #135039 r? `@compiler-errors` (feel free to re-assign) |
||
---|---|---|
.. | ||
constraints | ||
diagnostics | ||
polonius | ||
region_infer | ||
type_check | ||
borrow_set.rs | ||
borrowck_errors.rs | ||
consumers.rs | ||
dataflow.rs | ||
def_use.rs | ||
lib.rs | ||
member_constraints.rs | ||
nll.rs | ||
path_utils.rs | ||
place_ext.rs | ||
places_conflict.rs | ||
prefixes.rs | ||
renumber.rs | ||
session_diagnostics.rs | ||
universal_regions.rs | ||
used_muts.rs |