Rollup merge of #134314 - compiler-errors:default-struct-value-const, r=estebank
Make sure to use normalized ty for unevaluated const in default struct value This cleans up the way that we construct the `mir::Const::Unevaluated` for default struct values. We were previously using `from_unevaluated`, which doesn't normalize the type, and is really only used for inline assembly. Other codepaths (such as `ExprKind::NamedConst`) use the type from the body. Also, let's stop using `literal_operand`, which also is really not meant for calls other than for literal comparisons in pattern lowering. Also move all of the tests to a separate subdirectory so they don't need to have the same prefix on all the test files. Fixes #134298 r? estebank or reassign
This commit is contained in:
commit
050e0cc6eb
8 changed files with 46 additions and 23 deletions
|
@ -367,14 +367,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
.collect()
|
||||
}
|
||||
AdtExprBase::DefaultFields(field_types) => {
|
||||
itertools::zip_eq(field_names, &**field_types)
|
||||
.map(|(n, ty)| match fields_map.get(&n) {
|
||||
itertools::zip_eq(field_names, field_types)
|
||||
.map(|(n, &ty)| match fields_map.get(&n) {
|
||||
Some(v) => v.clone(),
|
||||
None => match variant.fields[n].value {
|
||||
Some(def) => {
|
||||
let value = Const::from_unevaluated(this.tcx, def)
|
||||
.instantiate(this.tcx, args);
|
||||
this.literal_operand(expr_span, value)
|
||||
let value = Const::Unevaluated(
|
||||
UnevaluatedConst::new(def, args),
|
||||
ty,
|
||||
);
|
||||
Operand::Constant(Box::new(ConstOperand {
|
||||
span: expr_span,
|
||||
user_ty: None,
|
||||
const_: value,
|
||||
}))
|
||||
}
|
||||
None => {
|
||||
let name = variant.fields[n].name;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue