mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Check params for unsafety in THIR
(cherry picked from commit 12f2bcde63
)
This commit is contained in:
parent
85f29bda08
commit
49891df793
@ -218,6 +218,13 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
|
||||
warnings: self.warnings,
|
||||
suggest_unsafe_block: self.suggest_unsafe_block,
|
||||
};
|
||||
// params in THIR may be unsafe, e.g. a union pattern.
|
||||
for param in &inner_thir.params {
|
||||
if let Some(param_pat) = param.pat.as_deref() {
|
||||
inner_visitor.visit_pat(param_pat);
|
||||
}
|
||||
}
|
||||
// Visit the body.
|
||||
inner_visitor.visit_expr(&inner_thir[expr]);
|
||||
// Unsafe blocks can be used in the inner body, make sure to take it into account
|
||||
self.safety_context = inner_visitor.safety_context;
|
||||
@ -1066,6 +1073,13 @@ pub(crate) fn check_unsafety(tcx: TyCtxt<'_>, def: LocalDefId) {
|
||||
warnings: &mut warnings,
|
||||
suggest_unsafe_block: true,
|
||||
};
|
||||
// params in THIR may be unsafe, e.g. a union pattern.
|
||||
for param in &thir.params {
|
||||
if let Some(param_pat) = param.pat.as_deref() {
|
||||
visitor.visit_pat(param_pat);
|
||||
}
|
||||
}
|
||||
// Visit the body.
|
||||
visitor.visit_expr(&thir[expr]);
|
||||
|
||||
warnings.sort_by_key(|w| w.block_span);
|
||||
|
19
tests/ui/unsafe/union-pat-in-param.rs
Normal file
19
tests/ui/unsafe/union-pat-in-param.rs
Normal file
@ -0,0 +1,19 @@
|
||||
union U {
|
||||
a: &'static i32,
|
||||
b: usize,
|
||||
}
|
||||
|
||||
fn fun(U { a }: U) {
|
||||
//~^ ERROR access to union field is unsafe
|
||||
dbg!(*a);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
fun(U { b: 0 });
|
||||
|
||||
let closure = |U { a }| {
|
||||
//~^ ERROR access to union field is unsafe
|
||||
dbg!(*a);
|
||||
};
|
||||
closure(U { b: 0 });
|
||||
}
|
19
tests/ui/unsafe/union-pat-in-param.stderr
Normal file
19
tests/ui/unsafe/union-pat-in-param.stderr
Normal file
@ -0,0 +1,19 @@
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-pat-in-param.rs:6:12
|
||||
|
|
||||
LL | fn fun(U { a }: U) {
|
||||
| ^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error[E0133]: access to union field is unsafe and requires unsafe function or block
|
||||
--> $DIR/union-pat-in-param.rs:14:24
|
||||
|
|
||||
LL | let closure = |U { a }| {
|
||||
| ^ access to union field
|
||||
|
|
||||
= note: the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0133`.
|
Loading…
Reference in New Issue
Block a user