diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2015-09-09 12:16:43 +0200 |
|---|---|---|
| committer | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2015-09-10 14:19:01 +0200 |
| commit | 0477976867ddf3198ea62efdc2043e38b96eedd5 (patch) | |
| tree | 5181af7c1246c08569c813485b41ff10a1cb0349 | |
| parent | a056d5869e808b7f26cb536eca1aadda26a8188f (diff) | |
| download | rust-0477976867ddf3198ea62efdc2043e38b96eedd5.tar.gz rust-0477976867ddf3198ea62efdc2043e38b96eedd5.zip | |
Add error code for private struct field issue
| -rw-r--r-- | src/librustc_privacy/diagnostics.rs | 93 | ||||
| -rw-r--r-- | src/librustc_privacy/lib.rs | 3 |
2 files changed, 90 insertions, 6 deletions
diff --git a/src/librustc_privacy/diagnostics.rs b/src/librustc_privacy/diagnostics.rs index ac83ee2b029..0f9f00e1b49 100644 --- a/src/librustc_privacy/diagnostics.rs +++ b/src/librustc_privacy/diagnostics.rs @@ -22,6 +22,8 @@ trait Foo { } 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 that the trait is also public and accessible @@ -34,6 +36,8 @@ pub trait Foo { // we set the Foo trait public } pub trait Bar : Foo {} // ok! +pub struct Bar<T: Foo>(pub T); // ok! +pub fn foo<T: Foo> (t: T) {} // ok! ``` "##, @@ -73,8 +77,8 @@ fn foo() { } ``` -Since we cannot access inside function's elements, the visibility of its -elements does not impact outer code. So using the `pub` keyword in this context +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. "##, @@ -122,7 +126,25 @@ pub impl Foo for Bar { // error: unnecessary visibility qualifier ``` To fix this error, please remove the visibility qualifier when it is not -required. +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##" @@ -138,7 +160,9 @@ let f = Bar::Foo(0); // error: cannot invoke tuple struct constructor with // private fields ``` -To solve this issue, please ensure that all tuple's fields are public. Example: +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 { @@ -146,7 +170,66 @@ mod Bar { } 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! ``` "##, -} \ No newline at end of file +} diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 9f5387dd9d6..48efd34e212 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -717,7 +717,8 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> { UnnamedField(idx) => format!("field #{} of {} is private", idx + 1, struct_desc), }; - self.tcx.sess.span_err(span, &msg[..]); + span_err!(self.tcx.sess, span, E0451, + "{}", &msg[..]); } // Given the ID of a method, checks to ensure it's in scope. |
