about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2018-06-27 22:50:24 -0700
committerZack M. Davis <code@zackmdavis.net>2018-06-30 22:48:05 -0700
commit8d1cbb018e7643e9e8d1d25b8b7de8a2b0671f2d (patch)
treee913a85e4793d84750a5f288583c064e2e534f18 /src
parent53307473fdaebde701a54fc58b307d142b38b569 (diff)
downloadrust-8d1cbb018e7643e9e8d1d25b8b7de8a2b0671f2d.tar.gz
rust-8d1cbb018e7643e9e8d1d25b8b7de8a2b0671f2d.zip
private no-mangle lints: help hint note if visibility modifier is `pub`
If the item is `pub`, one imagines users being confused as to why it's
not reachable/exported; a code suggestion is beyond our local knowledge
here, but we can at least offer a prose hint. (Thanks to Vadim
Petrochenkov for shooting down the present author's original bad idea
for the note text.)

While we're here, use proper HELP expectations instead of ad hoc
comments to communicate (and now, enforce) the expected suggestions in
test/ui/lint/suggestions.rs.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_lint/builtin.rs11
-rw-r--r--src/test/ui/lint/suggestions.rs28
-rw-r--r--src/test/ui/lint/suggestions.stderr47
3 files changed, 54 insertions, 32 deletions
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index f4159002eb3..96dcb458303 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -1177,7 +1177,7 @@ impl LintPass for InvalidNoMangleItems {
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
     fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
-        let suggest_make_pub = |vis: &hir::Visibility, err: &mut DiagnosticBuilder| {
+        let suggest_export = |vis: &hir::Visibility, err: &mut DiagnosticBuilder| {
             let suggestion = match vis.node {
                 hir::VisibilityInherited => {
                     // inherited visibility is empty span at item start; need an extra space
@@ -1187,7 +1187,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
                 hir::VisibilityCrate(_) => {
                     Some("pub".to_owned())
                 },
-                hir::VisibilityPublic => None
+                hir::VisibilityPublic => {
+                    err.help("try exporting the item with a `pub use` statement");
+                    None
+                }
             };
             if let Some(replacement) = suggestion {
                 err.span_suggestion(vis.span, "try making it public", replacement);
@@ -1203,7 +1206,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
                     if !cx.access_levels.is_reachable(it.id) {
                         let msg = "function is marked #[no_mangle], but not exported";
                         let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_FNS, it.span, msg);
-                        suggest_make_pub(&it.vis, &mut err);
+                        suggest_export(&it.vis, &mut err);
                         err.emit();
                     }
                     for param in &generics.params {
@@ -1229,7 +1232,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidNoMangleItems {
                     !cx.access_levels.is_reachable(it.id) {
                         let msg = "static is marked #[no_mangle], but not exported";
                         let mut err = cx.struct_span_lint(PRIVATE_NO_MANGLE_STATICS, it.span, msg);
-                        suggest_make_pub(&it.vis, &mut err);
+                        suggest_export(&it.vis, &mut err);
                         err.emit();
                     }
             }
diff --git a/src/test/ui/lint/suggestions.rs b/src/test/ui/lint/suggestions.rs
index 6c767bca74a..4da2700cb9f 100644
--- a/src/test/ui/lint/suggestions.rs
+++ b/src/test/ui/lint/suggestions.rs
@@ -13,18 +13,22 @@
 #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
 #![feature(no_debug)]
 
-#[no_mangle] static SHENZHOU: usize = 1; // should suggest `pub`
+#[no_mangle] static SHENZHOU: usize = 1;
 //~^ WARN static is marked #[no_mangle]
-#[no_mangle] const DISCOVERY: usize = 1; // should suggest `pub static` rather than `const`
+//~| HELP try making it public
+#[no_mangle] const DISCOVERY: usize = 1;
 //~^ ERROR const items should never be #[no_mangle]
+//~| HELP try a static value
 
-#[no_mangle] // should suggest removal (generics can't be no-mangle)
+#[no_mangle]
+//~^ HELP remove this attribute
 pub fn defiant<T>(_t: T) {}
 //~^ WARN functions generic over types must be mangled
 
 #[no_mangle]
-fn rio_grande() {} // should suggest `pub`
+fn rio_grande() {}
 //~^ WARN function is marked
+//~| HELP try making it public
 
 mod badlands {
     // The private-no-mangle lints shouldn't suggest inserting `pub` when the
@@ -32,14 +36,18 @@ mod badlands {
     // private module). (Issue #47383)
     #[no_mangle] pub static DAUNTLESS: bool = true;
     //~^ WARN static is marked
+    //~| HELP try exporting the item with a `pub use` statement
     #[no_mangle] pub fn val_jean() {}
     //~^ WARN function is marked
+    //~| HELP try exporting the item with a `pub use` statement
 
     // ... but we can suggest just-`pub` instead of restricted
     #[no_mangle] pub(crate) static VETAR: bool = true;
     //~^ WARN static is marked
+    //~| HELP try making it public
     #[no_mangle] pub(crate) fn crossfield() {}
     //~^ WARN function is marked
+    //~| HELP try making it public
 }
 
 struct Equinox {
@@ -48,20 +56,26 @@ struct Equinox {
 
 #[no_debug] // should suggest removal of deprecated attribute
 //~^ WARN deprecated
+//~| HELP remove this attribute
 fn main() {
-    while true { // should suggest `loop`
+    while true {
     //~^ WARN denote infinite loops
-        let mut a = (1); // should suggest no `mut`, no parens
+    //~| HELP use `loop`
+        let mut a = (1);
         //~^ WARN does not need to be mutable
+        //~| HELP remove this `mut`
         //~| WARN unnecessary parentheses
+        //~| HELP remove these parentheses
         // the line after `mut` has a `\t` at the beginning, this is on purpose
         let mut
 	        b = 1;
         //~^^ WARN does not need to be mutable
+        //~| HELP remove this `mut`
         let d = Equinox { warp_factor: 9.975 };
         match d {
-            Equinox { warp_factor: warp_factor } => {} // should suggest shorthand
+            Equinox { warp_factor: warp_factor } => {}
             //~^ WARN this pattern is redundant
+            //~| HELP remove this
         }
         println!("{} {}", a, b);
     }
diff --git a/src/test/ui/lint/suggestions.stderr b/src/test/ui/lint/suggestions.stderr
index adb4b8eb67d..8e5dac8be78 100644
--- a/src/test/ui/lint/suggestions.stderr
+++ b/src/test/ui/lint/suggestions.stderr
@@ -1,7 +1,7 @@
 warning: unnecessary parentheses around assigned value
-  --> $DIR/suggestions.rs:54:21
+  --> $DIR/suggestions.rs:64:21
    |
-LL |         let mut a = (1); // should suggest no `mut`, no parens
+LL |         let mut a = (1);
    |                     ^^^ help: remove these parentheses
    |
 note: lint level defined here
@@ -11,7 +11,7 @@ LL | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issu
    |                     ^^^^^^^^^^^^^
 
 warning: use of deprecated attribute `no_debug`: the `#[no_debug]` attribute was an experimental feature that has been deprecated due to lack of demand. See https://github.com/rust-lang/rust/issues/29721
-  --> $DIR/suggestions.rs:49:1
+  --> $DIR/suggestions.rs:57:1
    |
 LL | #[no_debug] // should suggest removal of deprecated attribute
    | ^^^^^^^^^^^ help: remove this attribute
@@ -19,9 +19,9 @@ LL | #[no_debug] // should suggest removal of deprecated attribute
    = note: #[warn(deprecated)] on by default
 
 warning: variable does not need to be mutable
-  --> $DIR/suggestions.rs:54:13
+  --> $DIR/suggestions.rs:64:13
    |
-LL |         let mut a = (1); // should suggest no `mut`, no parens
+LL |         let mut a = (1);
    |             ----^
    |             |
    |             help: remove this `mut`
@@ -33,7 +33,7 @@ LL | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issu
    |         ^^^^^^^^^^
 
 warning: variable does not need to be mutable
-  --> $DIR/suggestions.rs:58:13
+  --> $DIR/suggestions.rs:70:13
    |
 LL |            let mut
    |   _____________^
@@ -47,7 +47,7 @@ LL | ||             b = 1;
 warning: static is marked #[no_mangle], but not exported
   --> $DIR/suggestions.rs:16:14
    |
-LL | #[no_mangle] static SHENZHOU: usize = 1; // should suggest `pub`
+LL | #[no_mangle] static SHENZHOU: usize = 1;
    |              -^^^^^^^^^^^^^^^^^^^^^^^^^^
    |              |
    |              help: try making it public: `pub`
@@ -55,9 +55,9 @@ LL | #[no_mangle] static SHENZHOU: usize = 1; // should suggest `pub`
    = note: #[warn(private_no_mangle_statics)] on by default
 
 error: const items should never be #[no_mangle]
-  --> $DIR/suggestions.rs:18:14
+  --> $DIR/suggestions.rs:19:14
    |
-LL | #[no_mangle] const DISCOVERY: usize = 1; // should suggest `pub static` rather than `const`
+LL | #[no_mangle] const DISCOVERY: usize = 1;
    |              -----^^^^^^^^^^^^^^^^^^^^^^
    |              |
    |              help: try a static value: `pub static`
@@ -65,19 +65,20 @@ LL | #[no_mangle] const DISCOVERY: usize = 1; // should suggest `pub static` rat
    = note: #[deny(no_mangle_const_items)] on by default
 
 warning: functions generic over types must be mangled
-  --> $DIR/suggestions.rs:22:1
+  --> $DIR/suggestions.rs:25:1
    |
-LL | #[no_mangle] // should suggest removal (generics can't be no-mangle)
+LL | #[no_mangle]
    | ------------ help: remove this attribute
+LL | //~^ HELP remove this attribute
 LL | pub fn defiant<T>(_t: T) {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: #[warn(no_mangle_generic_items)] on by default
 
 warning: function is marked #[no_mangle], but not exported
-  --> $DIR/suggestions.rs:26:1
+  --> $DIR/suggestions.rs:29:1
    |
-LL | fn rio_grande() {} // should suggest `pub`
+LL | fn rio_grande() {}
    | -^^^^^^^^^^^^^^^^^
    | |
    | help: try making it public: `pub`
@@ -85,19 +86,23 @@ LL | fn rio_grande() {} // should suggest `pub`
    = note: #[warn(private_no_mangle_fns)] on by default
 
 warning: static is marked #[no_mangle], but not exported
-  --> $DIR/suggestions.rs:33:18
+  --> $DIR/suggestions.rs:37:18
    |
 LL |     #[no_mangle] pub static DAUNTLESS: bool = true;
    |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = help: try exporting the item with a `pub use` statement
 
 warning: function is marked #[no_mangle], but not exported
-  --> $DIR/suggestions.rs:35:18
+  --> $DIR/suggestions.rs:40:18
    |
 LL |     #[no_mangle] pub fn val_jean() {}
    |                  ^^^^^^^^^^^^^^^^^^^^
+   |
+   = help: try exporting the item with a `pub use` statement
 
 warning: static is marked #[no_mangle], but not exported
-  --> $DIR/suggestions.rs:39:18
+  --> $DIR/suggestions.rs:45:18
    |
 LL |     #[no_mangle] pub(crate) static VETAR: bool = true;
    |                  ----------^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -105,7 +110,7 @@ LL |     #[no_mangle] pub(crate) static VETAR: bool = true;
    |                  help: try making it public: `pub`
 
 warning: function is marked #[no_mangle], but not exported
-  --> $DIR/suggestions.rs:41:18
+  --> $DIR/suggestions.rs:48:18
    |
 LL |     #[no_mangle] pub(crate) fn crossfield() {}
    |                  ----------^^^^^^^^^^^^^^^^^^^
@@ -113,17 +118,17 @@ LL |     #[no_mangle] pub(crate) fn crossfield() {}
    |                  help: try making it public: `pub`
 
 warning: denote infinite loops with `loop { ... }`
-  --> $DIR/suggestions.rs:52:5
+  --> $DIR/suggestions.rs:61:5
    |
-LL |     while true { // should suggest `loop`
+LL |     while true {
    |     ^^^^^^^^^^ help: use `loop`
    |
    = note: #[warn(while_true)] on by default
 
 warning: the `warp_factor:` in this pattern is redundant
-  --> $DIR/suggestions.rs:63:23
+  --> $DIR/suggestions.rs:76:23
    |
-LL |             Equinox { warp_factor: warp_factor } => {} // should suggest shorthand
+LL |             Equinox { warp_factor: warp_factor } => {}
    |                       ------------^^^^^^^^^^^^
    |                       |
    |                       help: remove this