@@ -297,22 +297,38 @@ pub fn check_pat_struct(pcx: &pat_ctxt, pat: &ast::Pat,
297297 let tcx = pcx. fcx . ccx . tcx ;
298298
299299 let def = tcx. def_map . borrow ( ) [ pat. id ] . clone ( ) ;
300- let def_type = ty:: lookup_item_type ( tcx, def. def_id ( ) ) ;
301- let ( enum_def_id, variant_def_id) = match ty:: get ( def_type. ty ) . sty {
302- ty:: ty_struct( struct_def_id, _) =>
303- ( struct_def_id, struct_def_id) ,
304- ty:: ty_enum( enum_def_id, _) if def == def:: DefVariant ( enum_def_id, def. def_id ( ) , true ) =>
305- ( enum_def_id, def. def_id ( ) ) ,
306- _ => {
300+ let ( enum_def_id, variant_def_id) = match def {
301+ def:: DefTrait ( _) => {
307302 let name = pprust:: path_to_string ( path) ;
308- span_err ! ( tcx. sess, pat. span, E0163 ,
309- "`{}` does not name a struct or a struct variant " , name) ;
303+ span_err ! ( tcx. sess, pat. span, E0168 ,
304+ "use of trait `{}` in a struct pattern " , name) ;
310305 fcx. write_error ( pat. id ) ;
311306
312307 for field in fields. iter ( ) {
313308 check_pat ( pcx, & * field. node . pat , ty:: mk_err ( ) ) ;
314309 }
315310 return ;
311+ } ,
312+ _ => {
313+ let def_type = ty:: lookup_item_type ( tcx, def. def_id ( ) ) ;
314+ match ty:: get ( def_type. ty ) . sty {
315+ ty:: ty_struct( struct_def_id, _) =>
316+ ( struct_def_id, struct_def_id) ,
317+ ty:: ty_enum( enum_def_id, _)
318+ if def == def:: DefVariant ( enum_def_id, def. def_id ( ) , true ) =>
319+ ( enum_def_id, def. def_id ( ) ) ,
320+ _ => {
321+ let name = pprust:: path_to_string ( path) ;
322+ span_err ! ( tcx. sess, pat. span, E0163 ,
323+ "`{}` does not name a struct or a struct variant" , name) ;
324+ fcx. write_error ( pat. id ) ;
325+
326+ for field in fields. iter ( ) {
327+ check_pat ( pcx, & * field. node . pat , ty:: mk_err ( ) ) ;
328+ }
329+ return ;
330+ }
331+ }
316332 }
317333 } ;
318334
0 commit comments