struct EffectCheckVisitor<'a, 'tcx: 'a> {
tcx: TyCtxt<'a, 'tcx, 'tcx>,
tables: &'a ty::TypeckTables<'tcx>,
+ body_id: hir::BodyId,
/// Whether we're in an unsafe context.
unsafe_context: UnsafeContext,
fn visit_nested_body(&mut self, body: hir::BodyId) {
let old_tables = self.tables;
+ let old_body_id = self.body_id;
self.tables = self.tcx.body_tables(body);
+ self.body_id = body;
let body = self.tcx.hir.body(body);
self.visit_body(body);
self.tables = old_tables;
+ self.body_id = old_body_id;
}
fn visit_fn(&mut self, fn_kind: FnKind<'tcx>, fn_decl: &'tcx hir::FnDecl,
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) {
+ let owner_def_id = self.tcx.hir.body_owner_def_id(self.body_id);
+ let param_env = self.tcx.param_env(owner_def_id);
+ if field_ty.moves_by_default(self.tcx, param_env, field.span) {
self.require_unsafe(field.span,
"assignment to non-`Copy` union field");
}
let mut visitor = EffectCheckVisitor {
tcx: tcx,
tables: &ty::TypeckTables::empty(),
+ body_id: hir::BodyId { node_id: ast::CRATE_NODE_ID },
unsafe_context: UnsafeContext::new(SafeContext),
};
fn generic_copy<T: Copy + Default>() {
let mut u3 = U3 { a: T::default() };
- // FIXME: it should be known here that `T: Copy`, need to use correct "parameter environment"
- u3.a = T::default(); //~ ERROR assignment to non-`Copy` union field requires unsafe
+ u3.a = T::default(); // OK
let mut u4 = U4 { a: T::default() };
u4.a = T::default(); // OK
}