diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-05-18 13:40:15 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-05-25 09:36:45 +0300 |
| commit | 4386f97a93ea0b5f17807f894db5cb662893de03 (patch) | |
| tree | 56d6869a7cdb83e7d5c79682252680c785b01fca /src/librustc/middle | |
| parent | cf747fcbf716a8afced9d23aa15bb47d93805209 (diff) | |
| download | rust-4386f97a93ea0b5f17807f894db5cb662893de03.tar.gz rust-4386f97a93ea0b5f17807f894db5cb662893de03.zip | |
Make assignments to `Copy` union fields safe
Diffstat (limited to 'src/librustc/middle')
| -rw-r--r-- | src/librustc/middle/effect.rs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/librustc/middle/effect.rs b/src/librustc/middle/effect.rs index 5360a86560d..94362e69c8d 100644 --- a/src/librustc/middle/effect.rs +++ b/src/librustc/middle/effect.rs @@ -218,6 +218,24 @@ impl<'a, 'tcx> Visitor<'tcx> for EffectCheckVisitor<'a, 'tcx> { } } } + hir::ExprAssign(ref lhs, ref rhs) => { + if let hir::ExprField(ref base_expr, field) = lhs.node { + if let ty::TyAdt(adt, ..) = self.tables.expr_ty_adjusted(base_expr).sty { + if adt.is_union() { + let field_ty = self.tables.expr_ty_adjusted(lhs); + let param_env = self.tcx.parameter_environment(adt.did); + if field_ty.moves_by_default(self.tcx, ¶m_env, field.span) { + self.require_unsafe(field.span, + "assignment to non-`Copy` union field"); + } + // Do not walk the field expr again. + intravisit::walk_expr(self, base_expr); + intravisit::walk_expr(self, rhs); + return + } + } + } + } _ => {} } |
