Auto merge of #106283 - JulianKnodt:enum_err, r=cjgillot
Add help diag. for `const = Enum` missing braces around `Enum` Previously it was not clear why this errored or if it was even supported, as there was no diagnostic that suggested wrapping it in braces. Thus, add a simple diagnostic that suggests wrapping enum variants in braces. Fixes #105927
This commit is contained in:
commit
d72b7d2d2a
@ -1199,17 +1199,26 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
(_, _) => {
|
(_, _) => {
|
||||||
let got = if let Some(_) = term.ty() { "type" } else { "constant" };
|
let got = if let Some(_) = term.ty() { "type" } else { "constant" };
|
||||||
let expected = def_kind.descr(assoc_item_def_id);
|
let expected = def_kind.descr(assoc_item_def_id);
|
||||||
let reported = tcx
|
let mut err = tcx.sess.struct_span_err(
|
||||||
.sess
|
|
||||||
.struct_span_err(
|
|
||||||
binding.span,
|
binding.span,
|
||||||
&format!("expected {expected} bound, found {got}"),
|
&format!("expected {expected} bound, found {got}"),
|
||||||
)
|
);
|
||||||
.span_note(
|
err.span_note(
|
||||||
tcx.def_span(assoc_item_def_id),
|
tcx.def_span(assoc_item_def_id),
|
||||||
&format!("{expected} defined here"),
|
&format!("{expected} defined here"),
|
||||||
)
|
);
|
||||||
.emit();
|
|
||||||
|
if let hir::def::DefKind::AssocConst = def_kind
|
||||||
|
&& let Some(t) = term.ty() && (t.is_enum() || t.references_error())
|
||||||
|
&& tcx.features().associated_const_equality {
|
||||||
|
err.span_suggestion(
|
||||||
|
binding.span,
|
||||||
|
"if equating a const, try wrapping with braces",
|
||||||
|
format!("{} = {{ const }}", binding.item_name),
|
||||||
|
Applicability::HasPlaceholders,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let reported = err.emit();
|
||||||
term = match def_kind {
|
term = match def_kind {
|
||||||
hir::def::DefKind::AssocTy => {
|
hir::def::DefKind::AssocTy => {
|
||||||
tcx.ty_error_with_guaranteed(reported).into()
|
tcx.ty_error_with_guaranteed(reported).into()
|
||||||
|
18
src/test/ui/const-generics/assoc_const_eq_diagnostic.rs
Normal file
18
src/test/ui/const-generics/assoc_const_eq_diagnostic.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#![feature(associated_const_equality)]
|
||||||
|
|
||||||
|
pub enum Mode {
|
||||||
|
Cool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Parse {
|
||||||
|
const MODE: Mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait CoolStuff: Parse<MODE = Mode::Cool> {}
|
||||||
|
//~^ ERROR expected associated constant bound
|
||||||
|
//~| ERROR expected type
|
||||||
|
|
||||||
|
fn no_help() -> Mode::Cool {}
|
||||||
|
//~^ ERROR expected type, found variant
|
||||||
|
|
||||||
|
fn main() {}
|
33
src/test/ui/const-generics/assoc_const_eq_diagnostic.stderr
Normal file
33
src/test/ui/const-generics/assoc_const_eq_diagnostic.stderr
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
error[E0573]: expected type, found variant `Mode::Cool`
|
||||||
|
--> $DIR/assoc_const_eq_diagnostic.rs:11:35
|
||||||
|
|
|
||||||
|
LL | pub trait CoolStuff: Parse<MODE = Mode::Cool> {}
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| not a type
|
||||||
|
| help: try using the variant's enum: `Mode`
|
||||||
|
|
||||||
|
error[E0573]: expected type, found variant `Mode::Cool`
|
||||||
|
--> $DIR/assoc_const_eq_diagnostic.rs:15:17
|
||||||
|
|
|
||||||
|
LL | fn no_help() -> Mode::Cool {}
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| not a type
|
||||||
|
| help: try using the variant's enum: `Mode`
|
||||||
|
|
||||||
|
error: expected associated constant bound, found type
|
||||||
|
--> $DIR/assoc_const_eq_diagnostic.rs:11:28
|
||||||
|
|
|
||||||
|
LL | pub trait CoolStuff: Parse<MODE = Mode::Cool> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^ help: if equating a const, try wrapping with braces: `MODE = { const }`
|
||||||
|
|
|
||||||
|
note: associated constant defined here
|
||||||
|
--> $DIR/assoc_const_eq_diagnostic.rs:8:5
|
||||||
|
|
|
||||||
|
LL | const MODE: Mode;
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0573`.
|
Loading…
x
Reference in New Issue
Block a user