Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22791 from Veykril/lukaswirth/push-lnrnonstwsns
Enable auto trait inference
| -rw-r--r-- | crates/hir-ty/src/next_solver/interner.rs | 26 | ||||
| -rw-r--r-- | crates/hir-ty/src/tests/traits.rs | 12 |
2 files changed, 18 insertions, 20 deletions
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs index 9d9e83fc1a..f3d46cd784 100644 --- a/crates/hir-ty/src/next_solver/interner.rs +++ b/crates/hir-ty/src/next_solver/interner.rs @@ -2,6 +2,7 @@ use std::{fmt, ops::ControlFlow}; +use either::Either; use intern::{Interned, InternedRef, InternedSliceRef, impl_internable}; use macros::GenericTypeVisitable; use rustc_abi::ReprOptions; @@ -597,20 +598,17 @@ impl<'db> inherent::AdtDef<DbInterner<'db>> for AdtDef { interner: DbInterner<'db>, ) -> EarlyBinder<DbInterner<'db>, impl IntoIterator<Item = Ty<'db>>> { let db = interner.db(); - // FIXME: this is disabled just to match the behavior with chalk right now - let _field_tys = |id: VariantId| { - db.field_types(id).iter().map(|(_, ty)| ty.ty().skip_binder()).collect::<Vec<_>>() - }; - let field_tys = |_id: VariantId| vec![]; - let tys: Vec<_> = match self.def_id() { - hir_def::AdtId::StructId(id) => field_tys(id.into()), - hir_def::AdtId::UnionId(id) => field_tys(id.into()), - hir_def::AdtId::EnumId(id) => id - .enum_variants(db) - .variants - .values() - .flat_map(|&(variant_id, _)| field_tys(variant_id.into())) - .collect(), + let field_tys = + |id: VariantId| db.field_types(id).iter().map(|(_, ty)| ty.ty().skip_binder()); + let tys = match self.def_id() { + hir_def::AdtId::StructId(id) => Either::Left(field_tys(id.into())), + hir_def::AdtId::UnionId(id) => Either::Left(field_tys(id.into())), + hir_def::AdtId::EnumId(id) => Either::Right( + id.enum_variants(db) + .variants + .values() + .flat_map(move |&(variant_id, _)| field_tys(variant_id.into())), + ), }; EarlyBinder::bind(tys) diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index 67b35ff461..6e61fcaa5d 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -4763,21 +4763,21 @@ fn f<T: Send, U>() { Struct::<T>::IS_SEND; //^^^^^^^^^^^^^^^^^^^^Yes Struct::<U>::IS_SEND; - //^^^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^^^{unknown} Struct::<*const T>::IS_SEND; - //^^^^^^^^^^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} Enum::<T>::IS_SEND; //^^^^^^^^^^^^^^^^^^Yes Enum::<U>::IS_SEND; - //^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^{unknown} Enum::<*const T>::IS_SEND; - //^^^^^^^^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} Union::<T>::IS_SEND; //^^^^^^^^^^^^^^^^^^^Yes Union::<U>::IS_SEND; - //^^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^^{unknown} Union::<*const T>::IS_SEND; - //^^^^^^^^^^^^^^^^^^^^^^^^^^Yes + //^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} PhantomData::<T>::IS_SEND; //^^^^^^^^^^^^^^^^^^^^^^^^^Yes PhantomData::<U>::IS_SEND; |