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:
parent
2c7536eaae
commit
077fae94a1
@ -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()
|
||||
|
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…
Reference in New Issue
Block a user