Add note about wrapping in braces

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.
This commit is contained in:
kadmin 2022-12-30 05:09:09 +00:00
parent 2c7536eaae
commit 077fae94a1
3 changed files with 70 additions and 10 deletions

View File

@ -1199,17 +1199,26 @@ fn add_predicates_for_ast_type_binding(
(_, _) => {
let got = if let Some(_) = term.ty() { "type" } else { "constant" };
let expected = def_kind.descr(assoc_item_def_id);
let reported = tcx
.sess
.struct_span_err(
let mut err = tcx.sess.struct_span_err(
binding.span,
&format!("expected {expected} bound, found {got}"),
);
err.span_note(
tcx.def_span(assoc_item_def_id),
&format!("{expected} defined here"),
);
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,
&format!("expected {expected} bound, found {got}"),
)
.span_note(
tcx.def_span(assoc_item_def_id),
&format!("{expected} defined here"),
)
.emit();
"if equating a const, try wrapping with braces",
format!("{} = {{ const }}", binding.item_name),
Applicability::HasPlaceholders,
);
}
let reported = err.emit();
term = match def_kind {
hir::def::DefKind::AssocTy => {
tcx.ty_error_with_guaranteed(reported).into()

View 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() {}

View 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`.