about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-01-05 21:56:49 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-01-05 23:46:19 +0300
commit9503c56ff7cbbc04228fbca6fde58d81ec4d3d87 (patch)
treed748b0cee748d1b182e1989fc3c6902dafbf1e90
parent67713f5b7f502ddeec4b41eef36bd281fea83091 (diff)
downloadrust-9503c56ff7cbbc04228fbca6fde58d81ec4d3d87.tar.gz
rust-9503c56ff7cbbc04228fbca6fde58d81ec4d3d87.zip
privacy: Mark everything in a header of a reachable impl as reachable
-rw-r--r--src/librustc_privacy/lib.rs9
-rw-r--r--src/test/ui/privacy/auxiliary/issue-57264-1.rs (renamed from src/test/ui/privacy/auxiliary/issue-57264.rs)0
-rw-r--r--src/test/ui/privacy/auxiliary/issue-57264-2.rs10
-rw-r--r--src/test/ui/privacy/issue-57264-1.rs8
-rw-r--r--src/test/ui/privacy/issue-57264-2.rs10
-rw-r--r--src/test/ui/privacy/issue-57264.rs8
6 files changed, 36 insertions, 9 deletions
diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs
index 2f0d53f1d81..ec97e4b8cb3 100644
--- a/src/librustc_privacy/lib.rs
+++ b/src/librustc_privacy/lib.rs
@@ -552,7 +552,7 @@ impl<'a, 'tcx> Visitor<'tcx> for EmbargoVisitor<'a, 'tcx> {
             // Visit everything except for private impl items.
             hir::ItemKind::Impl(.., ref impl_item_refs) => {
                 if item_level.is_some() {
-                    self.reach(item.id, item_level).generics().predicates();
+                    self.reach(item.id, item_level).generics().predicates().ty().trait_ref();
 
                     for impl_item_ref in impl_item_refs {
                         let impl_item_level = self.get(impl_item_ref.id.node_id);
@@ -711,6 +711,13 @@ impl<'a, 'tcx> ReachEverythingInTheInterfaceVisitor<'_, 'a, 'tcx> {
         self.visit(self.ev.tcx.type_of(self.item_def_id));
         self
     }
+
+    fn trait_ref(&mut self) -> &mut Self {
+        if let Some(trait_ref) = self.ev.tcx.impl_trait_ref(self.item_def_id) {
+            self.visit_trait(trait_ref);
+        }
+        self
+    }
 }
 
 impl<'a, 'tcx> DefIdVisitor<'a, 'tcx> for ReachEverythingInTheInterfaceVisitor<'_, 'a, 'tcx> {
diff --git a/src/test/ui/privacy/auxiliary/issue-57264.rs b/src/test/ui/privacy/auxiliary/issue-57264-1.rs
index 9302fa0d9e8..9302fa0d9e8 100644
--- a/src/test/ui/privacy/auxiliary/issue-57264.rs
+++ b/src/test/ui/privacy/auxiliary/issue-57264-1.rs
diff --git a/src/test/ui/privacy/auxiliary/issue-57264-2.rs b/src/test/ui/privacy/auxiliary/issue-57264-2.rs
new file mode 100644
index 00000000000..416206b4f8e
--- /dev/null
+++ b/src/test/ui/privacy/auxiliary/issue-57264-2.rs
@@ -0,0 +1,10 @@
+mod inner {
+    pub struct PubUnnameable;
+
+    impl PubUnnameable {
+        pub fn pub_method(self) {}
+    }
+}
+
+pub trait PubTraitWithSingleImplementor {}
+impl PubTraitWithSingleImplementor for Option<inner::PubUnnameable> {}
diff --git a/src/test/ui/privacy/issue-57264-1.rs b/src/test/ui/privacy/issue-57264-1.rs
new file mode 100644
index 00000000000..dcffdc3d4ef
--- /dev/null
+++ b/src/test/ui/privacy/issue-57264-1.rs
@@ -0,0 +1,8 @@
+// compile-pass
+// aux-build:issue-57264-1.rs
+
+extern crate issue_57264_1;
+
+fn main() {
+    issue_57264_1::Pub::pub_method();
+}
diff --git a/src/test/ui/privacy/issue-57264-2.rs b/src/test/ui/privacy/issue-57264-2.rs
new file mode 100644
index 00000000000..79d0d2c7cd7
--- /dev/null
+++ b/src/test/ui/privacy/issue-57264-2.rs
@@ -0,0 +1,10 @@
+// compile-pass
+// aux-build:issue-57264-2.rs
+
+extern crate issue_57264_2;
+
+fn infer<T: issue_57264_2::PubTraitWithSingleImplementor>(arg: T) -> T { arg }
+
+fn main() {
+    infer(None).unwrap().pub_method();
+}
diff --git a/src/test/ui/privacy/issue-57264.rs b/src/test/ui/privacy/issue-57264.rs
deleted file mode 100644
index 57e9960a058..00000000000
--- a/src/test/ui/privacy/issue-57264.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-// compile-pass
-// aux-build:issue-57264.rs
-
-extern crate issue_57264;
-
-fn main() {
-    issue_57264::Pub::pub_method();
-}