forbid dyn Trait
in const generics
This commit is contained in:
parent
36d13cb01b
commit
9f34b82de2
4 changed files with 40 additions and 0 deletions
|
@ -116,6 +116,9 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
|
||||||
traits::NonStructuralMatchTy::Param => {
|
traits::NonStructuralMatchTy::Param => {
|
||||||
bug!("use of constant whose type is a parameter inside a pattern")
|
bug!("use of constant whose type is a parameter inside a pattern")
|
||||||
}
|
}
|
||||||
|
traits::NonStructuralMatchTy::Dynamic => {
|
||||||
|
bug!("use of a trait object inside a pattern")
|
||||||
|
}
|
||||||
};
|
};
|
||||||
let path = self.tcx().def_path_str(adt_def.did);
|
let path = self.tcx().def_path_str(adt_def.did);
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ use rustc_span::Span;
|
||||||
pub enum NonStructuralMatchTy<'tcx> {
|
pub enum NonStructuralMatchTy<'tcx> {
|
||||||
Adt(&'tcx AdtDef),
|
Adt(&'tcx AdtDef),
|
||||||
Param,
|
Param,
|
||||||
|
Dynamic,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This method traverses the structure of `ty`, trying to find an
|
/// This method traverses the structure of `ty`, trying to find an
|
||||||
|
@ -137,6 +138,10 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for Search<'a, 'tcx> {
|
||||||
self.found = Some(NonStructuralMatchTy::Param);
|
self.found = Some(NonStructuralMatchTy::Param);
|
||||||
return true; // Stop visiting.
|
return true; // Stop visiting.
|
||||||
}
|
}
|
||||||
|
ty::Dynamic(..) => {
|
||||||
|
self.found = Some(NonStructuralMatchTy::Dynamic);
|
||||||
|
return true; // Stop visiting.
|
||||||
|
}
|
||||||
ty::RawPtr(..) => {
|
ty::RawPtr(..) => {
|
||||||
// structural-match ignores substructure of
|
// structural-match ignores substructure of
|
||||||
// `*const _`/`*mut _`, so skip `super_visit_with`.
|
// `*const _`/`*mut _`, so skip `super_visit_with`.
|
||||||
|
|
15
src/test/ui/const-generics/issues/issue-63322-forbid-dyn.rs
Normal file
15
src/test/ui/const-generics/issues/issue-63322-forbid-dyn.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
trait A {}
|
||||||
|
struct B;
|
||||||
|
impl A for B {}
|
||||||
|
|
||||||
|
fn test<const T: &'static dyn A>() {
|
||||||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` to be used
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
test::<{ &B }>();
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
--> $DIR/issue-63322-forbid-dyn.rs:1:12
|
||||||
|
|
|
||||||
|
LL | #![feature(const_generics)]
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0741]: `&'static (dyn A + 'static)` must be annotated with `#[derive(PartialEq, Eq)]` to be used as the type of a const parameter
|
||||||
|
--> $DIR/issue-63322-forbid-dyn.rs:8:18
|
||||||
|
|
|
||||||
|
LL | fn test<const T: &'static dyn A>() {
|
||||||
|
| ^^^^^^^^^^^^^^ `&'static (dyn A + 'static)` doesn't derive both `PartialEq` and `Eq`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0741`.
|
Loading…
Add table
Add a link
Reference in a new issue