Skip to content

Commit 3bf3dad

Browse files
Ensure that dyn trait bounds stay sorted
1 parent 67e7d85 commit 3bf3dad

File tree

5 files changed

+15
-18
lines changed

5 files changed

+15
-18
lines changed

compiler/rustc_middle/src/ty/print/pretty.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -1239,21 +1239,18 @@ pub trait PrettyPrinter<'tcx>:
12391239
.generics_of(principal.def_id)
12401240
.own_args_no_defaults(cx.tcx(), principal.args);
12411241

1242-
let mut projections = predicates.projection_bounds();
1243-
1244-
let mut args = args.iter().cloned();
1245-
let arg0 = args.next();
1246-
let projection0 = projections.next();
1247-
if arg0.is_some() || projection0.is_some() {
1248-
let args = arg0.into_iter().chain(args);
1249-
let projections = projection0.into_iter().chain(projections);
1242+
let mut projections: Vec<_> = predicates.projection_bounds().collect();
1243+
projections.sort_by_cached_key(|proj| {
1244+
cx.tcx().item_name(proj.item_def_id()).to_string()
1245+
});
12501246

1247+
if !args.is_empty() || !projections.is_empty() {
12511248
p!(generic_delimiters(|mut cx| {
1252-
cx = cx.comma_sep(args)?;
1253-
if arg0.is_some() && projection0.is_some() {
1249+
cx = cx.comma_sep(args.iter().copied())?;
1250+
if !args.is_empty() && !projections.is_empty() {
12541251
write!(cx, ", ")?;
12551252
}
1256-
cx.comma_sep(projections)
1253+
cx.comma_sep(projections.iter().copied())
12571254
}));
12581255
}
12591256
}

tests/ui/traits/object/enforce-supertrait-projection.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ trait Trait: SuperTrait<A = <Self as SuperTrait>::B> {}
77

88
fn transmute<A, B>(x: A) -> B {
99
foo::<A, B, dyn Trait<A = A, B = B>>(x)
10-
//~^ ERROR type mismatch resolving `<dyn Trait<B = B, A = A> as SuperTrait>::A == B`
10+
//~^ ERROR type mismatch resolving `<dyn Trait<A = A, B = B> as SuperTrait>::A == B`
1111
}
1212

1313
fn foo<A, B, T: ?Sized>(x: T::A) -> B

tests/ui/traits/object/enforce-supertrait-projection.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error[E0271]: type mismatch resolving `<dyn Trait<B = B, A = A> as SuperTrait>::A == B`
1+
error[E0271]: type mismatch resolving `<dyn Trait<A = A, B = B> as SuperTrait>::A == B`
22
--> $DIR/enforce-supertrait-projection.rs:9:17
33
|
44
LL | fn transmute<A, B>(x: A) -> B {

tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ where
99
I: Iterator<Item = i32>,
1010
{
1111
use_iterator(i);
12-
//~^ ERROR `&dyn IntoIterator<Item = i32, IntoIter = I>` is not an iterator
12+
//~^ ERROR `&dyn IntoIterator<IntoIter = I, Item = i32>` is not an iterator
1313
}
1414

1515
fn main() {}

tests/ui/traits/suggest-dereferences/dont-suggest-unsize-deref.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
error[E0277]: `&dyn IntoIterator<Item = i32, IntoIter = I>` is not an iterator
1+
error[E0277]: `&dyn IntoIterator<IntoIter = I, Item = i32>` is not an iterator
22
--> $DIR/dont-suggest-unsize-deref.rs:11:18
33
|
44
LL | use_iterator(i);
5-
| ------------ ^ `&dyn IntoIterator<Item = i32, IntoIter = I>` is not an iterator
5+
| ------------ ^ `&dyn IntoIterator<IntoIter = I, Item = i32>` is not an iterator
66
| |
77
| required by a bound introduced by this call
88
|
9-
= help: the trait `Iterator` is not implemented for `&dyn IntoIterator<Item = i32, IntoIter = I>`
10-
= note: required for `&dyn IntoIterator<Item = i32, IntoIter = I>` to implement `IntoIterator`
9+
= help: the trait `Iterator` is not implemented for `&dyn IntoIterator<IntoIter = I, Item = i32>`
10+
= note: required for `&dyn IntoIterator<IntoIter = I, Item = i32>` to implement `IntoIterator`
1111
note: required by a bound in `use_iterator`
1212
--> $DIR/dont-suggest-unsize-deref.rs:3:8
1313
|

0 commit comments

Comments
 (0)