diff options
| author | varkor <github@varkor.com> | 2019-10-20 17:17:12 +0100 |
|---|---|---|
| committer | varkor <github@varkor.com> | 2019-10-22 12:26:32 +0100 |
| commit | bbd53deaeb79e78162524e18ca29211745e2d18e (patch) | |
| tree | 73506fbfe998360dceb873efd27723960d7f0c43 /src | |
| parent | 600607f45a400e5930126b5ef1dc05f5644e95c3 (diff) | |
| download | rust-bbd53deaeb79e78162524e18ca29211745e2d18e.tar.gz rust-bbd53deaeb79e78162524e18ca29211745e2d18e.zip | |
Forbid non-`structural_match` types in const generics
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_typeck/collect.rs | 11 | ||||
| -rw-r--r-- | src/librustc_typeck/error_codes.rs | 24 | ||||
| -rw-r--r-- | src/test/ui/const-generics/forbid-non-structural_match-types.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/const-generics/forbid-non-structural_match-types.stderr | 17 |
4 files changed, 65 insertions, 0 deletions
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 1749fd1075e..d6162c0bc0e 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1532,6 +1532,17 @@ pub fn checked_type_of(tcx: TyCtxt<'_>, def_id: DefId, fail: bool) -> Option<Ty< ); }; } + if ty::search_for_adt_without_structural_match(tcx, ty).is_some() { + struct_span_err!( + tcx.sess, + hir_ty.span, + E0739, + "the types of const generic parameters must derive `PartialEq` and `Eq`", + ).span_label( + hir_ty.span, + format!("`{}` doesn't derive both `PartialEq` and `Eq`", ty), + ).emit(); + } ty } x => { diff --git a/src/librustc_typeck/error_codes.rs b/src/librustc_typeck/error_codes.rs index 3ecbf620cbc..5d1afcaef91 100644 --- a/src/librustc_typeck/error_codes.rs +++ b/src/librustc_typeck/error_codes.rs @@ -4978,6 +4978,30 @@ the future, [RFC 2091] prohibits their implementation without a follow-up RFC. [RFC 2091]: https://github.com/rust-lang/rfcs/blob/master/text/2091-inline-semantic.md "##, +E0739: r##" +Only `structural_match` types (that is, types that derive `PartialEq` and `Eq`) +may be used as the types of const generic parameters. + +```compile_fail,E0739 +#![feature(const_generics)] + +struct A; + +struct B<const X: A>; // error! +``` + +To fix this example, we derive `PartialEq` and `Eq`. + +``` +#![feature(const_generics)] + +#[derive(PartialEq, Eq)] +struct A; + +struct B<const X: A>; // ok! +``` +"##, + ; // E0035, merged into E0087/E0089 // E0036, merged into E0087/E0089 diff --git a/src/test/ui/const-generics/forbid-non-structural_match-types.rs b/src/test/ui/const-generics/forbid-non-structural_match-types.rs new file mode 100644 index 00000000000..7bc4f3986eb --- /dev/null +++ b/src/test/ui/const-generics/forbid-non-structural_match-types.rs @@ -0,0 +1,13 @@ +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash + +#[derive(PartialEq, Eq)] +struct A; + +struct B<const X: A>; // ok + +struct C; + +struct D<const X: C>; //~ ERROR the types of const generic parameters must derive + +fn main() {} diff --git a/src/test/ui/const-generics/forbid-non-structural_match-types.stderr b/src/test/ui/const-generics/forbid-non-structural_match-types.stderr new file mode 100644 index 00000000000..9ab6c69521b --- /dev/null +++ b/src/test/ui/const-generics/forbid-non-structural_match-types.stderr @@ -0,0 +1,17 @@ +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/forbid-non-structural_match-types.rs:1:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + +error[E0739]: the types of const generic parameters must derive `PartialEq` and `Eq` + --> $DIR/forbid-non-structural_match-types.rs:11:19 + | +LL | struct D<const X: C>; + | ^ `C` doesn't derive both `PartialEq` and `Eq` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0739`. |
