Skip to content

Commit

Permalink
Unrolled build for rust-lang#130533
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#130533 - compiler-errors:never-pat-unsafeck, r=Nadrieril

Never patterns constitute a read for unsafety

This code is otherwise unsound if we don't emit an unsafety error here. Noticed when fixing rust-lang#130528, but it's totally unrelated.

r? `@Nadrieril`
  • Loading branch information
rust-timer authored Sep 19, 2024
2 parents f8192ba + e138e87 commit 0456540
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 4 deletions.
9 changes: 5 additions & 4 deletions compiler/rustc_mir_build/src/check_unsafety.rs
Original file line number Diff line number Diff line change
Expand Up @@ -315,14 +315,15 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
| PatKind::DerefPattern { .. }
| PatKind::Range { .. }
| PatKind::Slice { .. }
| PatKind::Array { .. } => {
| PatKind::Array { .. }
// Never constitutes a witness of uninhabitedness.
| PatKind::Never => {
self.requires_unsafe(pat.span, AccessToUnionField);
return; // we can return here since this already requires unsafe
}
// wildcard/never don't take anything
// wildcard doesn't read anything.
PatKind::Wild |
PatKind::Never |
// these just wrap other patterns
// these just wrap other patterns, which we recurse on below.
PatKind::Or { .. } |
PatKind::InlineConstant { .. } |
PatKind::AscribeUserType { .. } |
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/rfcs/rfc-0000-never_patterns/never-pattern-is-a-read.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Make sure we consider `!` to be a union read.

#![feature(never_type, never_patterns)]
//~^ WARN the feature `never_patterns` is incomplete

union U {
a: !,
b: usize,
}

fn foo<T>(u: U) -> ! {
let U { a: ! } = u;
//~^ ERROR access to union field is unsafe
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
warning: the feature `never_patterns` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/never-pattern-is-a-read.rs:3:24
|
LL | #![feature(never_type, never_patterns)]
| ^^^^^^^^^^^^^^
|
= note: see issue #118155 <https://github.com/rust-lang/rust/issues/118155> for more information
= note: `#[warn(incomplete_features)]` on by default

error[E0133]: access to union field is unsafe and requires unsafe function or block
--> $DIR/never-pattern-is-a-read.rs:12:16
|
LL | let U { a: ! } = u;
| ^ access to union field
|
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior

error: aborting due to 1 previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0133`.

0 comments on commit 0456540

Please sign in to comment.