1
Fork 0

Specify type kind of constant that can't be used in patterns

```
error: trait object `dyn Send` cannot be used in patterns
  --> $DIR/issue-70972-dyn-trait.rs:6:9
   |
LL | const F: &'static dyn Send = &7u32;
   | -------------------------- constant defined here
...
LL |         F => panic!(),
   |         ^ trait object can't be used in patterns
```
This commit is contained in:
Esteban Küber 2024-11-20 04:06:39 +00:00
parent 253eb95d45
commit a6040bc230
9 changed files with 28 additions and 20 deletions

View file

@ -152,7 +152,8 @@ mir_build_inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
mir_build_interpreted_as_const = introduce a variable instead
mir_build_invalid_pattern = `{$non_sm_ty}` cannot be used in patterns
mir_build_invalid_pattern = {$prefix} `{$non_sm_ty}` cannot be used in patterns
.label = {$prefix} can't be used in patterns
mir_build_irrefutable_let_patterns_if_let = irrefutable `if let` {$count ->
[one] pattern

View file

@ -903,8 +903,10 @@ pub(crate) struct TypeNotPartialEq<'tcx> {
#[diag(mir_build_invalid_pattern)]
pub(crate) struct InvalidPattern<'tcx> {
#[primary_span]
#[label]
pub(crate) span: Span,
pub(crate) non_sm_ty: Ty<'tcx>,
pub(crate) prefix: String,
}
#[derive(Diagnostic)]

View file

@ -171,10 +171,11 @@ impl<'tcx> ConstToPat<'tcx> {
ty::FnPtr(..) | ty::RawPtr(..) => {
self.tcx.dcx().create_err(PointerPattern { span: self.span })
}
_ => self
.tcx
.dcx()
.create_err(InvalidPattern { span: self.span, non_sm_ty: bad_ty }),
_ => self.tcx.dcx().create_err(InvalidPattern {
span: self.span,
non_sm_ty: bad_ty,
prefix: bad_ty.prefix_string(self.tcx).to_string(),
}),
};
return self.mk_err(e, ty);
}
@ -373,7 +374,11 @@ impl<'tcx> ConstToPat<'tcx> {
)
}
_ => {
let err = InvalidPattern { span, non_sm_ty: ty };
let err = InvalidPattern {
span,
non_sm_ty: ty,
prefix: ty.prefix_string(self.tcx).to_string(),
};
return Err(tcx.dcx().create_err(err));
}
};