about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRyo Yoshida <low.ryoshida@gmail.com>2022-08-24 03:27:59 +0900
committerLukas Wirth <lukastw97@gmail.com>2024-02-14 13:50:44 +0100
commit4829f591fbf6ce7e91394775c8be10cdf9291d1b (patch)
tree5647562ae6a53a19a54bdee2206978f8c841ddf6
parent03340742ea42c00588707001aca8a05c9d846e08 (diff)
downloadrust-4829f591fbf6ce7e91394775c8be10cdf9291d1b.tar.gz
rust-4829f591fbf6ce7e91394775c8be10cdf9291d1b.zip
Add test for auto trait bounds
-rw-r--r--crates/hir-ty/src/chalk_db.rs7
-rw-r--r--crates/hir-ty/src/tests/traits.rs55
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}
+}
+"#,
+    );
+}