@@ -3063,6 +3063,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3063
3063
remaining_fields. insert ( field. name , field) ;
3064
3064
}
3065
3065
3066
+ let mut seen_fields = FnvHashMap ( ) ;
3067
+
3066
3068
let mut error_happened = false ;
3067
3069
3068
3070
// Typecheck each field.
@@ -3071,13 +3073,25 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3071
3073
3072
3074
if let Some ( v_field) = remaining_fields. remove ( & field. name . node ) {
3073
3075
expected_field_type = self . field_ty ( field. span , v_field, substs) ;
3076
+
3077
+ seen_fields. insert ( field. name . node , field. span ) ;
3074
3078
} else {
3075
3079
error_happened = true ;
3076
3080
expected_field_type = tcx. types . err ;
3077
3081
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 ( ) ;
3081
3095
} else {
3082
3096
self . report_unknown_field ( adt_ty, variant, field, ast_fields) ;
3083
3097
}
0 commit comments