diff options
| author | Ellen <supbscripter@gmail.com> | 2021-08-06 14:20:59 +0100 |
|---|---|---|
| committer | Ellen <supbscripter@gmail.com> | 2021-08-06 14:20:59 +0100 |
| commit | 2c004a228751aed8a271e16d74c96d8037b6e655 (patch) | |
| tree | e874bd6956062d8d553805639885b4ef8b496be0 | |
| parent | 1f94abcda6884893d4723304102089198caa0839 (diff) | |
| download | rust-2c004a228751aed8a271e16d74c96d8037b6e655.tar.gz rust-2c004a228751aed8a271e16d74c96d8037b6e655.zip | |
encode `generics_of` of fields and ty params
6 files changed, 82 insertions, 2 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 45a4762c700..b7921c403bb 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -918,12 +918,12 @@ fn should_encode_generics(def_kind: DefKind) -> bool { | DefKind::AnonConst | DefKind::OpaqueTy | DefKind::Impl + | DefKind::Field + | DefKind::TyParam | DefKind::Closure | DefKind::Generator => true, DefKind::Mod - | DefKind::Field | DefKind::ForeignMod - | DefKind::TyParam | DefKind::ConstParam | DefKind::Macro(..) | DefKind::Use diff --git a/src/test/ui/const-generics/auxiliary/generics_of_parent.rs b/src/test/ui/const-generics/auxiliary/generics_of_parent.rs new file mode 100644 index 00000000000..576276d902d --- /dev/null +++ b/src/test/ui/const-generics/auxiliary/generics_of_parent.rs @@ -0,0 +1,23 @@ +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// library portion of regression test for #87674 +pub struct Foo<const N: usize>([(); N + 1]) +where + [(); N + 1]: ; + +// library portion of regression test for #87603 +pub struct S<T: Copy + Default, const N: usize> +where + [T; N * 2]: Sized, +{ + pub s: [T; N * 2], +} +impl<T: Default + Copy, const N: usize> S<T, N> +where + [T; N * 2]: Sized, +{ + pub fn test() -> Self { + S { s: [T::default(); N * 2] } + } +} diff --git a/src/test/ui/const-generics/auxiliary/generics_of_parent_impl_trait.rs b/src/test/ui/const-generics/auxiliary/generics_of_parent_impl_trait.rs new file mode 100644 index 00000000000..83e0c5566be --- /dev/null +++ b/src/test/ui/const-generics/auxiliary/generics_of_parent_impl_trait.rs @@ -0,0 +1,7 @@ +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// library portion of testing that `impl Trait<{ expr }>` doesnt ice because of a `DefKind::TyParam` parent +pub fn foo<const N: usize>(foo: impl Into<[(); N + 1]>) { + foo.into(); +} diff --git a/src/test/ui/const-generics/parent_generics_of_encoding.rs b/src/test/ui/const-generics/parent_generics_of_encoding.rs new file mode 100644 index 00000000000..31be8e7d111 --- /dev/null +++ b/src/test/ui/const-generics/parent_generics_of_encoding.rs @@ -0,0 +1,25 @@ +// aux-build:generics_of_parent.rs +// check-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +extern crate generics_of_parent; + +use generics_of_parent::{Foo, S}; + +fn main() { + // regression test for #87603 + const N: usize = 2; + let x: S<u8, N> = S::test(); +} + +// regression test for #87674 +fn new<U>(a: U) -> U { + a +} +fn foo<const N: usize>(bar: &mut Foo<N>) +where + [(); N + 1]: , +{ + *bar = new(loop {}); +} diff --git a/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.rs b/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.rs new file mode 100644 index 00000000000..988777b1c90 --- /dev/null +++ b/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.rs @@ -0,0 +1,11 @@ +// aux-build:generics_of_parent_impl_trait.rs +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +extern crate generics_of_parent_impl_trait; + +fn main() { + // check for `impl Trait<{ const }>` which has a parent of a `DefKind::TyParam` + generics_of_parent_impl_trait::foo([()]); + //~^ error: type annotations needed: +} diff --git a/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.stderr b/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.stderr new file mode 100644 index 00000000000..f23c262d34d --- /dev/null +++ b/src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.stderr @@ -0,0 +1,14 @@ +error[E0284]: type annotations needed: cannot satisfy `the constant `foo::{opaque#0}::{constant#0}` can be evaluated` + --> $DIR/parent_generics_of_encoding_impl_trait.rs:9:5 + | +LL | generics_of_parent_impl_trait::foo([()]); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot satisfy `the constant `foo::{opaque#0}::{constant#0}` can be evaluated` + | + ::: $DIR/auxiliary/generics_of_parent_impl_trait.rs:5:48 + | +LL | pub fn foo<const N: usize>(foo: impl Into<[(); N + 1]>) { + | ----- required by this bound in `foo` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0284`. |
