diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-07-28 15:37:41 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-28 15:37:41 +0000 |
commit | 6d5eb739f069e41a8789c15b199893acf06915a8 (patch) | |
tree | 7755f2c23856c20a9ebd60c7a796d4cd3efed242 | |
parent | add0846629c918618a0a9196ba62ccb466d05beb (diff) | |
parent | f532ae5aa37c8555dd6a99d8502436509db7930f (diff) | |
download | gcc-6d5eb739f069e41a8789c15b199893acf06915a8.zip gcc-6d5eb739f069e41a8789c15b199893acf06915a8.tar.gz gcc-6d5eb739f069e41a8789c15b199893acf06915a8.tar.bz2 |
Merge #1416
1416: unsafe: Add checks for union field accesses r=CohenArthur a=CohenArthur
Addresses #1411
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
-rw-r--r-- | gcc/rust/checks/errors/rust-unsafe-checker.cc | 20 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/unsafe9.rs | 10 |
2 files changed, 27 insertions, 3 deletions
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc b/gcc/rust/checks/errors/rust-unsafe-checker.cc index d234179..683a803 100644 --- a/gcc/rust/checks/errors/rust-unsafe-checker.cc +++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc @@ -332,10 +332,24 @@ UnsafeChecker::visit (MethodCallExpr &expr) void UnsafeChecker::visit (FieldAccessExpr &expr) { - // FIXME: If the receiver is an union, we need to be in an unsafe context to - // access it. Make sure to check. - expr.get_receiver_expr ()->accept_vis (*this); + + if (is_unsafe_context ()) + return; + + TyTy::BaseType *receiver_ty; + auto ok = context.lookup_type ( + expr.get_receiver_expr ()->get_mappings ().get_hirid (), &receiver_ty); + rust_assert (ok); + + if (receiver_ty->get_kind () == TyTy::TypeKind::ADT) + { + auto maybe_union = static_cast<TyTy::ADTType *> (receiver_ty); + if (maybe_union->is_union ()) + rust_error_at ( + expr.get_locus (), + "access to union field requires unsafe function or block"); + } } void diff --git a/gcc/testsuite/rust/compile/unsafe9.rs b/gcc/testsuite/rust/compile/unsafe9.rs new file mode 100644 index 0000000..fb46c8f --- /dev/null +++ b/gcc/testsuite/rust/compile/unsafe9.rs @@ -0,0 +1,10 @@ +union U { + a: i32, + b: f32, + c: u8, +} + +fn main() { + let u = U { a: 14 }; + let _ = u.a; // { dg-error "access to union" } +} |