Auto merge of #122824 - oli-obk:no_ord_def_id2, r=estebank,michaelwoerister
Stop sorting via `DefId`s in region resolution hopefully maintains the perf improvement from https://github.com/rust-lang/rust/pull/118824 works towards https://github.com/rust-lang/rust/issues/90317
This commit is contained in:
commit
eb80be223f
5 changed files with 56 additions and 53 deletions
|
@ -13,6 +13,7 @@ use rustc_data_structures::graph::implementation::{
|
||||||
Direction, Graph, NodeIndex, INCOMING, OUTGOING,
|
Direction, Graph, NodeIndex, INCOMING, OUTGOING,
|
||||||
};
|
};
|
||||||
use rustc_data_structures::intern::Interned;
|
use rustc_data_structures::intern::Interned;
|
||||||
|
use rustc_data_structures::unord::UnordSet;
|
||||||
use rustc_index::{IndexSlice, IndexVec};
|
use rustc_index::{IndexSlice, IndexVec};
|
||||||
use rustc_middle::ty::fold::TypeFoldable;
|
use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
|
@ -139,8 +140,8 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
|
||||||
let mut var_data = self.construct_var_data();
|
let mut var_data = self.construct_var_data();
|
||||||
|
|
||||||
// Deduplicating constraints is shown to have a positive perf impact.
|
// Deduplicating constraints is shown to have a positive perf impact.
|
||||||
self.data.constraints.sort_by_key(|(constraint, _)| *constraint);
|
let mut seen = UnordSet::default();
|
||||||
self.data.constraints.dedup_by_key(|(constraint, _)| *constraint);
|
self.data.constraints.retain(|(constraint, _)| seen.insert(*constraint));
|
||||||
|
|
||||||
if cfg!(debug_assertions) {
|
if cfg!(debug_assertions) {
|
||||||
self.dump_constraints();
|
self.dump_constraints();
|
||||||
|
@ -888,12 +889,14 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Constraint::RegSubVar(region, _) | Constraint::VarSubReg(_, region) => {
|
Constraint::RegSubVar(region, _) | Constraint::VarSubReg(_, region) => {
|
||||||
let constraint_idx =
|
let origin = this
|
||||||
this.constraints.binary_search_by(|(c, _)| c.cmp(&edge.data)).unwrap();
|
.constraints
|
||||||
state.result.push(RegionAndOrigin {
|
.iter()
|
||||||
region,
|
.find(|(c, _)| *c == edge.data)
|
||||||
origin: this.constraints[constraint_idx].1.clone(),
|
.unwrap()
|
||||||
});
|
.1
|
||||||
|
.clone();
|
||||||
|
state.result.push(RegionAndOrigin { region, origin });
|
||||||
}
|
}
|
||||||
|
|
||||||
Constraint::RegSubReg(..) => panic!(
|
Constraint::RegSubReg(..) => panic!(
|
||||||
|
|
|
@ -104,7 +104,7 @@ pub struct RegionConstraintData<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents a constraint that influences the inference process.
|
/// Represents a constraint that influences the inference process.
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Debug, PartialOrd, Ord)]
|
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
|
||||||
pub enum Constraint<'tcx> {
|
pub enum Constraint<'tcx> {
|
||||||
/// A region variable is a subregion of another.
|
/// A region variable is a subregion of another.
|
||||||
VarSubVar(RegionVid, RegionVid),
|
VarSubVar(RegionVid, RegionVid),
|
||||||
|
|
|
@ -1,22 +1,3 @@
|
||||||
error[E0308]: mismatched types
|
|
||||||
--> $DIR/issue-27942.rs:5:25
|
|
||||||
|
|
|
||||||
LL | fn select(&self) -> BufferViewHandle<R>;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
|
||||||
|
|
|
||||||
= note: expected trait `Resources<'_>`
|
|
||||||
found trait `Resources<'a>`
|
|
||||||
note: the anonymous lifetime defined here...
|
|
||||||
--> $DIR/issue-27942.rs:5:15
|
|
||||||
|
|
|
||||||
LL | fn select(&self) -> BufferViewHandle<R>;
|
|
||||||
| ^^^^^
|
|
||||||
note: ...does not necessarily outlive the lifetime `'a` as defined here
|
|
||||||
--> $DIR/issue-27942.rs:3:18
|
|
||||||
|
|
|
||||||
LL | pub trait Buffer<'a, R: Resources<'a>> {
|
|
||||||
| ^^
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/issue-27942.rs:5:25
|
--> $DIR/issue-27942.rs:5:25
|
||||||
|
|
|
|
||||||
|
@ -36,6 +17,25 @@ note: ...does not necessarily outlive the anonymous lifetime defined here
|
||||||
LL | fn select(&self) -> BufferViewHandle<R>;
|
LL | fn select(&self) -> BufferViewHandle<R>;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/issue-27942.rs:5:25
|
||||||
|
|
|
||||||
|
LL | fn select(&self) -> BufferViewHandle<R>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
||||||
|
|
|
||||||
|
= note: expected trait `Resources<'_>`
|
||||||
|
found trait `Resources<'a>`
|
||||||
|
note: the anonymous lifetime defined here...
|
||||||
|
--> $DIR/issue-27942.rs:5:15
|
||||||
|
|
|
||||||
|
LL | fn select(&self) -> BufferViewHandle<R>;
|
||||||
|
| ^^^^^
|
||||||
|
note: ...does not necessarily outlive the lifetime `'a` as defined here
|
||||||
|
--> $DIR/issue-27942.rs:3:18
|
||||||
|
|
|
||||||
|
LL | pub trait Buffer<'a, R: Resources<'a>> {
|
||||||
|
| ^^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
|
|
@ -4,13 +4,13 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` d
|
||||||
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: first, the lifetime cannot outlive the lifetime `'a` as defined here...
|
note: first, the lifetime cannot outlive the lifetime `'b` as defined here...
|
||||||
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:6
|
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:9
|
||||||
|
|
|
|
||||||
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
||||||
| ^^
|
| ^^
|
||||||
note: ...but the lifetime must also be valid for the lifetime `'b` as defined here...
|
note: ...but the lifetime must also be valid for the lifetime `'a` as defined here...
|
||||||
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:9
|
--> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:6
|
||||||
|
|
|
|
||||||
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
|
@ -1,22 +1,3 @@
|
||||||
error[E0308]: method not compatible with trait
|
|
||||||
--> $DIR/matching-lifetimes.rs:14:5
|
|
||||||
|
|
|
||||||
LL | fn foo(x: Foo<'b,'a>) {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
|
||||||
|
|
|
||||||
= note: expected signature `fn(Foo<'a, 'b>)`
|
|
||||||
found signature `fn(Foo<'b, 'a>)`
|
|
||||||
note: the lifetime `'b` as defined here...
|
|
||||||
--> $DIR/matching-lifetimes.rs:13:9
|
|
||||||
|
|
|
||||||
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
|
||||||
| ^^
|
|
||||||
note: ...does not necessarily outlive the lifetime `'a` as defined here
|
|
||||||
--> $DIR/matching-lifetimes.rs:13:6
|
|
||||||
|
|
|
||||||
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
|
||||||
| ^^
|
|
||||||
|
|
||||||
error[E0308]: method not compatible with trait
|
error[E0308]: method not compatible with trait
|
||||||
--> $DIR/matching-lifetimes.rs:14:5
|
--> $DIR/matching-lifetimes.rs:14:5
|
||||||
|
|
|
|
||||||
|
@ -36,6 +17,25 @@ note: ...does not necessarily outlive the lifetime `'b` as defined here
|
||||||
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
||||||
|
error[E0308]: method not compatible with trait
|
||||||
|
--> $DIR/matching-lifetimes.rs:14:5
|
||||||
|
|
|
||||||
|
LL | fn foo(x: Foo<'b,'a>) {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
||||||
|
|
|
||||||
|
= note: expected signature `fn(Foo<'a, 'b>)`
|
||||||
|
found signature `fn(Foo<'b, 'a>)`
|
||||||
|
note: the lifetime `'b` as defined here...
|
||||||
|
--> $DIR/matching-lifetimes.rs:13:9
|
||||||
|
|
|
||||||
|
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
||||||
|
| ^^
|
||||||
|
note: ...does not necessarily outlive the lifetime `'a` as defined here
|
||||||
|
--> $DIR/matching-lifetimes.rs:13:6
|
||||||
|
|
|
||||||
|
LL | impl<'a,'b> Tr for Foo<'a,'b> {
|
||||||
|
| ^^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue