Fixed unsoundness hole.
This commit is contained in:
parent
469c3bf75b
commit
a62d0785a6
@ -636,7 +636,7 @@ pub fn new(def_id: DefId, substs: &'tcx Substs<'tcx>) -> TraitRef<'tcx> {
|
||||
TraitRef { def_id: def_id, substs: substs }
|
||||
}
|
||||
|
||||
/// Returns a TraitRef of the form `P0: Foo<P1..Pn>` where `Pi`
|
||||
/// Returns a `TraitRef` of the form `P0: Foo<P1..Pn>` where `Pi`
|
||||
/// are the parameters defined on trait.
|
||||
pub fn identity<'a, 'gcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>, def_id: DefId) -> TraitRef<'tcx> {
|
||||
TraitRef {
|
||||
|
@ -974,9 +974,10 @@ fn conv_object_ty_poly_trait_ref(&self,
|
||||
let principal = self.instantiate_poly_trait_ref(&trait_bounds[0],
|
||||
dummy_self,
|
||||
&mut projection_bounds);
|
||||
debug!("principal: {:?}", principal);
|
||||
|
||||
for trait_bound in trait_bounds[1..].iter() {
|
||||
// Sanity check for non-principal trait bounds
|
||||
// sanity check for non-principal trait bounds
|
||||
self.instantiate_poly_trait_ref(trait_bound,
|
||||
dummy_self,
|
||||
&mut vec![]);
|
||||
@ -1008,9 +1009,9 @@ fn conv_object_ty_poly_trait_ref(&self,
|
||||
})
|
||||
});
|
||||
|
||||
// check that there are no gross object safety violations,
|
||||
// Check that there are no gross object safety violations;
|
||||
// most importantly, that the supertraits don't contain Self,
|
||||
// to avoid ICE-s.
|
||||
// to avoid ICEs.
|
||||
let object_safety_violations =
|
||||
tcx.astconv_object_safety_violations(principal.def_id());
|
||||
if !object_safety_violations.is_empty() {
|
||||
@ -1020,7 +1021,7 @@ fn conv_object_ty_poly_trait_ref(&self,
|
||||
return tcx.types.err;
|
||||
}
|
||||
|
||||
// use a BTreeSet to keep output in a more consistent order
|
||||
// Use a BTreeSet to keep output in a more consistent order.
|
||||
let mut associated_types = BTreeSet::default();
|
||||
|
||||
for tr in traits::supertraits(tcx, principal) {
|
||||
@ -1059,7 +1060,7 @@ fn conv_object_ty_poly_trait_ref(&self,
|
||||
v.sort_by(|a, b| a.stable_cmp(tcx, b));
|
||||
let existential_predicates = ty::Binder::bind(tcx.mk_existential_predicates(v.into_iter()));
|
||||
|
||||
// Explicitly specified region bound. Use that.
|
||||
// Use explicitly-specified region bound.
|
||||
let region_bound = if !lifetime.is_elided() {
|
||||
self.ast_region_to_region(lifetime, None)
|
||||
} else {
|
||||
|
@ -319,7 +319,8 @@ fn type_param_predicates<'a, 'tcx>(
|
||||
let icx = ItemCtxt::new(tcx, item_def_id);
|
||||
result
|
||||
.predicates
|
||||
.extend(icx.type_parameter_bounds_in_generics(ast_generics, param_id, ty, true));
|
||||
.extend(icx.type_parameter_bounds_in_generics(ast_generics, param_id, ty,
|
||||
OnlySelfBounds(true)));
|
||||
result
|
||||
}
|
||||
|
||||
@ -716,7 +717,7 @@ fn super_predicates_of<'a, 'tcx>(
|
||||
// as one of its "superpredicates".
|
||||
let is_trait_alias = ty::is_trait_alias(tcx, trait_def_id);
|
||||
let superbounds2 = icx.type_parameter_bounds_in_generics(
|
||||
generics, item.id, self_param_ty, !is_trait_alias);
|
||||
generics, item.id, self_param_ty, OnlySelfBounds(!is_trait_alias));
|
||||
|
||||
// Combine the two lists to form the complete set of superbounds:
|
||||
let superbounds: Vec<_> = superbounds1.into_iter().chain(superbounds2).collect();
|
||||
@ -1694,6 +1695,7 @@ fn extend<I: IntoIterator<Item = (ty::Predicate<'tcx>, Span)>>(&mut self, iter:
|
||||
|
||||
let icx = ItemCtxt::new(tcx, def_id);
|
||||
let no_generics = hir::Generics::empty();
|
||||
let empty_trait_items = HirVec::new();
|
||||
|
||||
let mut predicates = UniquePredicates::new();
|
||||
|
||||
@ -1738,6 +1740,10 @@ fn extend<I: IntoIterator<Item = (ty::Predicate<'tcx>, Span)>>(&mut self, iter:
|
||||
is_trait = Some((ty::TraitRef::identity(tcx, def_id), items));
|
||||
generics
|
||||
}
|
||||
ItemKind::TraitAlias(ref generics, _) => {
|
||||
is_trait = Some((ty::TraitRef::identity(tcx, def_id), &empty_trait_items));
|
||||
generics
|
||||
}
|
||||
ItemKind::Existential(ExistTy {
|
||||
ref bounds,
|
||||
impl_trait_fn,
|
||||
|
Loading…
Reference in New Issue
Block a user