diff options
| author | Ryo Yoshida <low.ryoshida@gmail.com> | 2022-08-24 03:27:59 +0900 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2024-02-14 13:50:44 +0100 |
| commit | 4829f591fbf6ce7e91394775c8be10cdf9291d1b (patch) | |
| tree | 5647562ae6a53a19a54bdee2206978f8c841ddf6 | |
| parent | 03340742ea42c00588707001aca8a05c9d846e08 (diff) | |
| download | rust-4829f591fbf6ce7e91394775c8be10cdf9291d1b.tar.gz rust-4829f591fbf6ce7e91394775c8be10cdf9291d1b.zip | |
Add test for auto trait bounds
| -rw-r--r-- | crates/hir-ty/src/chalk_db.rs | 7 | ||||
| -rw-r--r-- | crates/hir-ty/src/tests/traits.rs | 55 |
2 files changed, 57 insertions, 5 deletions
diff --git a/crates/hir-ty/src/chalk_db.rs b/crates/hir-ty/src/chalk_db.rs index 0fde0f661d7..5039d51d70c 100644 --- a/crates/hir-ty/src/chalk_db.rs +++ b/crates/hir-ty/src/chalk_db.rs @@ -724,7 +724,7 @@ pub(crate) fn adt_datum_query( let where_clauses = convert_where_clauses(db, adt_id.into(), &bound_vars_subst); let phantom_data_id = db - .lang_item(krate, SmolStr::new_inline("phantom_data")) + .lang_item(krate, LangItem::PhantomData) .and_then(|item| item.as_struct()) .map(|item| item.into()); let flags = rust_ir::AdtFlags { @@ -754,10 +754,7 @@ pub(crate) fn adt_datum_query( .enum_data(id) .variants .iter() - .map(|(local_id, _)| { - let variant_id = hir_def::EnumVariantId { parent: id, local_id }; - variant_id_to_fields(variant_id.into()) - }) + .map(|&(variant_id, _)| variant_id_to_fields(variant_id.into())) .collect(); (rust_ir::AdtKind::Enum, variants) } diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index db14addaf18..68cd6071ec7 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -4553,3 +4553,58 @@ fn foo() { "#, ); } + +#[test] +fn auto_trait_bound() { + check_types( + r#" +//- minicore: sized +auto trait Send {} +impl<T> !Send for *const T {} + +struct Yes; +trait IsSend { const IS_SEND: Yes; } +impl<T: Send> IsSend for T { const IS_SEND: Yes = Yes; } + +struct Struct<T>(T); +enum Enum<T> { A, B(T) } +union Union<T> { t: T } + +#[lang = "phantom_data"] +struct PhantomData<T: ?Sized>; + +fn f<T: Send, U>() { + T::IS_SEND; + //^^^^^^^^^^Yes + U::IS_SEND; + //^^^^^^^^^^{unknown} + <*const T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^{unknown} + Struct::<T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^Yes + Struct::<U>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^{unknown} + Struct::<*const T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} + Enum::<T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^Yes + Enum::<U>::IS_SEND; + //^^^^^^^^^^^^^^^^^^{unknown} + Enum::<*const T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} + Union::<T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^Yes + Union::<U>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^{unknown} + Union::<*const T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} + PhantomData::<T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^Yes + PhantomData::<U>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} + PhantomData::<*const T>::IS_SEND; + //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^{unknown} +} +"#, + ); +} |
