Do not emit a suggestion that causes the E0632 error
This commit is contained in:
parent
7750402c5e
commit
7e6fd40614
3 changed files with 47 additions and 6 deletions
|
@ -287,6 +287,7 @@ pub struct InferenceDiagnosticsData {
|
||||||
pub struct InferenceDiagnosticsParentData {
|
pub struct InferenceDiagnosticsParentData {
|
||||||
pub prefix: &'static str,
|
pub prefix: &'static str,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub def_id: DefId,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum UnderspecifiedArgKind {
|
pub enum UnderspecifiedArgKind {
|
||||||
|
@ -328,6 +329,7 @@ impl InferenceDiagnosticsParentData {
|
||||||
Some(InferenceDiagnosticsParentData {
|
Some(InferenceDiagnosticsParentData {
|
||||||
prefix: tcx.def_kind(parent_def_id).descr(parent_def_id),
|
prefix: tcx.def_kind(parent_def_id).descr(parent_def_id),
|
||||||
name: parent_name,
|
name: parent_name,
|
||||||
|
def_id: parent_def_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -754,12 +756,30 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
if let (UnderspecifiedArgKind::Const { .. }, Some(parent_data)) =
|
if let (UnderspecifiedArgKind::Const { .. }, Some(parent_data)) =
|
||||||
(&arg_data.kind, &arg_data.parent)
|
(&arg_data.kind, &arg_data.parent)
|
||||||
{
|
{
|
||||||
err.span_suggestion_verbose(
|
let has_impl_trait =
|
||||||
span,
|
self.tcx.generics_of(parent_data.def_id).params.iter().any(|param| {
|
||||||
"consider specifying the const argument",
|
matches!(
|
||||||
format!("{}::<{}>", parent_data.name, arg_data.name),
|
param.kind,
|
||||||
Applicability::MaybeIncorrect,
|
ty::GenericParamDefKind::Type {
|
||||||
);
|
synthetic: Some(
|
||||||
|
hir::SyntheticTyParamKind::ImplTrait
|
||||||
|
| hir::SyntheticTyParamKind::FromAttr,
|
||||||
|
),
|
||||||
|
..
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
// (#83606): Do not emit a suggestion if the parent has an `impl Trait`
|
||||||
|
// as an argument otherwise it will cause the E0282 error.
|
||||||
|
if !has_impl_trait {
|
||||||
|
err.span_suggestion_verbose(
|
||||||
|
span,
|
||||||
|
"consider specifying the const argument",
|
||||||
|
format!("{}::<{}>", parent_data.name, arg_data.name),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err.span_label(
|
err.span_label(
|
||||||
|
|
10
src/test/ui/inference/issue-83606.rs
Normal file
10
src/test/ui/inference/issue-83606.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// Regression test for #83606.
|
||||||
|
|
||||||
|
fn foo<const N: usize>(_: impl std::fmt::Display) -> [usize; N] {
|
||||||
|
[0; N]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = foo("foo"); //<- Do not suggest `foo::<N>("foo");`!
|
||||||
|
//~^ ERROR: type annotations needed for `[usize; _]`
|
||||||
|
}
|
11
src/test/ui/inference/issue-83606.stderr
Normal file
11
src/test/ui/inference/issue-83606.stderr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
error[E0282]: type annotations needed for `[usize; _]`
|
||||||
|
--> $DIR/issue-83606.rs:8:13
|
||||||
|
|
|
||||||
|
LL | let _ = foo("foo"); //<- Do not suggest `foo::<N>("foo");`!
|
||||||
|
| - ^^^ cannot infer the value of const parameter `N` declared on the function `foo`
|
||||||
|
| |
|
||||||
|
| consider giving this pattern the explicit type `[usize; _]`, where the type parameter `N` is specified
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
Loading…
Add table
Add a link
Reference in a new issue