Skip to content

Commit 95db42f

Browse files
committed
Suggest proper vis type in the help message
1 parent 314c4e3 commit 95db42f

File tree

7 files changed

+39
-7
lines changed

7 files changed

+39
-7
lines changed

compiler/rustc_privacy/messages.ftl

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ privacy_from_private_dep_in_public_interface =
88
privacy_in_public_interface = {$vis_descr} {$kind} `{$descr}` in public interface
99
.label = can't leak {$vis_descr} {$kind}
1010
.visibility_label = `{$descr}` declared as {$vis_descr}
11-
.suggestion = consider adding `pub` in front of it
11+
.suggestion = consider adding `{$vis_sugg}` in front of it
1212
1313
privacy_item_is_private = {$kind} `{$descr}` is private
1414
.label = private {$kind}

compiler/rustc_privacy/src/errors.rs

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub struct InPublicInterface<'a> {
5555
pub span: Span,
5656
pub vis_descr: &'static str,
5757
pub kind: &'a str,
58+
pub vis_sugg: &'static str,
5859
pub descr: DiagnosticArgFromDisplay<'a>,
5960
#[label(privacy_visibility_label)]
6061
pub vis_span: Span,

compiler/rustc_privacy/src/lib.rs

+19
Original file line numberDiff line numberDiff line change
@@ -1434,12 +1434,31 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
14341434
}
14351435
};
14361436

1437+
// FIXME: this code was adapted from the above `vis_descr` computation,
1438+
// but it's not clear if it's correct.
1439+
let vis_sugg = match self.required_visibility {
1440+
ty::Visibility::Public => "pub",
1441+
ty::Visibility::Restricted(vis_def_id) => {
1442+
if vis_def_id
1443+
== self.tcx.parent_module_from_def_id(local_def_id).to_local_def_id()
1444+
{
1445+
"???FIXME???"
1446+
} else if vis_def_id.is_top_level_module() {
1447+
"pub(crate)"
1448+
} else {
1449+
"???FIXME???"
1450+
}
1451+
}
1452+
};
1453+
14371454
self.tcx.dcx().emit_err(InPublicInterface {
14381455
span,
14391456
vis_descr,
14401457
kind,
1458+
vis_sugg,
14411459
descr: descr.into(),
14421460
vis_span,
1461+
suggestion: vis_span,
14431462
});
14441463
return false;
14451464
}

tests/ui/error-codes/E0446.stderr

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ error[E0446]: private type `Bar` in public interface
22
--> $DIR/E0446.rs:10:5
33
|
44
LL | struct Bar;
5-
| ---------- `Bar` declared as private
5+
| ----------
6+
| |
7+
| `Bar` declared as private
8+
| help: consider adding `pub` in front of it
69
...
710
LL | type Alias1 = Bar;
811
| ^^^^^^^^^^^ can't leak private type
@@ -11,7 +14,10 @@ error[E0446]: private trait `PrivTr` in public interface
1114
--> $DIR/E0446.rs:11:5
1215
|
1316
LL | trait PrivTr {}
14-
| ------------ `PrivTr` declared as private
17+
| ------------
18+
| |
19+
| `PrivTr` declared as private
20+
| help: consider adding `pub` in front of it
1521
...
1622
LL | type Alias2 = Box<dyn PrivTr>;
1723
| ^^^^^^^^^^^ can't leak private trait

tests/ui/privacy/issue-30079.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ LL | struct Priv;
1818
| -----------
1919
| |
2020
| `m2::Priv` declared as private
21-
| help: consider adding `pub` in front of it
21+
| help: consider adding `pub(crate)` in front of it
2222
LL | impl ::std::ops::Deref for ::SemiPriv {
2323
LL | type Target = Priv;
2424
| ^^^^^^^^^^^ can't leak private type
@@ -30,7 +30,7 @@ LL | struct Priv;
3030
| -----------
3131
| |
3232
| `m3::Priv` declared as private
33-
| help: consider adding `pub` in front of it
33+
| help: consider adding `pub(crate)` in front of it
3434
LL | impl ::SemiPrivTrait for () {
3535
LL | type Assoc = Priv;
3636
| ^^^^^^^^^^ can't leak private type

tests/ui/privacy/private-in-public-assoc-ty.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ error[E0446]: private trait `PrivTr` in public interface
7575
--> $DIR/private-in-public-assoc-ty.rs:41:9
7676
|
7777
LL | trait PrivTr {}
78-
| ------------ `PrivTr` declared as private
78+
| ------------
79+
| |
80+
| `PrivTr` declared as private
81+
| help: consider adding `pub` in front of it
7982
...
8083
LL | type Exist = impl PrivTr;
8184
| ^^^^^^^^^^ can't leak private trait

tests/ui/privacy/where-priv-type.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ LL | type AssocTy = Const<{ my_const_fn(U) }>;
7575
| ^^^^^^^^^^^^ can't leak private type
7676
...
7777
LL | const fn my_const_fn(val: u8) -> u8 {
78-
| ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private
78+
| -----------------------------------
79+
| |
80+
| `fn(u8) -> u8 {my_const_fn}` declared as private
81+
| help: consider adding `pub` in front of it
7982

8083
error: aborting due to 1 previous error; 5 warnings emitted
8184

0 commit comments

Comments
 (0)