diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/transform/check_consts/resolver.rs | 12 |
2 files changed, 14 insertions, 1 deletions
diff --git a/compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs b/compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs index aa42f8936f3..0fdb772c262 100644 --- a/compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs +++ b/compiler/rustc_const_eval/src/transform/check_consts/qualifs.rs @@ -258,6 +258,9 @@ where if Q::in_adt_inherently(cx, def, substs) { return true; } + if def.is_union() && Q::in_any_value_of_ty(cx, rvalue.ty(cx.body, cx.tcx)) { + return true; + } } // Otherwise, proceed structurally... diff --git a/compiler/rustc_const_eval/src/transform/check_consts/resolver.rs b/compiler/rustc_const_eval/src/transform/check_consts/resolver.rs index e20b86dd452..f516c07243e 100644 --- a/compiler/rustc_const_eval/src/transform/check_consts/resolver.rs +++ b/compiler/rustc_const_eval/src/transform/check_consts/resolver.rs @@ -42,9 +42,19 @@ where } } - fn assign_qualif_direct(&mut self, place: &mir::Place<'tcx>, value: bool) { + fn assign_qualif_direct(&mut self, place: &mir::Place<'tcx>, mut value: bool) { debug_assert!(!place.is_indirect()); + if !value { + for (base, _elem) in place.iter_projections() { + let base_ty = base.ty(self.ccx.body, self.ccx.tcx); + if base_ty.ty.is_union() && Q::in_any_value_of_ty(self.ccx, base_ty.ty) { + value = true; + break; + } + } + } + match (value, place.as_ref()) { (true, mir::PlaceRef { local, .. }) => { self.qualifs_per_local.insert(local); |
