]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_privacy/diagnostics.rs
Auto merge of #28793 - Ms2ger:AttrStyle, r=alexcrichton
[rust.git] / src / librustc_privacy / diagnostics.rs
index cdd6af2d13d93e27dc45f5453bc2bb4406659009..0f9f00e1b49a9ffa9611b1313362baf5238521a2 100644 (file)
@@ -13,7 +13,8 @@
 register_long_diagnostics! {
 
 E0445: r##"
-A private trait was used on a "public" type. Erroneous code example:
+A private trait was used on a public type parameter bound. Erroneous code
+examples:
 
 ```
 trait Foo {
@@ -21,10 +22,13 @@ fn dummy(&self) { }
 }
 
 pub trait Bar : Foo {} // error: private trait in exported type parameter bound
+pub struct Bar<T: Foo>(pub T); // same error
+pub fn foo<T: Foo> (t: T) {} // same error
 ```
 
-To solve this error, please ensure the trait is accessible at the same level of
-the type(s) on which it's implemented. Example:
+To solve this error, please ensure that the trait is also public and accessible
+at the same level of the public functions or types which are bound on it.
+Example:
 
 ```
 pub trait Foo { // we set the Foo trait public
@@ -32,6 +36,8 @@ fn dummy(&self) { }
 }
 
 pub trait Bar : Foo {} // ok!
+pub struct Bar<T: Foo>(pub T); // ok!
+pub fn foo<T: Foo> (t: T) {} // ok!
 ```
 "##,
 
@@ -48,8 +54,8 @@ pub fn bar() -> Bar { // error: private type in exported type signature
 }
 ```
 
-To solve this error, please ensure the type is accessible at the same level of
-the exported type signature. Example:
+To solve this error, please ensure that the type is also public and accessible
+at the same level of the public functions or types which use it. Example:
 
 ```
 mod Foo {
@@ -62,4 +68,168 @@ pub fn bar() -> Bar { // ok!
 ```
 "##,
 
-}
\ No newline at end of file
+E0447: r##"
+The `pub` keyword was used inside a function. Erroneous code example:
+
+```
+fn foo() {
+    pub struct Bar; // error: visibility has no effect inside functions
+}
+```
+
+Since we cannot access items defined inside a function, the visibility of its
+items does not impact outer code. So using the `pub` keyword in this context
+is invalid.
+"##,
+
+E0448: r##"
+The `pub` keyword was used inside a public enum. Erroneous code example:
+
+```
+pub enum Foo {
+    pub Bar, // error: unnecessary `pub` visibility
+}
+```
+
+Since the enum is already public, adding `pub` on one its elements is
+unnecessary. Example:
+
+```
+enum Foo {
+    pub Bar, // ok!
+}
+
+// or:
+
+pub enum Foo {
+    Bar, // ok!
+}
+```
+"##,
+
+E0449: r##"
+A visibility qualifier was used when it was unnecessary. Erroneous code
+examples:
+
+```
+struct Bar;
+
+trait Foo {
+    fn foo();
+}
+
+pub impl Bar {} // error: unnecessary visibility qualifier
+
+pub impl Foo for Bar { // error: unnecessary visibility qualifier
+    pub fn foo() {} // error: unnecessary visibility qualifier
+}
+```
+
+To fix this error, please remove the visibility qualifier when it is not
+required. Example:
+
+```
+struct Bar;
+
+trait Foo {
+    fn foo();
+}
+
+// Directly implemented methods share the visibility of the type itself,
+// so `pub` is unnecessary here
+impl Bar {}
+
+// Trait methods share the visibility of the trait, so `pub` is
+// unnecessary in either case
+pub impl Foo for Bar {
+    pub fn foo() {}
+}
+```
+"##,
+
+E0450: r##"
+A tuple constructor was invoked while some of its fields are private. Erroneous
+code example:
+
+```
+mod Bar {
+    pub struct Foo(isize);
+}
+
+let f = Bar::Foo(0); // error: cannot invoke tuple struct constructor with
+                     //        private fields
+```
+
+To solve this issue, please ensure that all of the fields of the tuple struct
+are public. Alternatively, provide a new() method to the tuple struct to
+construct it from a given inner value. Example:
+
+```
+mod Bar {
+    pub struct Foo(pub isize); // we set its field to public
+}
+
+let f = Bar::Foo(0); // ok!
+
+// or:
+mod bar {
+    pub struct Foo(isize);
+
+    impl Foo {
+        pub fn new(x: isize) {
+            Foo(x)
+        }
+    }
+}
+
+let f = bar::Foo::new(1);
+```
+"##,
+
+E0451: r##"
+A struct constructor with private fields was invoked. Erroneous code example:
+
+```
+mod Bar {
+    pub struct Foo {
+        pub a: isize,
+        b: isize,
+    }
+}
+
+let f = Bar::Foo{ a: 0, b: 0 }; // error: field `b` of struct `Bar::Foo`
+                                //        is private
+```
+
+To fix this error, please ensure that all the fields of the struct, or
+implement a function for easy instantiation. Examples:
+
+```
+mod Bar {
+    pub struct Foo {
+        pub a: isize,
+        pub b: isize, // we set `b` field public
+    }
+}
+
+let f = Bar::Foo{ a: 0, b: 0 }; // ok!
+
+// or:
+mod Bar {
+    pub struct Foo {
+        pub a: isize,
+        b: isize, // still private
+    }
+
+    impl Foo {
+        pub fn new() -> Foo { // we create a method to instantiate `Foo`
+            Foo { a: 0, b: 0 }
+        }
+    }
+}
+
+let f = Bar::Foo::new(); // ok!
+```
+"##,
+
+}