fn coinductive_predicate(&self, predicate: ty::Predicate<'tcx>) -> bool {
let result = match predicate.kind().skip_binder() {
- ty::PredicateKind::Trait(ref data) => self.tcx().trait_is_auto(data.def_id()),
+ ty::PredicateKind::Trait(ref data) => {
+ self.tcx().trait_is_auto(data.def_id())
+ || self.tcx().lang_items().sized_trait() == Some(data.def_id())
+ }
ty::PredicateKind::WellFormed(_) => true,
_ => false,
};
--- /dev/null
+// check-pass
+struct Node<C: Trait<Self>>(C::Assoc);
+
+trait Trait<T> {
+ type Assoc;
+}
+
+impl<T> Trait<T> for Vec<()> {
+ type Assoc = Vec<T>;
+}
+
+fn main() {
+ let _ = Node::<Vec<()>>(Vec::new());
+}
--- /dev/null
+// run-pass
+struct Node<C: CollectionFactory<Self>> {
+ _children: C::Collection,
+}
+
+trait CollectionFactory<T> {
+ type Collection;
+}
+
+impl<T> CollectionFactory<T> for Vec<()> {
+ type Collection = Vec<T>;
+}
+
+trait Collection<T>: Sized {
+ fn push(&mut self, v: T);
+}
+
+impl<T> Collection<T> for Vec<T> {
+ fn push(&mut self, v: T) {
+ self.push(v)
+ }
+}
+
+fn main() {
+ let _ = Node::<Vec<()>> {
+ _children: Vec::new(),
+ };
+}