Skip to content

Commit 62142cb

Browse files
committed
Auto merge of #131320 - matthiaskrgr:rollup-tom15b3, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #129392 (Do not consider match/let/ref of place that evaluates to `!` to diverge, disallow coercions from them too) - #131279 (update "build/host" symlink comment) - #131312 (On function and method calls in patterns, link to the book) - #131315 (bootstrap: add `std_features` config) - #131316 (Fix typo in primitive_docs.rs) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 42175d7 + 71df30e commit 62142cb

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

tests/pass/underscore_pattern.rs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// Various tests ensuring that underscore patterns really just construct the place, but don't check its contents.
22
#![feature(strict_provenance)]
3+
#![feature(never_type)]
4+
35
use std::ptr;
46

57
fn main() {
@@ -9,6 +11,7 @@ fn main() {
911
invalid_let();
1012
dangling_let_type_annotation();
1113
invalid_let_type_annotation();
14+
never();
1215
}
1316

1417
fn dangling_match() {
@@ -34,13 +37,25 @@ fn invalid_match() {
3437
_ => {}
3538
}
3639
}
40+
41+
unsafe {
42+
let x: Uninit<!> = Uninit { uninit: () };
43+
match x.value {
44+
_ => {}
45+
}
46+
}
3747
}
3848

3949
fn dangling_let() {
4050
unsafe {
4151
let ptr = ptr::without_provenance::<bool>(0x40);
4252
let _ = *ptr;
4353
}
54+
55+
unsafe {
56+
let ptr = ptr::without_provenance::<!>(0x40);
57+
let _ = *ptr;
58+
}
4459
}
4560

4661
fn invalid_let() {
@@ -49,6 +64,12 @@ fn invalid_let() {
4964
let ptr = ptr::addr_of!(val).cast::<bool>();
5065
let _ = *ptr;
5166
}
67+
68+
unsafe {
69+
let val = 3u8;
70+
let ptr = ptr::addr_of!(val).cast::<!>();
71+
let _ = *ptr;
72+
}
5273
}
5374

5475
// Adding a type annotation used to change how MIR is generated, make sure we cover both cases.
@@ -57,6 +78,11 @@ fn dangling_let_type_annotation() {
5778
let ptr = ptr::without_provenance::<bool>(0x40);
5879
let _: bool = *ptr;
5980
}
81+
82+
unsafe {
83+
let ptr = ptr::without_provenance::<!>(0x40);
84+
let _: ! = *ptr;
85+
}
6086
}
6187

6288
fn invalid_let_type_annotation() {
@@ -65,7 +91,28 @@ fn invalid_let_type_annotation() {
6591
let ptr = ptr::addr_of!(val).cast::<bool>();
6692
let _: bool = *ptr;
6793
}
94+
95+
unsafe {
96+
let val = 3u8;
97+
let ptr = ptr::addr_of!(val).cast::<!>();
98+
let _: ! = *ptr;
99+
}
68100
}
69101

70-
// FIXME: we should also test `!`, not just `bool` -- but that s currently buggy:
71-
// https://github.com/rust-lang/rust/issues/117288
102+
// Regression test from <https://github.com/rust-lang/rust/issues/117288>.
103+
fn never() {
104+
unsafe {
105+
let x = 3u8;
106+
let x: *const ! = &x as *const u8 as *const _;
107+
let _: ! = *x;
108+
}
109+
110+
// Without a type annotation, make sure we don't implicitly coerce `!` to `()`
111+
// when we do the noop `*x` (as that would require a `!` *value*, creating
112+
// which is UB).
113+
unsafe {
114+
let x = 3u8;
115+
let x: *const ! = &x as *const u8 as *const _;
116+
let _ = *x;
117+
}
118+
}

0 commit comments

Comments
 (0)