about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEllen <supbscripter@gmail.com>2021-08-06 14:20:59 +0100
committerEllen <supbscripter@gmail.com>2021-08-06 14:20:59 +0100
commit2c004a228751aed8a271e16d74c96d8037b6e655 (patch)
treee874bd6956062d8d553805639885b4ef8b496be0
parent1f94abcda6884893d4723304102089198caa0839 (diff)
downloadrust-2c004a228751aed8a271e16d74c96d8037b6e655.tar.gz
rust-2c004a228751aed8a271e16d74c96d8037b6e655.zip
encode `generics_of` of fields and ty params
-rw-r--r--compiler/rustc_metadata/src/rmeta/encoder.rs4
-rw-r--r--src/test/ui/const-generics/auxiliary/generics_of_parent.rs23
-rw-r--r--src/test/ui/const-generics/auxiliary/generics_of_parent_impl_trait.rs7
-rw-r--r--src/test/ui/const-generics/parent_generics_of_encoding.rs25
-rw-r--r--src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.rs11
-rw-r--r--src/test/ui/const-generics/parent_generics_of_encoding_impl_trait.stderr14
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`.