encode generics_of of fields and ty params

This commit is contained in:
Ellen 2021-08-06 14:20:59 +01:00
parent 1f94abcda6
commit 2c004a2287
6 changed files with 82 additions and 2 deletions

View File

@ -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

View File

@ -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] }
}
}

View File

@ -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();
}

View File

@ -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 {});
}

View File

@ -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:
}

View File

@ -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`.