Add some known GAT bugs as tests
This commit is contained in:
parent
f52c31840d
commit
a38ff481ed
20 changed files with 450 additions and 0 deletions
17
src/test/ui/generic-associated-types/bugs/issue-80626.rs
Normal file
17
src/test/ui/generic-associated-types/bugs/issue-80626.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// 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() {}
|
20
src/test/ui/generic-associated-types/bugs/issue-80626.stderr
Normal file
20
src/test/ui/generic-associated-types/bugs/issue-80626.stderr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
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`.
|
27
src/test/ui/generic-associated-types/bugs/issue-86218.rs
Normal file
27
src/test/ui/generic-associated-types/bugs/issue-86218.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// 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() {}
|
15
src/test/ui/generic-associated-types/bugs/issue-86218.stderr
Normal file
15
src/test/ui/generic-associated-types/bugs/issue-86218.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
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`.
|
45
src/test/ui/generic-associated-types/bugs/issue-87735.rs
Normal file
45
src/test/ui/generic-associated-types/bugs/issue-87735.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// 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());
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
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`.
|
22
src/test/ui/generic-associated-types/bugs/issue-87748.rs
Normal file
22
src/test/ui/generic-associated-types/bugs/issue-87748.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// 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() {}
|
20
src/test/ui/generic-associated-types/bugs/issue-87748.stderr
Normal file
20
src/test/ui/generic-associated-types/bugs/issue-87748.stderr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
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`.
|
21
src/test/ui/generic-associated-types/bugs/issue-87755.rs
Normal file
21
src/test/ui/generic-associated-types/bugs/issue-87755.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// 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() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
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`.
|
26
src/test/ui/generic-associated-types/bugs/issue-87803.rs
Normal file
26
src/test/ui/generic-associated-types/bugs/issue-87803.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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() {}
|
12
src/test/ui/generic-associated-types/bugs/issue-87803.stderr
Normal file
12
src/test/ui/generic-associated-types/bugs/issue-87803.stderr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
error[E0195]: lifetime parameters or bounds on method `scan` do not match the trait declaration
|
||||||
|
--> $DIR/issue-87803.rs:20: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`.
|
31
src/test/ui/generic-associated-types/bugs/issue-88382.rs
Normal file
31
src/test/ui/generic-associated-types/bugs/issue-88382.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// 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>) {}
|
20
src/test/ui/generic-associated-types/bugs/issue-88382.stderr
Normal file
20
src/test/ui/generic-associated-types/bugs/issue-88382.stderr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
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`.
|
31
src/test/ui/generic-associated-types/bugs/issue-88460.rs
Normal file
31
src/test/ui/generic-associated-types/bugs/issue-88460.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// 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
|
||||||
|
}
|
18
src/test/ui/generic-associated-types/bugs/issue-88460.stderr
Normal file
18
src/test/ui/generic-associated-types/bugs/issue-88460.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
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`.
|
34
src/test/ui/generic-associated-types/bugs/issue-88526.rs
Normal file
34
src/test/ui/generic-associated-types/bugs/issue-88526.rs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// 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() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
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`.
|
43
src/test/ui/generic-associated-types/bugs/issue-89008.rs
Normal file
43
src/test/ui/generic-associated-types/bugs/issue-89008.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// 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() {}
|
21
src/test/ui/generic-associated-types/bugs/issue-89008.stderr
Normal file
21
src/test/ui/generic-associated-types/bugs/issue-89008.stderr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
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`.
|
Loading…
Add table
Add a link
Reference in a new issue