Skip to content

Commit

Permalink
Auto merge of rust-lang#115995 - matthiaskrgr:rollup-jukbrvq, r=matth…
Browse files Browse the repository at this point in the history
…iaskrgr

Rollup of 3 pull requests

Successful merges:

 - rust-lang#115965 (Add more if let guard tests)
 - rust-lang#115978 (Copy 1.72.1 release notes to master)
 - rust-lang#115983 (fix confusing let chain indentation in rustc_resolve)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Sep 20, 2023
2 parents 0e11725 + af36ab1 commit 62d9034
Show file tree
Hide file tree
Showing 13 changed files with 310 additions and 7 deletions.
10 changes: 10 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
Version 1.72.1 (2023-09-19)
===========================

- [Adjust codegen change to improve LLVM codegen](https://github.com/rust-lang/rust/pull/115236)
- [rustdoc: Fix self ty params in objects with lifetimes](https://github.com/rust-lang/rust/pull/115276)
- [Fix regression in compile times](https://github.com/rust-lang/rust/pull/114948)
- Resolve some ICE regressions in the compiler:
- [#115215](https://github.com/rust-lang/rust/pull/115215)
- [#115559](https://github.com/rust-lang/rust/pull/115559)

Version 1.72.0 (2023-08-24)
==========================

Expand Down
6 changes: 3 additions & 3 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -991,9 +991,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
if !is_prelude
&& let Some(max_vis) = max_vis.get()
&& !max_vis.is_at_least(import.expect_vis(), self.tcx)
{
self.lint_buffer.buffer_lint(UNUSED_IMPORTS, id, import.span, fluent::resolve_glob_import_doesnt_reexport);
}
{
self.lint_buffer.buffer_lint(UNUSED_IMPORTS, id, import.span, fluent::resolve_glob_import_doesnt_reexport);
}
return None;
}
_ => unreachable!(),
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/async-await/issues/issue-66695-static-refs.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
// build-pass
// edition:2018

#![feature(if_let_guard)]

static A: [i32; 5] = [1, 2, 3, 4, 5];

async fn fun() {
let u = A[async { 1 }.await];
match A {
i if async { true }.await => (),
i if let Some(1) = async { Some(1) }.await => (),
_ => (),
}
}
Expand All @@ -18,6 +21,7 @@ fn main() {
async {
match A {
i if async { true }.await => (),
i if let Some(2) = async { Some(2) }.await => (),
_ => (),
}
};
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/async-await/issues/issue-67611-static-mut-refs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// [drop_tracking] compile-flags: -Zdrop-tracking
// [drop_tracking_mir] compile-flags: -Zdrop-tracking-mir

#![feature(if_let_guard)]

static mut A: [i32; 5] = [1, 2, 3, 4, 5];

fn is_send_sync<T: Send + Sync>(_: T) {}
Expand All @@ -14,6 +16,7 @@ async fn fun() {
unsafe {
match A {
i if async { true }.await => (),
i if let Some(1) = async { Some(1) }.await => (),
_ => (),
}
}
Expand All @@ -27,6 +30,7 @@ fn main() {
unsafe {
match A {
i if async { true }.await => (),
i if let Some(2) = async { Some(2) }.await => (),
_ => (),
}
}
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/async-await/missed-capture-issue-107414.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// check-pass
// edition:2018

#![feature(if_let_guard)]

fn main() {}

struct StructA {}
Expand All @@ -22,3 +24,10 @@ async fn ice() {
_ => {}
}
}

async fn if_let() {
match Some(StructB {}) {
Some(struct_b) if let true = get_struct_a_async().await.fn_taking_struct_b(&struct_b) => {}
_ => {}
}
}
4 changes: 4 additions & 0 deletions tests/ui/binding/match-beginning-vert.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
// run-pass

#![feature(if_let_guard)]

enum Foo {
A,
B,
Expand All @@ -13,6 +16,7 @@ fn main() {
match *foo {
| A => println!("A"),
| B | C if 1 < 2 => println!("BC!"),
| D if let 1 = 1 => println!("D!"),
| _ => {},
}
}
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/drop/dynamic-drop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// needs-unwind

#![feature(generators, generator_trait)]
#![feature(if_let_guard)]

#![allow(unused_assignments)]
#![allow(unused_variables)]
Expand Down Expand Up @@ -332,6 +333,16 @@ fn move_ref_pattern(a: &Allocator) {
let (ref _a, ref mut _b, _c, mut _d) = tup;
}

fn if_let_guard(a: &Allocator, c: bool, d: i32) {
let foo = if c { Some(a.alloc()) } else { None };

match d == 0 {
false if let Some(a) = foo => { let b = a; }
true if let true = { drop(foo.unwrap_or_else(|| a.alloc())); d == 1 } => {}
_ => {}
}
}

fn panic_after_return(a: &Allocator) -> Ptr<'_> {
// Panic in the drop of `p` or `q` can leak
let exceptions = vec![8, 9];
Expand Down Expand Up @@ -497,6 +508,13 @@ fn main() {

run_test(|a| move_ref_pattern(a));

run_test(|a| if_let_guard(a, true, 0));
run_test(|a| if_let_guard(a, true, 1));
run_test(|a| if_let_guard(a, true, 2));
run_test(|a| if_let_guard(a, false, 0));
run_test(|a| if_let_guard(a, false, 1));
run_test(|a| if_let_guard(a, false, 2));

run_test(|a| {
panic_after_return(a);
});
Expand Down
26 changes: 26 additions & 0 deletions tests/ui/rfcs/rfc-2294-if-let-guard/const-expr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Ensure if let guards can be used in constant expressions.
// build-pass

#![feature(if_let_guard)]

const fn match_if_let(x: Option<i32>, y: Option<i32>) -> i32 {
match x {
None if let Some(a @ 5) = y => a,
Some(z) if let (Some(_), 12) = (y, z) => 2,
_ => 3,
}
}

const ASSERTS: usize = {
assert!(match_if_let(None, Some(5)) == 5);
assert!(match_if_let(Some(12), Some(3)) == 2);
assert!(match_if_let(None, Some(4)) == 3);
assert!(match_if_let(Some(11), Some(3)) == 3);
assert!(match_if_let(Some(12), None) == 3);
assert!(match_if_let(None, None) == 3);
0
};

fn main() {
let _: [(); ASSERTS];
}
97 changes: 97 additions & 0 deletions tests/ui/rfcs/rfc-2294-if-let-guard/move-guard-if-let-chain.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#![feature(if_let_guard)]
#![feature(let_chains)]
#![allow(irrefutable_let_patterns)]

fn same_pattern(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if let y = x && c => (),
(1, 2) if let z = x => (), //~ ERROR use of moved value: `x`
_ => (),
}
}

fn same_pattern_ok(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if c && let y = x => (),
(1, 2) if let z = x => (),
_ => (),
}
}

fn different_patterns(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, _) if let y = x && c => (),
(_, 2) if let z = x => (), //~ ERROR use of moved value: `x`
_ => (),
}
}

fn different_patterns_ok(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, _) if c && let y = x => (),
(_, 2) if let z = x => (),
_ => (),
}
}

fn or_pattern(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, _) | (_, 2) if let y = x && c => (), //~ ERROR use of moved value: `x`
_ => (),
}
}

