Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/chalk_db.rs')
-rw-r--r--crates/hir-ty/src/chalk_db.rs8
1 files changed, 6 insertions, 2 deletions
diff --git a/crates/hir-ty/src/chalk_db.rs b/crates/hir-ty/src/chalk_db.rs
index 5dd8e2719a..fb8c9a9a1c 100644
--- a/crates/hir-ty/src/chalk_db.rs
+++ b/crates/hir-ty/src/chalk_db.rs
@@ -550,6 +550,10 @@ pub(crate) fn trait_datum_query(
debug!("trait_datum {:?}", trait_id);
let trait_ = from_chalk_trait_id(trait_id);
let trait_data = db.trait_data(trait_);
+
+ let coinductive =
+ trait_data.is_auto || db.attrs(trait_.into()).by_key("rustc_coinductive").exists();
+
debug!("trait {:?} = {:?}", trait_id, trait_data.name);
let generic_params = generics(db.upcast(), trait_.into());
let bound_vars = generic_params.bound_vars_subst(db, DebruijnIndex::INNERMOST);
@@ -557,7 +561,7 @@ pub(crate) fn trait_datum_query(
auto: trait_data.is_auto,
upstream: trait_.lookup(db.upcast()).container.krate() != krate,
non_enumerable: true,
- coinductive: false, // only relevant for Chalk testing
+ coinductive,
// FIXME: set these flags correctly
marker: false,
fundamental: false,
@@ -637,7 +641,7 @@ pub(crate) fn struct_datum_query(
fundamental: false,
phantom_data: false,
};
- // FIXME provide enum variants properly (for auto traits)
+ // FIXME provide enum variants properly (for auto traits and `Sized`)
let variant = rust_ir::AdtVariantDatum {
fields: Vec::new(), // FIXME add fields (only relevant for auto traits),
};