@@ -3069,6 +3069,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3069
3069
remaining_fields. insert ( field. name , field) ;
3070
3070
}
3071
3071
3072
+ let mut seen_fields = FnvHashMap ( ) ;
3073
+
3072
3074
let mut error_happened = false ;
3073
3075
3074
3076
// Typecheck each field.
@@ -3077,13 +3079,25 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
3077
3079
3078
3080
if let Some ( v_field) = remaining_fields. remove ( & field. name . node ) {
3079
3081
expected_field_type = self . field_ty ( field. span , v_field, substs) ;
3082
+
3083
+ seen_fields. insert ( field. name . node , field. span ) ;
3080
3084
} else {
3081
3085
error_happened = true ;
3082
3086
expected_field_type = tcx. types . err ;
3083
3087
if let Some ( _) = variant. find_field_named ( field. name . node ) {
3084
- span_err ! ( self . tcx. sess, field. name. span, E0062 ,
3085
- "field `{}` specified more than once" ,
3086
- field. name. node) ;
3088
+ let mut err = struct_span_err ! ( self . tcx. sess,
3089
+ field. name. span,
3090
+ E0062 ,
3091
+ "field `{}` specified more than once" ,
3092
+ field. name. node) ;
3093
+
3094
+ err. span_label ( field. name . span , & format ! ( "used more than once" ) ) ;
3095
+
3096
+ if let Some ( prev_span) = seen_fields. get ( & field. name . node ) {
3097
+ err. span_label ( * prev_span, & format ! ( "first use of `{}`" , field. name. node) ) ;
3098
+ }
3099
+
3100
+ err. emit ( ) ;
3087
3101
} else {
3088
3102
self . report_unknown_field ( adt_ty, variant, field, ast_fields) ;
3089
3103
}
0 commit comments