fn or_pattern_ok(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, _) | (_, 2) if c && let y = x => (),
_ => (),
}
}

fn use_in_arm(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if let y = x && c => false,
_ => { *x == 1 }, //~ ERROR use of moved value: `x`
};
}

fn use_in_arm_ok(c: bool) {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if c && let y = x => false,
_ => { *x == 1 },
};
}

fn main() {}
67 changes: 67 additions & 0 deletions tests/ui/rfcs/rfc-2294-if-let-guard/move-guard-if-let-chain.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
error[E0382]: use of moved value: `x`
--> $DIR/move-guard-if-let-chain.rs:12:27
|
LL | let x: Box<_> = Box::new(1);
| - move occurs because `x` has type `Box<i32>`, which does not implement the `Copy` trait
...
LL | (1, 2) if let y = x && c => (),
| - value moved here
LL | (1, 2) if let z = x => (),
| ^ value used here after move
|
help: borrow this binding in the pattern to avoid moving the value
|
LL | (1, 2) if let ref y = x && c => (),
| +++

error[E0382]: use of moved value: `x`
--> $DIR/move-guard-if-let-chain.rs:36:27
|
LL | let x: Box<_> = Box::new(1);
| - move occurs because `x` has type `Box<i32>`, which does not implement the `Copy` trait
...
LL | (1, _) if let y = x && c => (),
| - value moved here
LL | (_, 2) if let z = x => (),
| ^ value used here after move
|
help: borrow this binding in the pattern to avoid moving the value
|
LL | (1, _) if let ref y = x && c => (),
| +++

error[E0382]: use of moved value: `x`
--> $DIR/move-guard-if-let-chain.rs:59:36
|
LL | let x: Box<_> = Box::new(1);
| - move occurs because `x` has type `Box<i32>`, which does not implement the `Copy` trait
...
LL | (1, _) | (_, 2) if let y = x && c => (),
| - ^ value used here after move
| |
| value moved here
|
help: borrow this binding in the pattern to avoid moving the value
|
LL | (1, _) | (_, 2) if let ref y = x && c => (),
| +++

error[E0382]: use of moved value: `x`
--> $DIR/move-guard-if-let-chain.rs:82:16
|
LL | let x: Box<_> = Box::new(1);
| - move occurs because `x` has type `Box<i32>`, which does not implement the `Copy` trait
...
LL | (1, 2) if let y = x && c => false,
| - value moved here
LL | _ => { *x == 1 },
| ^^ value used here after move
|
help: borrow this binding in the pattern to avoid moving the value
|
LL | (1, 2) if let ref y = x && c => false,
| +++

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0382`.
41 changes: 41 additions & 0 deletions tests/ui/rfcs/rfc-2294-if-let-guard/move-guard-if-let.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Check that borrowck knows that moves in the pattern for if-let guards
// only happen when the pattern is matched.

// build-pass

#![feature(if_let_guard)]
#![allow(irrefutable_let_patterns)]

fn same_pattern() {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if let y = x => (),
(1, 2) if let z = x => (),
_ => (),
}
}

fn or_pattern() {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, _) | (_, 2) if let y = x => (),
_ => (),
}
}

fn main() {
let x: Box<_> = Box::new(1);

let v = (1, 2);

match v {
(1, 2) if let y = x => false,
_ => { *x == 1 },
};
}
Loading

0 comments on commit 62d9034

Please sign in to comment.