]> git.lizzy.rs Git - rust.git/commitdiff
update error E0450 to new format
authorMikhail Modin <mikhailm1@gmail.com>
Sat, 27 Aug 2016 16:39:22 +0000 (19:39 +0300)
committerMikhail Modin <mikhailm1@gmail.com>
Sat, 27 Aug 2016 16:39:22 +0000 (19:39 +0300)
src/librustc_privacy/lib.rs
src/test/compile-fail/E0450.rs

index 028632ad7c006b90632cb90f681d47480019d4b6..6da901a5f86c03a4345cd6e6a77ebe5966fd56b7 100644 (file)
@@ -444,13 +444,32 @@ fn visit_expr(&mut self, expr: &hir::Expr) {
                         }), ..}) => ty,
                         _ => expr_ty
                     }.ty_adt_def().unwrap();
-                    let any_priv = def.struct_variant().fields.iter().any(|f| {
-                        !f.vis.is_accessible_from(self.curitem, &self.tcx.map)
-                    });
-                    if any_priv {
-                        span_err!(self.tcx.sess, expr.span, E0450,
-                                  "cannot invoke tuple struct constructor with private \
-                                   fields");
+
+                    let private_indexes : Vec<_> = def.struct_variant().fields.iter().enumerate()
+                        .filter(|&(_,f)| {
+                            !f.vis.is_accessible_from(self.curitem, &self.tcx.map)
+                    }).map(|(n,&_)|n).collect();
+
+                    if !private_indexes.is_empty() {
+
+                        let mut error = struct_span_err!(self.tcx.sess, expr.span, E0450,
+                                                         "cannot invoke tuple struct constructor \
+                                                         with private fields");
+                        error.span_label(expr.span,
+                                         &format!("cannot construct with a private field"));
+
+                        if let Some(def_id) = self.tcx.map.as_local_node_id(def.did) {
+                            if let Some(hir::map::NodeItem(node)) = self.tcx.map.find(def_id) {
+                                if let hir::Item_::ItemStruct(ref tuple_data, _) = node.node {
+
+                                    for i in private_indexes {
+                                        error.span_label(tuple_data.fields()[i].span,
+                                                         &format!("private field declared here"));
+                                    }
+                                }
+                            }
+                        }
+                        error.emit();
                     }
                 }
             }
index 3d76cb93773164a66cc6baf271866b5cdafe822f..200b58a329344780be4b7610c1787fe6c7b589aa 100644 (file)
@@ -9,9 +9,13 @@
 // except according to those terms.
 
 mod Bar {
-    pub struct Foo(isize);
+    pub struct Foo( bool, pub i32, f32, bool);
+    //~^ NOTE private field declared here
+    //~| NOTE private field declared here
+    //~| NOTE private field declared here
 }
 
 fn main() {
-    let f = Bar::Foo(0); //~ ERROR E0450
+    let f = Bar::Foo(false,1,0.1, true); //~ ERROR E0450
+                         //~^ NOTE cannot construct with a private field
 }