Skip to content

Commit

Permalink
Check params for unsafety in THIR
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Sep 18, 2024
1 parent 7fc70f8 commit 12f2bcd
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
14 changes: 14 additions & 0 deletions compiler/rustc_mir_build/src/check_unsafety.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1032,6 +1039,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);
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/unsafe/union-pat-in-param.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 19 additions & 0 deletions tests/ui/unsafe/union-pat-in-param.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 12f2bcd

Please sign in to comment.