diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2015-01-13 14:49:10 -0500 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2015-01-14 16:35:14 -0500 |
| commit | ff6085f401844bc5cb07b804f0d2258bb5c2b9a8 (patch) | |
| tree | 0c54a885929a34ca75f9b44bab6dfa1c2b3e9249 /src/librustc | |
| parent | b92ec6a78a980b567ec8e6c034e3b37caea81aaa (diff) | |
Fix propagation of the HAS_PROJECTION flag in object types. Fixes #20831 some more.
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/middle/ty.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index cf30969ebef..fb216a5e99d 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -2604,12 +2604,17 @@ impl FlagComputation { &ty_projection(ref data) => { self.add_flags(HAS_PROJECTION); - self.add_substs(data.trait_ref.substs); + self.add_projection_ty(data); } &ty_trait(box TyTrait { ref principal, ref bounds }) => { let mut computation = FlagComputation::new(); computation.add_substs(principal.0.substs); + for projection_bound in bounds.projection_bounds.iter() { + let mut proj_computation = FlagComputation::new(); + proj_computation.add_projection_predicate(&projection_bound.0); + computation.add_bound_computation(&proj_computation); + } self.add_bound_computation(&computation); self.add_bounds(bounds); @@ -2673,6 +2678,15 @@ impl FlagComputation { } } + fn add_projection_predicate(&mut self, projection_predicate: &ProjectionPredicate) { + self.add_projection_ty(&projection_predicate.projection_ty); + self.add_ty(projection_predicate.ty); + } + + fn add_projection_ty(&mut self, projection_ty: &ProjectionTy) { + self.add_substs(projection_ty.trait_ref.substs); + } + fn add_substs(&mut self, substs: &Substs) { self.add_tys(substs.types.as_slice()); match substs.regions { |
