Rollup merge of #126899 - GrigorenkoPV:suggest-const-block, r=davidtwco
Suggest inline const blocks for array initialization #126894
This commit is contained in:
commit
a7721a0373
@ -2915,38 +2915,21 @@ fn note_obligation_cause_code<G: EmissionGuarantee, T>(
|
|||||||
}
|
}
|
||||||
ObligationCauseCode::RepeatElementCopy {
|
ObligationCauseCode::RepeatElementCopy {
|
||||||
is_constable,
|
is_constable,
|
||||||
elt_type,
|
elt_type: _,
|
||||||
elt_span,
|
elt_span,
|
||||||
elt_stmt_span,
|
elt_stmt_span: _,
|
||||||
} => {
|
} => {
|
||||||
err.note(
|
err.note(
|
||||||
"the `Copy` trait is required because this value will be copied for each element of the array",
|
"the `Copy` trait is required because this value will be copied for each element of the array",
|
||||||
);
|
);
|
||||||
let value_kind = match is_constable {
|
|
||||||
IsConstable::Fn => Some("the result of the function call"),
|
|
||||||
IsConstable::Ctor => Some("the result of the constructor"),
|
|
||||||
_ => None,
|
|
||||||
};
|
|
||||||
let sm = tcx.sess.source_map();
|
let sm = tcx.sess.source_map();
|
||||||
if let Some(value_kind) = value_kind
|
if matches!(is_constable, IsConstable::Fn | IsConstable::Ctor)
|
||||||
&& let Ok(snip) = sm.span_to_snippet(elt_span)
|
&& let Ok(snip) = sm.span_to_snippet(elt_span)
|
||||||
{
|
{
|
||||||
let help_msg = format!(
|
err.span_suggestion(
|
||||||
"consider creating a new `const` item and initializing it with {value_kind} \
|
elt_span,
|
||||||
to be used in the repeat position"
|
"create an inline `const` block",
|
||||||
);
|
format!("const {{ {snip} }}"),
|
||||||
let indentation = sm.indentation_before(elt_stmt_span).unwrap_or_default();
|
|
||||||
err.multipart_suggestion(
|
|
||||||
help_msg,
|
|
||||||
vec![
|
|
||||||
(
|
|
||||||
elt_stmt_span.shrink_to_lo(),
|
|
||||||
format!(
|
|
||||||
"const ARRAY_REPEAT_VALUE: {elt_type} = {snip};\n{indentation}"
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(elt_span, "ARRAY_REPEAT_VALUE".to_string()),
|
|
||||||
],
|
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@ -2954,15 +2937,6 @@ fn note_obligation_cause_code<G: EmissionGuarantee, T>(
|
|||||||
err.help("consider using `core::array::from_fn` to initialize the array");
|
err.help("consider using `core::array::from_fn` to initialize the array");
|
||||||
err.help("see https://doc.rust-lang.org/stable/std/array/fn.from_fn.html for more information");
|
err.help("see https://doc.rust-lang.org/stable/std/array/fn.from_fn.html for more information");
|
||||||
}
|
}
|
||||||
|
|
||||||
if tcx.sess.is_nightly_build()
|
|
||||||
&& matches!(is_constable, IsConstable::Fn | IsConstable::Ctor)
|
|
||||||
{
|
|
||||||
err.help(
|
|
||||||
"create an inline `const` block, see RFC #2920 \
|
|
||||||
<https://github.com/rust-lang/rfcs/pull/2920> for more information",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ObligationCauseCode::VariableType(hir_id) => {
|
ObligationCauseCode::VariableType(hir_id) => {
|
||||||
if let Some(typeck_results) = &self.typeck_results
|
if let Some(typeck_results) = &self.typeck_results
|
||||||
|
@ -6,17 +6,15 @@ LL | let _: [Option<Bar>; 2] = [no_copy(); 2];
|
|||||||
|
|
|
|
||||||
= note: required for `Option<Bar>` to implement `Copy`
|
= note: required for `Option<Bar>` to implement `Copy`
|
||||||
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
||||||
= help: create an inline `const` block, see RFC #2920 <https://github.com/rust-lang/rfcs/pull/2920> for more information
|
|
||||||
help: consider annotating `Bar` with `#[derive(Copy)]`
|
help: consider annotating `Bar` with `#[derive(Copy)]`
|
||||||
|
|
|
|
||||||
LL + #[derive(Copy)]
|
LL + #[derive(Copy)]
|
||||||
LL | struct Bar;
|
LL | struct Bar;
|
||||||
|
|
|
|
||||||
help: consider creating a new `const` item and initializing it with the result of the function call to be used in the repeat position
|
help: create an inline `const` block
|
||||||
|
|
|
||||||
LL ~ const ARRAY_REPEAT_VALUE: Option<Bar> = no_copy();
|
|
||||||
LL ~ let _: [Option<Bar>; 2] = [ARRAY_REPEAT_VALUE; 2];
|
|
||||||
|
|
|
|
||||||
|
LL | let _: [Option<Bar>; 2] = [const { no_copy() }; 2];
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@ error[E0277]: the trait bound `String: Copy` is not satisfied
|
|||||||
--> $DIR/trait-error.rs:5:6
|
--> $DIR/trait-error.rs:5:6
|
||||||
|
|
|
|
||||||
LL | [Foo(String::new()); 4];
|
LL | [Foo(String::new()); 4];
|
||||||
| ^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `String`, which is required by `Foo<String>: Copy`
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| the trait `Copy` is not implemented for `String`, which is required by `Foo<String>: Copy`
|
||||||
|
| help: create an inline `const` block: `const { Foo(String::new()) }`
|
||||||
|
|
|
|
||||||
note: required for `Foo<String>` to implement `Copy`
|
note: required for `Foo<String>` to implement `Copy`
|
||||||
--> $DIR/trait-error.rs:1:10
|
--> $DIR/trait-error.rs:1:10
|
||||||
@ -10,13 +13,7 @@ note: required for `Foo<String>` to implement `Copy`
|
|||||||
LL | #[derive(Copy, Clone)]
|
LL | #[derive(Copy, Clone)]
|
||||||
| ^^^^ unsatisfied trait bound introduced in this `derive` macro
|
| ^^^^ unsatisfied trait bound introduced in this `derive` macro
|
||||||
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
||||||
= help: create an inline `const` block, see RFC #2920 <https://github.com/rust-lang/rfcs/pull/2920> for more information
|
|
||||||
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider creating a new `const` item and initializing it with the result of the function call to be used in the repeat position
|
|
||||||
|
|
|
||||||
LL ~ const ARRAY_REPEAT_VALUE: Foo<String> = Foo(String::new());
|
|
||||||
LL ~ [ARRAY_REPEAT_VALUE; 4];
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -2,45 +2,36 @@ error[E0277]: the trait bound `String: Copy` is not satisfied
|
|||||||
--> $DIR/const-fn-in-vec.rs:1:47
|
--> $DIR/const-fn-in-vec.rs:1:47
|
||||||
|
|
|
|
||||||
LL | static _MAYBE_STRINGS: [Option<String>; 5] = [None; 5];
|
LL | static _MAYBE_STRINGS: [Option<String>; 5] = [None; 5];
|
||||||
| ^^^^ the trait `Copy` is not implemented for `String`, which is required by `Option<String>: Copy`
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| the trait `Copy` is not implemented for `String`, which is required by `Option<String>: Copy`
|
||||||
|
| help: create an inline `const` block: `const { None }`
|
||||||
|
|
|
|
||||||
= note: required for `Option<String>` to implement `Copy`
|
= note: required for `Option<String>` to implement `Copy`
|
||||||
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
||||||
= help: create an inline `const` block, see RFC #2920 <https://github.com/rust-lang/rfcs/pull/2920> for more information
|
|
||||||
help: consider creating a new `const` item and initializing it with the result of the constructor to be used in the repeat position
|
|
||||||
|
|
|
||||||
LL + const ARRAY_REPEAT_VALUE: Option<String> = None;
|
|
||||||
LL ~ static _MAYBE_STRINGS: [Option<String>; 5] = [ARRAY_REPEAT_VALUE; 5];
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `String: Copy` is not satisfied
|
error[E0277]: the trait bound `String: Copy` is not satisfied
|
||||||
--> $DIR/const-fn-in-vec.rs:7:34
|
--> $DIR/const-fn-in-vec.rs:7:34
|
||||||
|
|
|
|
||||||
LL | let _strings: [String; 5] = [String::new(); 5];
|
LL | let _strings: [String; 5] = [String::new(); 5];
|
||||||
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `String`
|
| ^^^^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| the trait `Copy` is not implemented for `String`
|
||||||
|
| help: create an inline `const` block: `const { String::new() }`
|
||||||
|
|
|
|
||||||
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
||||||
= help: create an inline `const` block, see RFC #2920 <https://github.com/rust-lang/rfcs/pull/2920> for more information
|
|
||||||
help: consider creating a new `const` item and initializing it with the result of the function call to be used in the repeat position
|
|
||||||
|
|
|
||||||
LL ~ const ARRAY_REPEAT_VALUE: String = String::new();
|
|
||||||
LL ~ let _strings: [String; 5] = [ARRAY_REPEAT_VALUE; 5];
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `String: Copy` is not satisfied
|
error[E0277]: the trait bound `String: Copy` is not satisfied
|
||||||
--> $DIR/const-fn-in-vec.rs:9:48
|
--> $DIR/const-fn-in-vec.rs:9:48
|
||||||
|
|
|
|
||||||
LL | let _maybe_strings: [Option<String>; 5] = [None; 5];
|
LL | let _maybe_strings: [Option<String>; 5] = [None; 5];
|
||||||
| ^^^^ the trait `Copy` is not implemented for `String`, which is required by `Option<String>: Copy`
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| the trait `Copy` is not implemented for `String`, which is required by `Option<String>: Copy`
|
||||||
|
| help: create an inline `const` block: `const { None }`
|
||||||
|
|
|
|
||||||
= note: required for `Option<String>` to implement `Copy`
|
= note: required for `Option<String>` to implement `Copy`
|
||||||
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
||||||
= help: create an inline `const` block, see RFC #2920 <https://github.com/rust-lang/rfcs/pull/2920> for more information
|
|
||||||
help: consider creating a new `const` item and initializing it with the result of the constructor to be used in the repeat position
|
|
||||||
|
|
|
||||||
LL ~ const ARRAY_REPEAT_VALUE: Option<String> = None;
|
|
||||||
LL ~ let _maybe_strings: [Option<String>; 5] = [ARRAY_REPEAT_VALUE; 5];
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user