Validate associated type bounds on ?
This commit is contained in:
parent
e356279bdf
commit
06a49b609f
@ -681,11 +681,32 @@ pub(crate) fn lower_poly_trait_ref(
|
|||||||
Some(self_ty),
|
Some(self_ty),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let tcx = self.tcx();
|
||||||
|
let bound_vars = tcx.late_bound_vars(trait_ref.hir_ref_id);
|
||||||
|
debug!(?bound_vars);
|
||||||
|
|
||||||
|
let poly_trait_ref = ty::Binder::bind_with_vars(
|
||||||
|
ty::TraitRef::new_from_args(tcx, trait_def_id, generic_args),
|
||||||
|
bound_vars,
|
||||||
|
);
|
||||||
|
|
||||||
let polarity = match polarity {
|
let polarity = match polarity {
|
||||||
rustc_ast::BoundPolarity::Positive => ty::PredicatePolarity::Positive,
|
rustc_ast::BoundPolarity::Positive => ty::PredicatePolarity::Positive,
|
||||||
rustc_ast::BoundPolarity::Negative(_) => ty::PredicatePolarity::Negative,
|
rustc_ast::BoundPolarity::Negative(_) => ty::PredicatePolarity::Negative,
|
||||||
rustc_ast::BoundPolarity::Maybe(_) => {
|
rustc_ast::BoundPolarity::Maybe(_) => {
|
||||||
// No-op.
|
// Validate associated type at least. We may want to reject these
|
||||||
|
// outright in the future...
|
||||||
|
for constraint in trait_segment.args().constraints {
|
||||||
|
let _ = self.lower_assoc_item_constraint(
|
||||||
|
trait_ref.hir_ref_id,
|
||||||
|
poly_trait_ref,
|
||||||
|
constraint,
|
||||||
|
&mut Default::default(),
|
||||||
|
&mut Default::default(),
|
||||||
|
constraint.span,
|
||||||
|
predicate_filter,
|
||||||
|
);
|
||||||
|
}
|
||||||
return arg_count;
|
return arg_count;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -699,15 +720,6 @@ pub(crate) fn lower_poly_trait_ref(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let tcx = self.tcx();
|
|
||||||
let bound_vars = tcx.late_bound_vars(trait_ref.hir_ref_id);
|
|
||||||
debug!(?bound_vars);
|
|
||||||
|
|
||||||
let poly_trait_ref = ty::Binder::bind_with_vars(
|
|
||||||
ty::TraitRef::new_from_args(tcx, trait_def_id, generic_args),
|
|
||||||
bound_vars,
|
|
||||||
);
|
|
||||||
|
|
||||||
match predicate_filter {
|
match predicate_filter {
|
||||||
PredicateFilter::All
|
PredicateFilter::All
|
||||||
| PredicateFilter::SelfOnly
|
| PredicateFilter::SelfOnly
|
||||||
@ -758,11 +770,11 @@ pub(crate) fn lower_poly_trait_ref(
|
|||||||
// since we should have emitted an error for them earlier, and they
|
// since we should have emitted an error for them earlier, and they
|
||||||
// would not be well-formed!
|
// would not be well-formed!
|
||||||
if polarity != ty::PredicatePolarity::Positive {
|
if polarity != ty::PredicatePolarity::Positive {
|
||||||
assert!(
|
self.dcx().span_delayed_bug(
|
||||||
self.dcx().has_errors().is_some(),
|
constraint.span,
|
||||||
"negative trait bounds should not have assoc item constraints",
|
"negative trait bounds should not have assoc item constraints",
|
||||||
);
|
);
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specify type to assert that error was already reported in `Err` case.
|
// Specify type to assert that error was already reported in `Err` case.
|
||||||
|
12
tests/ui/trait-bounds/maybe-bound-with-assoc.rs
Normal file
12
tests/ui/trait-bounds/maybe-bound-with-assoc.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
trait HasAssoc {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
fn hasassoc<T: ?HasAssoc<Assoc = ()>>() {}
|
||||||
|
//~^ WARN relaxing a default bound
|
||||||
|
|
||||||
|
trait NoAssoc {}
|
||||||
|
fn noassoc<T: ?NoAssoc<Missing = ()>>() {}
|
||||||
|
//~^ WARN relaxing a default bound
|
||||||
|
//~| ERROR associated type `Missing` not found for `NoAssoc`
|
||||||
|
|
||||||
|
fn main() {}
|
21
tests/ui/trait-bounds/maybe-bound-with-assoc.stderr
Normal file
21
tests/ui/trait-bounds/maybe-bound-with-assoc.stderr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
warning: relaxing a default bound only does something for `?Sized`; all other traits are not bound by default
|
||||||
|
--> $DIR/maybe-bound-with-assoc.rs:4:16
|
||||||
|
|
|
||||||
|
LL | fn hasassoc<T: ?HasAssoc<Assoc = ()>>() {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: relaxing a default bound only does something for `?Sized`; all other traits are not bound by default
|
||||||
|
--> $DIR/maybe-bound-with-assoc.rs:8:15
|
||||||
|
|
|
||||||
|
LL | fn noassoc<T: ?NoAssoc<Missing = ()>>() {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0220]: associated type `Missing` not found for `NoAssoc`
|
||||||
|
--> $DIR/maybe-bound-with-assoc.rs:8:24
|
||||||
|
|
|
||||||
|
LL | fn noassoc<T: ?NoAssoc<Missing = ()>>() {}
|
||||||
|
| ^^^^^^^ associated type `Missing` not found
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error; 2 warnings emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0220`.
|
Loading…
Reference in New Issue
Block a user