未验证 提交 36461e04 编写于 作者: M Matthias Krüger 提交者: GitHub

Rollup merge of #93757 - jackh726:gat-bug-tests, r=nikomatsakis

Add some known GAT bugs as tests

In the spirit of rust-lang/compiler-team#476

These tests are marked as "check-fail", but also commented with "this should pass". This many of the open GAT issues that are accepted bugs.

r? ``@nikomatsakis``
// check-fail
// This should pass, but it requires `Sized` to be coinductive.
#![feature(generic_associated_types)]
trait Allocator {
type Allocated<T>;
}
enum LinkedList<A: Allocator> {
Head,
Next(A::Allocated<Self>)
//~^ overflow
}
fn main() {}
error[E0275]: overflow evaluating the requirement `LinkedList<A>: Sized`
--> $DIR/issue-80626.rs:13:10
|
LL | Next(A::Allocated<Self>)
| ^^^^^^^^^^^^^^^^^^
|
= note: no field of an enum variant may have a dynamically sized type
= help: change the field's type to have a statically known size
help: borrowed types always have a statically known size
|
LL | Next(&A::Allocated<Self>)
| +
help: the `Box` type always has a statically known size and allocates its contents in the heap
|
LL | Next(Box<A::Allocated<Self>>)
| ++++ +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0275`.
// check-fail
// This should pass, but seems to run into a TAIT issue.
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
pub trait Stream {
type Item;
}
impl Stream for () {
type Item = i32;
}
trait Yay<AdditionalValue> {
type InnerStream<'s>: Stream<Item = i32> + 's;
fn foo<'s>() -> Self::InnerStream<'s>;
}
impl<'a> Yay<&'a ()> for () {
type InnerStream<'s> = impl Stream<Item = i32> + 's;
//~^ the type
fn foo<'s>() -> Self::InnerStream<'s> { todo!() }
}
fn main() {}
error[E0477]: the type `impl Stream<Item = i32>` does not fulfill the required lifetime
--> $DIR/issue-86218.rs:22:28
|
LL | type InnerStream<'s> = impl Stream<Item = i32> + 's;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: type must outlive the lifetime `'s` as defined here as required by this binding
--> $DIR/issue-86218.rs:22:22
|
LL | type InnerStream<'s> = impl Stream<Item = i32> + 's;
| ^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0477`.
// check-fail
// This should pass, but we need an extension of implied bounds (probably).
#![feature(generic_associated_types)]
pub trait AsRef2 {
type Output<'a> where Self: 'a;
fn as_ref2<'a>(&'a self) -> Self::Output<'a>;
}
impl<T> AsRef2 for Vec<T> {
type Output<'a> where Self: 'a = &'a [T];
fn as_ref2<'a>(&'a self) -> Self::Output<'a> {
&self[..]
}
}
#[derive(Debug)]
struct Foo<T>(T);
#[derive(Debug)]
struct FooRef<'a, U>(&'a [U]);
impl<'b, T, U> AsRef2 for Foo<T> //~ the type parameter
where
// * `for<'b, 'c> T: AsRef2<Output<'b> = &'c [U]>>` does not work
//
// * `U` is unconstrained but should be allowed in this context because `Output` is
// an associated type
T: AsRef2<Output<'b> = &'b [U]>,
U: 'b
{
type Output<'a> where Self: 'a = FooRef<'a, U>;
fn as_ref2<'a>(&'a self) -> Self::Output<'a> {
FooRef(self.0.as_ref2())
}
}
fn main() {
let foo = Foo(vec![1, 2, 3]);
dbg!(foo.as_ref2());
}
error[E0207]: the type parameter `U` is not constrained by the impl trait, self type, or predicates
--> $DIR/issue-87735.rs:26:13
|
LL | impl<'b, T, U> AsRef2 for Foo<T>
| ^ unconstrained type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0207`.
// check-fail
// This should pass, but unnormalized input args aren't treated as implied.
#![feature(generic_associated_types)]
trait MyTrait {
type Assoc<'a, 'b> where 'b: 'a;
fn do_sth(arg: Self::Assoc<'_, '_>);
}
struct Foo;
impl MyTrait for Foo {
type Assoc<'a, 'b> where 'b: 'a = u32;
fn do_sth(_: u32) {} //~ lifetime bound
// fn do_sth(_: Self::Assoc<'static, 'static>) {}
// fn do_sth(_: Self::Assoc<'_, '_>) {}
}
fn main() {}
error[E0478]: lifetime bound not satisfied
--> $DIR/issue-87748.rs:17:5
|
LL | fn do_sth(_: u32) {}
| ^^^^^^^^^^^^^^^^^
|
note: lifetime parameter instantiated with the anonymous lifetime #2 defined here
--> $DIR/issue-87748.rs:17:5
|
LL | fn do_sth(_: u32) {}
| ^^^^^^^^^^^^^^^^^
note: but lifetime parameter must outlive the anonymous lifetime #1 defined here
--> $DIR/issue-87748.rs:17:5
|
LL | fn do_sth(_: u32) {}
| ^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0478`.
// check-fail
// This should pass.
#![feature(generic_associated_types)]
use std::fmt::Debug;
trait Foo {
type Ass where Self::Ass: Debug;
}
#[derive(Debug)]
struct Bar;
impl Foo for Bar {
type Ass = Bar;
//~^ overflow
}
fn main() {}
error[E0275]: overflow evaluating the requirement `<Bar as Foo>::Ass == _`
--> $DIR/issue-87755.rs:17:16
|
LL | type Ass = Bar;
| ^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0275`.
// check-fail
// This should pass, but using a type alias vs a reference directly
// changes late-bound -> early-bound.
#![feature(generic_associated_types)]
trait Scanner {
type Input<'a>;
type Token<'a>;
fn scan<'a>(&mut self, i : Self::Input<'a>) -> Self::Token<'a>;
}
struct IdScanner();
impl Scanner for IdScanner {
type Input<'a> = &'a str;
type Token<'a> = &'a str;
fn scan<'a>(&mut self, s : &'a str) -> &'a str { //~ lifetime parameters
s
}
}
fn main() {}
error[E0195]: lifetime parameters or bounds on method `scan` do not match the trait declaration
--> $DIR/issue-87803.rs:21:12
|
LL | fn scan<'a>(&mut self, i : Self::Input<'a>) -> Self::Token<'a>;
| ---- lifetimes in impl do not match this method in trait
...
LL | fn scan<'a>(&mut self, s : &'a str) -> &'a str {
| ^^^^ lifetimes do not match method in trait
error: aborting due to previous error
For more information about this error, try `rustc --explain E0195`.
// check-fail
// This should pass, but has a missed normalization due to HRTB.
#![feature(generic_associated_types)]
trait Iterable {
type Iterator<'a> where Self: 'a;
fn iter(&self) -> Self::Iterator<'_>;
}
struct SomeImplementation();
impl Iterable for SomeImplementation {
type Iterator<'a> = std::iter::Empty<usize>;
fn iter(&self) -> Self::Iterator<'_> {
std::iter::empty()
}
}
fn do_something<I: Iterable>(i: I, mut f: impl for<'a> Fn(&mut I::Iterator<'a>)) {
f(&mut i.iter());
}
fn main() {
do_something(SomeImplementation(), |_| ());
do_something(SomeImplementation(), test);
//~^ type mismatch
}
fn test<'a, I: Iterable>(_: &mut I::Iterator<'a>) {}
error[E0631]: type mismatch in function arguments
--> $DIR/issue-88382.rs:27:40
|
LL | do_something(SomeImplementation(), test);
| ------------ ^^^^ expected signature of `for<'a> fn(&mut <SomeImplementation as Iterable>::Iterator<'a>) -> _`
| |
| required by a bound introduced by this call
...
LL | fn test<'a, I: Iterable>(_: &mut I::Iterator<'a>) {}
| ------------------------------------------------- found signature of `for<'r> fn(&'r mut std::iter::Empty<usize>) -> _`
|
note: required by a bound in `do_something`
--> $DIR/issue-88382.rs:21:56
|
LL | fn do_something<I: Iterable>(i: I, mut f: impl for<'a> Fn(&mut I::Iterator<'a>)) {
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `do_something`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0631`.
// check-fail
// This should pass, but has a missed normalization due to HRTB.
#![feature(generic_associated_types)]
pub trait Marker {}
pub trait Trait {
type Assoc<'a>;
}
fn test<T>(value: T)
where
T: Trait,
for<'a> T::Assoc<'a>: Marker,
{
}
impl Marker for () {}
struct Foo;
impl Trait for Foo {
type Assoc<'a> = ();
}
fn main() {
test(Foo);
//~^ the trait bound
}
error[E0277]: the trait bound `for<'a> <_ as Trait>::Assoc<'a>: Marker` is not satisfied
--> $DIR/issue-88460.rs:29:5
|
LL | test(Foo);
| ^^^^ the trait `for<'a> Marker` is not implemented for `<_ as Trait>::Assoc<'a>`
|
note: required by a bound in `test`
--> $DIR/issue-88460.rs:16:27
|
LL | fn test<T>(value: T)
| ---- required by a bound in this
...
LL | for<'a> T::Assoc<'a>: Marker,
| ^^^^^^ required by this bound in `test`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.
// check-fail
// This should pass, but requires more logic.
#![feature(generic_associated_types)]
trait A {
type I<'a>;
}
pub struct TestA<F>
{
f: F,
}
impl<F> A for TestA<F> {
type I<'a> = &'a F;
}
struct TestB<Q, F>
{
q: Q,
f: F,
}
impl<'q, Q, I, F> A for TestB<Q, F> //~ the type parameter
where
Q: A<I<'q> = &'q I>,
F: Fn(I),
{
type I<'a> = ();
}
fn main() {}
error[E0207]: the type parameter `I` is not constrained by the impl trait, self type, or predicates
--> $DIR/issue-88526.rs:26:13
|
LL | impl<'q, Q, I, F> A for TestB<Q, F>
| ^ unconstrained type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0207`.
// check-fail
// edition:2021
// This should pass, but seems to run into a TAIT bug.
#![feature(type_alias_impl_trait)]
#![feature(generic_associated_types)]
use std::future::Future;
trait Stream {
type Item;
}
struct Empty<T>(T);
impl<T> Stream for Empty<T> {
type Item = ();
}
fn empty<T>() -> Empty<T> {
todo!()
}
trait X {
type LineStream<'a, Repr>: Stream<Item = Repr> where Self: 'a;
type LineStreamFut<'a,Repr>: Future<Output = Self::LineStream<'a, Repr>> where Self: 'a;
fn line_stream<'a,Repr>(&'a self) -> Self::LineStreamFut<'a,Repr>;
}
struct Y;
impl X for Y {
type LineStream<'a, Repr> = impl Stream<Item = Repr>; //~ could not find
type LineStreamFut<'a, Repr> = impl Future<Output = Self::LineStream<'a, Repr>> ;
fn line_stream<'a, Repr>(&'a self) -> Self::LineStreamFut<'a, Repr> { //~ type mismatch
async {empty()}
}
}
fn main() {}
error[E0271]: type mismatch resolving `<impl Future<Output = [async output]> as Future>::Output == impl Stream<Item = Repr>`
--> $DIR/issue-89008.rs:38:43
|
LL | type LineStream<'a, Repr> = impl Stream<Item = Repr>;
| ------------------------ the expected opaque type
...
LL | fn line_stream<'a, Repr>(&'a self) -> Self::LineStreamFut<'a, Repr> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected opaque type, found struct `Empty`
|
= note: expected opaque type `impl Stream<Item = Repr>`
found struct `Empty<_>`
error: could not find defining uses
--> $DIR/issue-89008.rs:34:33
|
LL | type LineStream<'a, Repr> = impl Stream<Item = Repr>;
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0271`.
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册