Skip to content

Commit 6d99272

Browse files
committed
Auto merge of #27833 - arielb1:robust-construction, r=eddyb
Fixes #27815 r? @eddyb
2 parents 47ea0cf + 44f4106 commit 6d99272

File tree

11 files changed

+257
-298
lines changed

11 files changed

+257
-298
lines changed

src/librustc_typeck/check/_match.rs

+14-43
Original file line numberDiff line numberDiff line change
@@ -528,60 +528,31 @@ pub fn check_pat_struct<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>, pat: &'tcx ast::Pat,
528528
let tcx = pcx.fcx.ccx.tcx;
529529

530530
let def = tcx.def_map.borrow().get(&pat.id).unwrap().full_def();
531-
let (adt_def, variant) = match def {
532-
def::DefTrait(_) => {
531+
let variant = match fcx.def_struct_variant(def) {
532+
Some((_, variant)) => variant,
533+
None => {
533534
let name = pprust::path_to_string(path);
534-
span_err!(tcx.sess, pat.span, E0168,
535-
"use of trait `{}` in a struct pattern", name);
535+
span_err!(tcx.sess, pat.span, E0163,
536+
"`{}` does not name a struct or a struct variant", name);
536537
fcx.write_error(pat.id);
537538

538539
for field in fields {
539-
check_pat(pcx, &*field.node.pat, tcx.types.err);
540+
check_pat(pcx, &field.node.pat, tcx.types.err);
540541
}
541542
return;
542-
},
543-
_ => {
544-
let def_type = tcx.lookup_item_type(def.def_id());
545-
match def_type.ty.sty {
546-
ty::TyStruct(struct_def, _) =>
547-
(struct_def, struct_def.struct_variant()),
548-
ty::TyEnum(enum_def, _)
549-
if def == def::DefVariant(enum_def.did, def.def_id(), true) =>
550-
(enum_def, enum_def.variant_of_def(def)),
551-
_ => {
552-
let name = pprust::path_to_string(path);
553-
span_err!(tcx.sess, pat.span, E0163,
554-
"`{}` does not name a struct or a struct variant", name);
555-
fcx.write_error(pat.id);
556-
557-
for field in fields {
558-
check_pat(pcx, &*field.node.pat, tcx.types.err);
559-
}
560-
return;
561-
}
562-
}
563543
}
564544
};
565545

566-
instantiate_path(pcx.fcx,
567-
&path.segments,
568-
adt_def.type_scheme(tcx),
569-
&adt_def.predicates(tcx),
570-
None,
571-
def,
572-
pat.span,
573-
pat.id);
574-
575-
let pat_ty = fcx.node_ty(pat.id);
546+
let pat_ty = pcx.fcx.instantiate_type(def.def_id(), path);
547+
let item_substs = match pat_ty.sty {
548+
ty::TyStruct(_, substs) | ty::TyEnum(_, substs) => substs,
549+
_ => tcx.sess.span_bug(pat.span, "struct variant is not an ADT")
550+
};
576551
demand::eqtype(fcx, pat.span, expected, pat_ty);
577-
578-
let item_substs = fcx
579-
.item_substs()
580-
.get(&pat.id)
581-
.map(|substs| substs.substs.clone())
582-
.unwrap_or_else(|| Substs::empty());
583-
584552
check_struct_pat_fields(pcx, pat.span, fields, variant, &item_substs, etc);
553+
554+
fcx.write_ty(pat.id, pat_ty);
555+
fcx.write_substs(pat.id, ty::ItemSubsts { substs: item_substs.clone() });
585556
}
586557

587558
pub fn check_pat_enum<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>,

0 commit comments

Comments
 (0)