about summary refs log tree commit diff
path: root/src/librustc_resolve
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2017-01-09 00:21:35 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2017-01-29 02:57:14 +0300
commit18b96cf286e99ba61ff52fb916463466b2a63a67 (patch)
tree1fd7f6c5c7e9e2920a35213b5e19f5b376b3cea5 /src/librustc_resolve
parent1491e0425911806f2612f05ee8caf21666447128 (diff)
downloadrust-18b96cf286e99ba61ff52fb916463466b2a63a67.tar.gz
rust-18b96cf286e99ba61ff52fb916463466b2a63a67.zip
Privatize constructors of tuple structs with private fields
Diffstat (limited to 'src/librustc_resolve')
-rw-r--r--src/librustc_resolve/build_reduced_graph.rs22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs
index f74af416cde..f144be7996a 100644
--- a/src/librustc_resolve/build_reduced_graph.rs
+++ b/src/librustc_resolve/build_reduced_graph.rs
@@ -327,21 +327,25 @@ impl<'a> Resolver<'a> {
                 let def = Def::Struct(self.definitions.local_def_id(item.id));
                 self.define(parent, ident, TypeNS, (def, vis, sp, expansion));
 
-                // If this is a tuple or unit struct, define a name
-                // in the value namespace as well.
-                if !struct_def.is_struct() {
-                    let ctor_def = Def::StructCtor(self.definitions.local_def_id(struct_def.id()),
-                                                   CtorKind::from_ast(struct_def));
-                    self.define(parent, ident, ValueNS, (ctor_def, vis, sp, expansion));
-                }
-
                 // Record field names for error reporting.
+                let mut ctor_vis = vis;
                 let field_names = struct_def.fields().iter().filter_map(|field| {
-                    self.resolve_visibility(&field.vis);
+                    let field_vis = self.resolve_visibility(&field.vis);
+                    if ctor_vis.is_at_least(field_vis, &*self) {
+                        ctor_vis = field_vis;
+                    }
                     field.ident.map(|ident| ident.name)
                 }).collect();
                 let item_def_id = self.definitions.local_def_id(item.id);
                 self.insert_field_names(item_def_id, field_names);
+
+                // If this is a tuple or unit struct, define a name
+                // in the value namespace as well.
+                if !struct_def.is_struct() {
+                    let ctor_def = Def::StructCtor(self.definitions.local_def_id(struct_def.id()),
+                                                   CtorKind::from_ast(struct_def));
+                    self.define(parent, ident, ValueNS, (ctor_def, ctor_vis, sp, expansion));
+                }
             }
 
             ItemKind::Union(ref vdata, _) => {