]> git.lizzy.rs Git - rust.git/commitdiff
fix dropck overflow error message
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>
Thu, 6 Aug 2015 14:43:08 +0000 (17:43 +0300)
committerAriel Ben-Yehuda <arielb1@mail.tau.ac.il>
Thu, 6 Aug 2015 15:07:00 +0000 (18:07 +0300)
Perf numbers:

Before this patchset:
572.70user 5.52system 7:33.21elapsed 127%CPU (0avgtext+0avgdata 1173368maxresident)k
llvm-time: 385.858

After this patch:
557.84user 5.73system 7:22.10elapsed 127%CPU (0avgtext+0avgdata 1142848maxresident)k
llvm-time: 385.834

nice 2.5% perf improvement

src/librustc_typeck/check/dropck.rs

index 57f2f063c71c41b69544a76480a0ad888185cc39..4ae65a15c26b22594b3676f4aeafe5db61b638c9 100644 (file)
@@ -18,6 +18,7 @@
 
 use syntax::ast;
 use syntax::codemap::{self, Span};
+use syntax::parse::token::special_idents;
 
 /// check_drop_impl confirms that the Drop implementation identfied by
 /// `drop_impl_did` is not any more specialized than the type it is
@@ -286,27 +287,26 @@ pub fn check_safety_of_destructor_if_necessary<'a, 'tcx>(rcx: &mut Rcx<'a, 'tcx>
                     // was somehow on the root.
                 }
                 TypeContext::ADT { def_id, variant, field, field_index } => {
-                    // FIXME (pnkfelix): eventually lookup arg_name
-                    // for the given index on struct variants.
-                    // TODO: be saner
-                    if let ty::ADTKind::Enum = tcx.lookup_adt_def(def_id).adt_kind() {
-                        span_note!(
-                            rcx.tcx().sess,
-                            span,
-                            "overflowed on enum {} variant {} argument {} type: {}",
-                            tcx.item_path_str(def_id),
-                            variant,
-                            field_index,
-                            detected_on_typ);
+                    let adt = tcx.lookup_adt_def(def_id);
+                    let variant_name = match adt.adt_kind() {
+                        ty::ADTKind::Enum => format!("enum {} variant {}",
+                                                     tcx.item_path_str(def_id),
+                                                     variant),
+                        ty::ADTKind::Struct => format!("struct {}",
+                                                       tcx.item_path_str(def_id))
+                    };
+                    let field_name = if field == special_idents::unnamed_field.name {
+                        format!("#{}", field_index)
                     } else {
-                        span_note!(
-                            rcx.tcx().sess,
-                            span,
-                            "overflowed on struct {} field {} type: {}",
-                            tcx.item_path_str(def_id),
-                            field,
-                            detected_on_typ);
-                    }
+                        format!("`{}`", field)
+                    };
+                    span_note!(
+                        rcx.tcx().sess,
+                        span,
+                        "overflowed on {} field {} type: {}",
+                        variant_name,
+                        field_name,
+                        detected_on_typ);
                 }
             }
         }