diff --git a/crates/hir_def/src/item_tree/tests.rs b/crates/hir_def/src/item_tree/tests.rs index cbaa6d086db..a153e17b17a 100644 --- a/crates/hir_def/src/item_tree/tests.rs +++ b/crates/hir_def/src/item_tree/tests.rs @@ -304,7 +304,7 @@ struct S<'a, 'b: 'a, T: Copy + 'a + 'b, const K: u8 = 0> { field: &'a &'b T, } -struct Tuple(T); +struct Tuple(T, U); impl<'a, 'b: 'a, T: Copy + 'a + 'b, const K: u8 = 0> S<'a, 'b, T, K> { fn f(arg: impl Copy) -> impl Copy {} @@ -325,11 +325,13 @@ trait Tr<'a, T: 'a>: Super where Self: for<'a> Tr<'a, T> {} pub(self) field: &'a &'b T, } - pub(self) struct Tuple( + pub(self) struct Tuple( pub(self) 0: T, + pub(self) 1: U, ) where - T: Copy; + T: Copy, + U: ?Sized; impl<'a, 'b, T, const K: u8> S<'a, 'b, T, K> where diff --git a/crates/hir_def/src/type_ref.rs b/crates/hir_def/src/type_ref.rs index 34abe9e0724..0abd14eebfb 100644 --- a/crates/hir_def/src/type_ref.rs +++ b/crates/hir_def/src/type_ref.rs @@ -332,9 +332,10 @@ impl TypeBound { } } - pub fn as_path(&self) -> Option<&Path> { + pub fn as_path(&self) -> Option<(&Path, &TraitBoundModifier)> { match self { - TypeBound::Path(p, _) | TypeBound::ForLifetime(_, p) => Some(p), + TypeBound::Path(p, m) => Some((p, m)), + TypeBound::ForLifetime(_, p) => Some((p, &TraitBoundModifier::None)), TypeBound::Lifetime(_) | TypeBound::Error => None, } } diff --git a/crates/hir_ty/src/utils.rs b/crates/hir_ty/src/utils.rs index 076b2c8cba3..14b8a726a8f 100644 --- a/crates/hir_ty/src/utils.rs +++ b/crates/hir_ty/src/utils.rs @@ -13,7 +13,7 @@ use hir_def::{ intern::Interned, path::Path, resolver::{HasResolver, TypeNs}, - type_ref::TypeRef, + type_ref::{TraitBoundModifier, TypeRef}, AssocContainerId, GenericDefId, Lookup, TraitId, TypeAliasId, TypeParamId, }; use hir_expand::name::{name, Name}; @@ -58,6 +58,10 @@ fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> Vec { }, WherePredicate::Lifetime { .. } => None, }) + .filter_map(|(path, bound_modifier)| match bound_modifier { + TraitBoundModifier::None => Some(path), + TraitBoundModifier::Maybe => None, + }) .filter_map(|path| match resolver.resolve_path_in_type_ns_fully(db, path.mod_path()) { Some(TypeNs::TraitId(t)) => Some(t), _ => None,