Some better support for unions through the compiler
This commit is contained in:
parent
a014323e45
commit
641d8e9e4c
51 changed files with 241 additions and 132 deletions
|
|
@ -566,7 +566,7 @@ fn construct_witness<'a,'tcx>(cx: &MatchCheckCtxt<'a,'tcx>, ctor: &Constructor,
|
|||
let pat = match left_ty.sty {
|
||||
ty::TyTuple(..) => PatKind::Tuple(pats.collect(), None),
|
||||
|
||||
ty::TyEnum(adt, _) | ty::TyStruct(adt, _) => {
|
||||
ty::TyEnum(adt, _) | ty::TyStruct(adt, _) | ty::TyUnion(adt, _) => {
|
||||
let v = ctor.variant_for_adt(adt);
|
||||
match v.kind {
|
||||
VariantKind::Struct => {
|
||||
|
|
@ -792,7 +792,8 @@ fn pat_constructors(cx: &MatchCheckCtxt, p: &Pat,
|
|||
PatKind::Struct(..) | PatKind::TupleStruct(..) | PatKind::Path(..) =>
|
||||
match cx.tcx.expect_def(pat.id) {
|
||||
Def::Variant(_, id) => vec![Variant(id)],
|
||||
Def::Struct(..) | Def::TyAlias(..) | Def::AssociatedTy(..) => vec![Single],
|
||||
Def::Struct(..) | Def::Union(..) |
|
||||
Def::TyAlias(..) | Def::AssociatedTy(..) => vec![Single],
|
||||
Def::Const(..) | Def::AssociatedConst(..) =>
|
||||
span_bug!(pat.span, "const pattern should've been rewritten"),
|
||||
def => span_bug!(pat.span, "pat_constructors: unexpected definition {:?}", def),
|
||||
|
|
@ -836,7 +837,7 @@ pub fn constructor_arity(_cx: &MatchCheckCtxt, ctor: &Constructor, ty: Ty) -> us
|
|||
_ => bug!()
|
||||
},
|
||||
ty::TyRef(..) => 1,
|
||||
ty::TyEnum(adt, _) | ty::TyStruct(adt, _) => {
|
||||
ty::TyEnum(adt, _) | ty::TyStruct(adt, _) | ty::TyUnion(adt, _) => {
|
||||
ctor.variant_for_adt(adt).fields.len()
|
||||
}
|
||||
ty::TyArray(_, n) => n,
|
||||
|
|
|
|||
|
|
@ -258,7 +258,8 @@ pub fn const_expr_to_pat<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
format!("floating point constants cannot be used in patterns"));
|
||||
}
|
||||
ty::TyEnum(adt_def, _) |
|
||||
ty::TyStruct(adt_def, _) => {
|
||||
ty::TyStruct(adt_def, _) |
|
||||
ty::TyUnion(adt_def, _) => {
|
||||
if !tcx.has_attr(adt_def.did, "structural_match") {
|
||||
tcx.sess.add_lint(
|
||||
lint::builtin::ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue