Auto merge of #116858 - estebank:issue-22488, r=petrochenkov
Suggest assoc fn `new` when trying to build tuple struct with private fields Fix #22488.
This commit is contained in:
commit
688892938e
@ -1570,7 +1570,26 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
|
|||||||
err.set_primary_message(
|
err.set_primary_message(
|
||||||
"cannot initialize a tuple struct which contains private fields",
|
"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 with Self return type,
|
||||||
|
// instead of relying only on the name and lack of self receiver.
|
||||||
|
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.
|
// Use spans of the tuple struct definition.
|
||||||
self.r.field_def_ids(def_id).map(|field_ids| {
|
self.r.field_def_ids(def_id).map(|field_ids| {
|
||||||
field_ids
|
field_ids
|
||||||
|
15
tests/ui/privacy/suggest-box-new.fixed
Normal file
15
tests/ui/privacy/suggest-box-new.fixed
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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: ()
|
||||||
|
};
|
||||||
|
}
|
15
tests/ui/privacy/suggest-box-new.rs
Normal file
15
tests/ui/privacy/suggest-box-new.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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
tests/ui/privacy/suggest-box-new.stderr
Normal file
20
tests/ui/privacy/suggest-box-new.stderr
Normal file
@ -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`.
|
Loading…
x
Reference in New Issue
Block a user