Skip to content

Commit

Permalink
Suggest assoc fn new when trying to build tuple struct with private…
Browse files Browse the repository at this point in the history
… fields

Fix #22488.
  • Loading branch information
estebank committed Oct 17, 2023
1 parent 93e62a2 commit e5c15af
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 1 deletion.
21 changes: 20 additions & 1 deletion compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1570,7 +1570,26 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
err.set_primary_message(
"cannot initialize a tuple struct which contains private fields",
);

if !def_id.is_local()
&& self
.r
.tcx
.inherent_impls(def_id)
.iter()
.flat_map(|impl_def_id| {
self.r.tcx.provided_trait_methods(*impl_def_id)
})
.any(|assoc| !assoc.fn_has_self_parameter && assoc.name == sym::new)
{
// FIXME: look for associated functions without self receiver and Self
// return type, instead of relying only on the name.
err.span_suggestion_verbose(
span.shrink_to_hi(),
"you might have meant to use the `new` associated function",
"::new".to_string(),
Applicability::MaybeIncorrect,
);
}
// Use spans of the tuple struct definition.
self.r.field_def_ids(def_id).map(|field_ids| {
field_ids
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/privacy/suggest-box-new.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// run-rustfix
#![allow(dead_code)]
struct U <T> {
wtf: Option<Box<U<T>>>,
x: T,
}
fn main() {
U {
wtf: Some(Box::new(U { //~ ERROR cannot initialize a tuple struct which contains private fields
wtf: None,
x: (),
})),
x: ()
};
}

16 changes: 16 additions & 0 deletions tests/ui/privacy/suggest-box-new.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// run-rustfix
#![allow(dead_code)]
struct U <T> {
wtf: Option<Box<U<T>>>,
x: T,
}
fn main() {
U {
wtf: Some(Box(U { //~ ERROR cannot initialize a tuple struct which contains private fields
wtf: None,
x: (),
})),
x: ()
};
}

20 changes: 20 additions & 0 deletions tests/ui/privacy/suggest-box-new.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error[E0423]: cannot initialize a tuple struct which contains private fields
--> $DIR/suggest-box-new.rs:9:19
|
LL | wtf: Some(Box(U {
| ^^^
|
note: constructor is not visible here due to private fields
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
= note: private field
|
= note: private field
help: you might have meant to use the `new` associated function
|
LL | wtf: Some(Box::new(U {
| +++++

error: aborting due to previous error

For more information about this error, try `rustc --explain E0423`.

0 comments on commit e5c15af

Please sign in to comment.