Rollup merge of #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 #130528, but it's totally unrelated. r? `@Nadrieril`
This commit is contained in:
commit
f9b8ef0687
@ -322,14 +322,15 @@ fn visit_pat(&mut self, pat: &'a Pat<'tcx>) {
|
|||||||
| PatKind::DerefPattern { .. }
|
| PatKind::DerefPattern { .. }
|
||||||
| PatKind::Range { .. }
|
| PatKind::Range { .. }
|
||||||
| PatKind::Slice { .. }
|
| PatKind::Slice { .. }
|
||||||
| PatKind::Array { .. } => {
|
| PatKind::Array { .. }
|
||||||
|
// Never constitutes a witness of uninhabitedness.
|
||||||
|
| PatKind::Never => {
|
||||||
self.requires_unsafe(pat.span, AccessToUnionField);
|
self.requires_unsafe(pat.span, AccessToUnionField);
|
||||||
return; // we can return here since this already requires unsafe
|
return; // we can return here since this already requires unsafe
|
||||||
}
|
}
|
||||||
// wildcard/never don't take anything
|
// wildcard doesn't read anything.
|
||||||
PatKind::Wild |
|
PatKind::Wild |
|
||||||
PatKind::Never |
|
// these just wrap other patterns, which we recurse on below.
|
||||||
// these just wrap other patterns
|
|
||||||
PatKind::Or { .. } |
|
PatKind::Or { .. } |
|
||||||
PatKind::InlineConstant { .. } |
|
PatKind::InlineConstant { .. } |
|
||||||
PatKind::AscribeUserType { .. } |
|
PatKind::AscribeUserType { .. } |
|
||||||
|
@ -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() {}
|
@ -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`.
|
Loading…
Reference in New Issue
Block a user