about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorgnodarse <46761795+gnodarse@users.noreply.github.com>2020-06-14 14:25:19 -0400
committerGitHub <noreply@github.com>2020-06-14 14:25:19 -0400
commit8361ee5b38de6b2ba7b6436f615903ea53facaff (patch)
tree9e8726537f82e0c27fa4e1117b0d8e63238fe71a /src
parent4fb54ed484e2239a3e9eff3be17df00d2a162be3 (diff)
downloadrust-8361ee5b38de6b2ba7b6436f615903ea53facaff.tar.gz
rust-8361ee5b38de6b2ba7b6436f615903ea53facaff.zip
Update E0446.md
The existing error documentation did not show how to use a child module's functions if the types used in those functions are private. These are some other places this problem has popped up that did not present a solution (these are from before the solution existed, 2016-2017. The solution was released in the Rust 2018 edition. However these were the places I was pointed to when I encountered the problem myself):
https://github.com/rust-lang/rust/issues/30905
https://stackoverflow.com/questions/39334430/how-to-reference-private-types-from-public-functions-in-private-modules/62374958#62374958
Diffstat (limited to 'src')
-rw-r--r--src/librustc_error_codes/error_codes/E0446.md32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/librustc_error_codes/error_codes/E0446.md b/src/librustc_error_codes/error_codes/E0446.md
index 77a1834ece4..6ec47c4962c 100644
--- a/src/librustc_error_codes/error_codes/E0446.md
+++ b/src/librustc_error_codes/error_codes/E0446.md
@@ -4,10 +4,10 @@ Erroneous code example:
 
 ```compile_fail,E0446
 #![deny(private_in_public)]
+struct Bar(u32);
 
-mod Foo {
-    struct Bar(u32);
-
+mod foo {
+    use crate::Bar;
     pub fn bar() -> Bar { // error: private type in public interface
         Bar(0)
     }
@@ -16,15 +16,31 @@ mod Foo {
 fn main() {}
 ```
 
-To solve this error, please ensure that the type is also public. The type
-can be made inaccessible if necessary by placing it into a private inner
-module, but it still has to be marked with `pub`.
+There are two ways to solve this error. The first is to make the public type
+signature only public to a module that also has access to the private type.
+This is done by using pub(crate) or pub(in crate::my_mod::etc)
 Example:
 
 ```
-mod Foo {
-    pub struct Bar(u32); // we set the Bar type public
+struct Bar(u32);
+
+mod foo {
+    use crate::Bar;
+    pub(crate) fn bar() -> Bar { // only public to crate root
+        Bar(0)
+    }
+}
 
+fn main() {}
+```
+
+The other way to solve this error is to make the private type public.
+Example:
+
+```
+pub struct Bar(u32); // we set the Bar type public
+mod foo {
+    use crate::Bar;
     pub fn bar() -> Bar { // ok!
         Bar(0)
     }