@@ -3063,6 +3063,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30633063 remaining_fields. insert ( field. name , field) ;
30643064 }
30653065
3066+ let mut seen_fields = FnvHashMap ( ) ;
3067+
30663068 let mut error_happened = false ;
30673069
30683070 // Typecheck each field.
@@ -3071,13 +3073,25 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
30713073
30723074 if let Some ( v_field) = remaining_fields. remove ( & field. name . node ) {
30733075 expected_field_type = self . field_ty ( field. span , v_field, substs) ;
3076+
3077+ seen_fields. insert ( field. name . node , field. span ) ;
30743078 } else {
30753079 error_happened = true ;
30763080 expected_field_type = tcx. types . err ;
30773081 if let Some ( _) = variant. find_field_named ( field. name . node ) {
3078- span_err ! ( self . tcx. sess, field. name. span, E0062 ,
3079- "field `{}` specified more than once" ,
3080- field. name. node) ;
3082+ let mut err = struct_span_err ! ( self . tcx. sess,
3083+ field. name. span,
3084+ E0062 ,
3085+ "field `{}` specified more than once" ,
3086+ field. name. node) ;
3087+
3088+ err. span_label ( field. name . span , & format ! ( "used more than once" ) ) ;
3089+
3090+ if let Some ( prev_span) = seen_fields. get ( & field. name . node ) {
3091+ err. span_label ( * prev_span, & format ! ( "first use of `{}`" , field. name. node) ) ;
3092+ }
3093+
3094+ err. emit ( ) ;
30813095 } else {
30823096 self . report_unknown_field ( adt_ty, variant, field, ast_fields) ;
30833097 }
0 commit comments