Skip to content

Commit

Permalink
sort the existential bounds list in tydecode
Browse files Browse the repository at this point in the history
The sort key is a (DefId, Name), which is *not* stable between
runs, so we must re-sort when loading.

Fixes #24063
Fixes #25467
Fixes #27222
Fixes #28377
  • Loading branch information
arielb1 committed Sep 13, 2015
1 parent cfd76b3 commit 8478acf
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 11 deletions.
5 changes: 2 additions & 3 deletions src/librustc/metadata/tydecode.rs
Expand Up @@ -680,9 +680,8 @@ impl<'a,'tcx> TyDecoder<'a,'tcx> {
}
}

return ty::ExistentialBounds { region_bound: region_bound,
builtin_bounds: builtin_bounds,
projection_bounds: projection_bounds };
ty::ExistentialBounds::new(
region_bound, builtin_bounds, projection_bounds)
}

fn parse_builtin_bounds(&mut self) -> ty::BuiltinBounds {
Expand Down
15 changes: 15 additions & 0 deletions src/librustc/middle/ty.rs
Expand Up @@ -2137,6 +2137,21 @@ pub struct ExistentialBounds<'tcx> {
pub projection_bounds: Vec<PolyProjectionPredicate<'tcx>>,
}

impl<'tcx> ExistentialBounds<'tcx> {
pub fn new(region_bound: ty::Region,
builtin_bounds: BuiltinBounds,
projection_bounds: Vec<PolyProjectionPredicate<'tcx>>)
-> Self {
let mut projection_bounds = projection_bounds;
ty::sort_bounds_list(&mut projection_bounds);
ExistentialBounds {
region_bound: region_bound,
builtin_bounds: builtin_bounds,
projection_bounds: projection_bounds
}
}
}

#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct BuiltinBounds(EnumSet<BuiltinBound>);

Expand Down
10 changes: 2 additions & 8 deletions src/librustc_typeck/astconv.rs
Expand Up @@ -2019,7 +2019,7 @@ pub fn conv_existential_bounds_from_partitioned_bounds<'tcx>(
rscope: &RegionScope,
span: Span,
principal_trait_ref: ty::PolyTraitRef<'tcx>,
mut projection_bounds: Vec<ty::PolyProjectionPredicate<'tcx>>, // Empty for boxed closures
projection_bounds: Vec<ty::PolyProjectionPredicate<'tcx>>, // Empty for boxed closures
partitioned_bounds: PartitionedBounds)
-> ty::ExistentialBounds<'tcx>
{
Expand Down Expand Up @@ -2058,13 +2058,7 @@ pub fn conv_existential_bounds_from_partitioned_bounds<'tcx>(

debug!("region_bound: {:?}", region_bound);

ty::sort_bounds_list(&mut projection_bounds);

ty::ExistentialBounds {
region_bound: region_bound,
builtin_bounds: builtin_bounds,
projection_bounds: projection_bounds,
}
ty::ExistentialBounds::new(region_bound, builtin_bounds, projection_bounds)
}

/// Given the bounds on an object, determines what single region bound
Expand Down
20 changes: 20 additions & 0 deletions src/test/auxiliary/issue-25467.rs
@@ -0,0 +1,20 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![crate_type="lib"]

pub trait Trait {
// the issue is sensitive to interning order - so use names
// unlikely to appear in libstd.
type Issue25467FooT;
type Issue25467BarT;
}

pub type Object = Option<Box<Trait<Issue25467FooT=(),Issue25467BarT=()>>>;
20 changes: 20 additions & 0 deletions src/test/run-pass/issue-25467.rs
@@ -0,0 +1,20 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// aux-build:issue-25467.rs

pub type Issue25467BarT = ();
pub type Issue25467FooT = ();

extern crate issue_25467 as aux;

fn main() {
let o: aux::Object = None;
}

0 comments on commit 8478acf

Please sign in to comment.