Skip to content

Commit

Permalink
Auto merge of rust-lang#135273 - dianne:argument-patterns-are-not-bor…
Browse files Browse the repository at this point in the history
…ing, r=lqd

Remove special-casing for argument patterns in MIR typeck (attempt to fix perf regression of  rust-lang#133858)

See [my comment](rust-lang#133858 (comment)) on rust-lang#133858 for more information. This is just a guess as to what went wrong, and I haven't been able to get the profiler running locally, so I'll need a perf run to make sure this actually helps.

There's one test's stderr that suffers a bit, but this was just papering over the issue anyway. Making region errors point to the correct constraints in the presence of invariance/contravariance is a broader problem; the current way it's handled is mostly based on guesswork, luck, and hoping it works out. Properly handling that (somehow) would improve the test's stderr without the hack that this PR reverts.
  • Loading branch information
bors committed Jan 10, 2025
2 parents 67951d9 + 72945be commit b44e14f
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 20 deletions.
13 changes: 0 additions & 13 deletions compiler/rustc_borrowck/src/type_check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -892,19 +892,6 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
Some(l) if !body.local_decls[l].is_user_variable() => {
ConstraintCategory::Boring
}
Some(_)
if let Some(body_id) = tcx
.hir_node_by_def_id(body.source.def_id().expect_local())
.body_id()
&& let params = tcx.hir().body(body_id).params
&& params
.iter()
.any(|param| param.span.contains(stmt.source_info.span)) =>
{
// Assignments generated from lowering argument patterns shouldn't be called
// "assignments" in diagnostics and aren't interesting to blame for errors.
ConstraintCategory::Boring
}
_ => ConstraintCategory::Assignment,
};
debug!(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
fn foo(&mut (ref mut v, w): &mut (&u8, &u8), x: &u8) {
*v = x;
//~^ ERROR lifetime may not live long enough
*v = x;
}

fn main() { }
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
error: lifetime may not live long enough
--> $DIR/ex3-both-anon-regions-2.rs:2:5
--> $DIR/ex3-both-anon-regions-2.rs:1:14
|
LL | fn foo(&mut (ref mut v, w): &mut (&u8, &u8), x: &u8) {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
LL | *v = x;
| ^^^^^^ assignment requires that `'1` must outlive `'2`
| ^^^^^^^^^ - - let's call the lifetime of this reference `'1`
| | |
| | let's call the lifetime of this reference `'2`
| assignment requires that `'1` must outlive `'2`
|
= note: requirement occurs because of a mutable reference to `&u8`
= note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
help: consider introducing a named lifetime parameter
|
LL | fn foo<'a>(&mut (ref mut v, w): &mut (&'a u8, &u8), x: &'a u8) {
Expand Down

0 comments on commit b44e14f

Please sign in to comment.