1
Fork 0

Rollup merge of #104117 - crlf0710:update_feature_gate, r=jackh726

Mark `trait_upcasting` feature no longer incomplete.

This marks the `trait_upcasting` feature no longer incomplete since #101336 has been settled for a little while.

r? ``````@jackh726``````
This commit is contained in:
Guillaume Gomez 2022-11-12 17:25:01 +01:00 committed by GitHub
commit bef2da0629
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 83 additions and 83 deletions

View file

@ -512,9 +512,9 @@ declare_features! (
(active, thread_local, "1.0.0", Some(29594), None), (active, thread_local, "1.0.0", Some(29594), None),
/// Allows defining `trait X = A + B;` alias items. /// Allows defining `trait X = A + B;` alias items.
(active, trait_alias, "1.24.0", Some(41517), None), (active, trait_alias, "1.24.0", Some(41517), None),
/// Allows upcasting trait objects via supertraits. /// Allows dyn upcasting trait objects via supertraits.
/// Trait upcasting is casting, e.g., `dyn Foo -> dyn Bar` where `Foo: Bar`. /// Dyn upcasting is casting, e.g., `dyn Foo -> dyn Bar` where `Foo: Bar`.
(incomplete, trait_upcasting, "1.56.0", Some(65991), None), (active, trait_upcasting, "1.56.0", Some(65991), None),
/// Allows #[repr(transparent)] on unions (RFC 2645). /// Allows #[repr(transparent)] on unions (RFC 2645).
(active, transparent_unions, "1.37.0", Some(60405), None), (active, transparent_unions, "1.37.0", Some(60405), None),
/// Allows inconsistent bounds in where clauses. /// Allows inconsistent bounds in where clauses.

View file

@ -1,6 +1,5 @@
// build-pass // build-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
pub trait A {} pub trait A {}
pub trait B {} pub trait B {}

View file

@ -1,7 +1,6 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync { trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
fn a(&self) -> i32 { fn a(&self) -> i32 {

View file

@ -1,6 +1,5 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo<T: Default + ToString>: Bar<i32> + Bar<T> {} trait Foo<T: Default + ToString>: Bar<i32> + Bar<T> {}
trait Bar<T: Default + ToString> { trait Bar<T: Default + ToString> {

View file

@ -1,7 +1,6 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync { trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
fn a(&self) -> i32 { fn a(&self) -> i32 {

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo { trait Foo {
fn a(&self) -> i32 { fn a(&self) -> i32 {

View file

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:54:35 --> $DIR/invalid-upcast.rs:53:35
| |
LL | let _: &dyn std::fmt::Debug = baz; LL | let _: &dyn std::fmt::Debug = baz;
| -------------------- ^^^ expected trait `Debug`, found trait `Baz` | -------------------- ^^^ expected trait `Debug`, found trait `Baz`
@ -10,7 +10,7 @@ LL | let _: &dyn std::fmt::Debug = baz;
found reference `&dyn Baz` found reference `&dyn Baz`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:56:24 --> $DIR/invalid-upcast.rs:55:24
| |
LL | let _: &dyn Send = baz; LL | let _: &dyn Send = baz;
| --------- ^^^ expected trait `Send`, found trait `Baz` | --------- ^^^ expected trait `Send`, found trait `Baz`
@ -21,7 +21,7 @@ LL | let _: &dyn Send = baz;
found reference `&dyn Baz` found reference `&dyn Baz`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:58:24 --> $DIR/invalid-upcast.rs:57:24
| |
LL | let _: &dyn Sync = baz; LL | let _: &dyn Sync = baz;
| --------- ^^^ expected trait `Sync`, found trait `Baz` | --------- ^^^ expected trait `Sync`, found trait `Baz`
@ -32,7 +32,7 @@ LL | let _: &dyn Sync = baz;
found reference `&dyn Baz` found reference `&dyn Baz`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:61:25 --> $DIR/invalid-upcast.rs:60:25
| |
LL | let bar: &dyn Bar = baz; LL | let bar: &dyn Bar = baz;
| -------- ^^^ expected trait `Bar`, found trait `Baz` | -------- ^^^ expected trait `Bar`, found trait `Baz`
@ -43,7 +43,7 @@ LL | let bar: &dyn Bar = baz;
found reference `&dyn Baz` found reference `&dyn Baz`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:63:35 --> $DIR/invalid-upcast.rs:62:35
| |
LL | let _: &dyn std::fmt::Debug = bar; LL | let _: &dyn std::fmt::Debug = bar;
| -------------------- ^^^ expected trait `Debug`, found trait `Bar` | -------------------- ^^^ expected trait `Debug`, found trait `Bar`
@ -54,7 +54,7 @@ LL | let _: &dyn std::fmt::Debug = bar;
found reference `&dyn Bar` found reference `&dyn Bar`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:65:24 --> $DIR/invalid-upcast.rs:64:24
| |
LL | let _: &dyn Send = bar; LL | let _: &dyn Send = bar;
| --------- ^^^ expected trait `Send`, found trait `Bar` | --------- ^^^ expected trait `Send`, found trait `Bar`
@ -65,7 +65,7 @@ LL | let _: &dyn Send = bar;
found reference `&dyn Bar` found reference `&dyn Bar`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:67:24 --> $DIR/invalid-upcast.rs:66:24
| |
LL | let _: &dyn Sync = bar; LL | let _: &dyn Sync = bar;
| --------- ^^^ expected trait `Sync`, found trait `Bar` | --------- ^^^ expected trait `Sync`, found trait `Bar`
@ -76,7 +76,7 @@ LL | let _: &dyn Sync = bar;
found reference `&dyn Bar` found reference `&dyn Bar`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:70:25 --> $DIR/invalid-upcast.rs:69:25
| |
LL | let foo: &dyn Foo = baz; LL | let foo: &dyn Foo = baz;
| -------- ^^^ expected trait `Foo`, found trait `Baz` | -------- ^^^ expected trait `Foo`, found trait `Baz`
@ -87,7 +87,7 @@ LL | let foo: &dyn Foo = baz;
found reference `&dyn Baz` found reference `&dyn Baz`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:72:35 --> $DIR/invalid-upcast.rs:71:35
| |
LL | let _: &dyn std::fmt::Debug = foo; LL | let _: &dyn std::fmt::Debug = foo;
| -------------------- ^^^ expected trait `Debug`, found trait `Foo` | -------------------- ^^^ expected trait `Debug`, found trait `Foo`
@ -98,7 +98,7 @@ LL | let _: &dyn std::fmt::Debug = foo;
found reference `&dyn Foo` found reference `&dyn Foo`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:74:24 --> $DIR/invalid-upcast.rs:73:24
| |
LL | let _: &dyn Send = foo; LL | let _: &dyn Send = foo;
| --------- ^^^ expected trait `Send`, found trait `Foo` | --------- ^^^ expected trait `Send`, found trait `Foo`
@ -109,7 +109,7 @@ LL | let _: &dyn Send = foo;
found reference `&dyn Foo` found reference `&dyn Foo`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:76:24 --> $DIR/invalid-upcast.rs:75:24
| |
LL | let _: &dyn Sync = foo; LL | let _: &dyn Sync = foo;
| --------- ^^^ expected trait `Sync`, found trait `Foo` | --------- ^^^ expected trait `Sync`, found trait `Foo`
@ -120,7 +120,7 @@ LL | let _: &dyn Sync = foo;
found reference `&dyn Foo` found reference `&dyn Foo`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:79:25 --> $DIR/invalid-upcast.rs:78:25
| |
LL | let foo: &dyn Foo = bar; LL | let foo: &dyn Foo = bar;
| -------- ^^^ expected trait `Foo`, found trait `Bar` | -------- ^^^ expected trait `Foo`, found trait `Bar`
@ -131,7 +131,7 @@ LL | let foo: &dyn Foo = bar;
found reference `&dyn Bar` found reference `&dyn Bar`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:81:35 --> $DIR/invalid-upcast.rs:80:35
| |
LL | let _: &dyn std::fmt::Debug = foo; LL | let _: &dyn std::fmt::Debug = foo;
| -------------------- ^^^ expected trait `Debug`, found trait `Foo` | -------------------- ^^^ expected trait `Debug`, found trait `Foo`
@ -142,7 +142,7 @@ LL | let _: &dyn std::fmt::Debug = foo;
found reference `&dyn Foo` found reference `&dyn Foo`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:83:24 --> $DIR/invalid-upcast.rs:82:24
| |
LL | let _: &dyn Send = foo; LL | let _: &dyn Send = foo;
| --------- ^^^ expected trait `Send`, found trait `Foo` | --------- ^^^ expected trait `Send`, found trait `Foo`
@ -153,7 +153,7 @@ LL | let _: &dyn Send = foo;
found reference `&dyn Foo` found reference `&dyn Foo`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/invalid-upcast.rs:85:24 --> $DIR/invalid-upcast.rs:84:24
| |
LL | let _: &dyn Sync = foo; LL | let _: &dyn Sync = foo;
| --------- ^^^ expected trait `Sync`, found trait `Foo` | --------- ^^^ expected trait `Sync`, found trait `Foo`

View file

@ -1,6 +1,5 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
struct Test { struct Test {
func: Box<dyn FnMut() + 'static>, func: Box<dyn FnMut() + 'static>,

View file

@ -1,7 +1,6 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync { trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
fn a(&self) -> i32 { fn a(&self) -> i32 {

View file

@ -1,12 +1,11 @@
// check-fail // check-fail
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Bar<T> { trait Bar<T> {
fn bar(&self, _: T) {} fn bar(&self, _: T) {}
} }
trait Foo : Bar<i32> + Bar<u32> { trait Foo: Bar<i32> + Bar<u32> {
fn foo(&self, _: ()) {} fn foo(&self, _: ()) {}
} }

View file

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/multiple-occurrence-ambiguousity.rs:21:26 --> $DIR/multiple-occurrence-ambiguousity.rs:20:26
| |
LL | let t: &dyn Bar<_> = s; LL | let t: &dyn Bar<_> = s;
| ----------- ^ expected trait `Bar`, found trait `Foo` | ----------- ^ expected trait `Bar`, found trait `Foo`

View file

@ -1,7 +1,6 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait A { trait A {
fn foo_a(&self); fn foo_a(&self);

View file

@ -1,7 +1,6 @@
// run-pass // run-pass
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync { trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
fn a(&self) -> i32 { fn a(&self) -> i32 {

View file

@ -1,64 +1,64 @@
error[E0599]: no method named `c` found for reference `&dyn Bar` in the current scope error[E0599]: no method named `c` found for reference `&dyn Bar` in the current scope
--> $DIR/subtrait-method.rs:56:9 --> $DIR/subtrait-method.rs:55:9
| |
LL | bar.c(); LL | bar.c();
| ^ help: there is a method with a similar name: `a` | ^ help: there is a method with a similar name: `a`
| |
= help: items from traits can only be used if the trait is implemented and in scope = help: items from traits can only be used if the trait is implemented and in scope
note: `Baz` defines an item `c`, perhaps you need to implement it note: `Baz` defines an item `c`, perhaps you need to implement it
--> $DIR/subtrait-method.rs:28:1 --> $DIR/subtrait-method.rs:27:1
| |
LL | trait Baz: Bar { LL | trait Baz: Bar {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0599]: no method named `b` found for reference `&dyn Foo` in the current scope error[E0599]: no method named `b` found for reference `&dyn Foo` in the current scope
--> $DIR/subtrait-method.rs:60:9 --> $DIR/subtrait-method.rs:59:9
| |
LL | foo.b(); LL | foo.b();
| ^ help: there is a method with a similar name: `a` | ^ help: there is a method with a similar name: `a`
| |
= help: items from traits can only be used if the trait is implemented and in scope = help: items from traits can only be used if the trait is implemented and in scope
note: `Bar` defines an item `b`, perhaps you need to implement it note: `Bar` defines an item `b`, perhaps you need to implement it
--> $DIR/subtrait-method.rs:18:1 --> $DIR/subtrait-method.rs:17:1
| |
LL | trait Bar: Foo { LL | trait Bar: Foo {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0599]: no method named `c` found for reference `&dyn Foo` in the current scope error[E0599]: no method named `c` found for reference `&dyn Foo` in the current scope
--> $DIR/subtrait-method.rs:62:9 --> $DIR/subtrait-method.rs:61:9
| |
LL | foo.c(); LL | foo.c();
| ^ help: there is a method with a similar name: `a` | ^ help: there is a method with a similar name: `a`
| |
= help: items from traits can only be used if the trait is implemented and in scope = help: items from traits can only be used if the trait is implemented and in scope
note: `Baz` defines an item `c`, perhaps you need to implement it note: `Baz` defines an item `c`, perhaps you need to implement it
--> $DIR/subtrait-method.rs:28:1 --> $DIR/subtrait-method.rs:27:1
| |
LL | trait Baz: Bar { LL | trait Baz: Bar {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0599]: no method named `b` found for reference `&dyn Foo` in the current scope error[E0599]: no method named `b` found for reference `&dyn Foo` in the current scope
--> $DIR/subtrait-method.rs:66:9 --> $DIR/subtrait-method.rs:65:9
| |
LL | foo.b(); LL | foo.b();
| ^ help: there is a method with a similar name: `a` | ^ help: there is a method with a similar name: `a`
| |
= help: items from traits can only be used if the trait is implemented and in scope = help: items from traits can only be used if the trait is implemented and in scope
note: `Bar` defines an item `b`, perhaps you need to implement it note: `Bar` defines an item `b`, perhaps you need to implement it
--> $DIR/subtrait-method.rs:18:1 --> $DIR/subtrait-method.rs:17:1
| |
LL | trait Bar: Foo { LL | trait Bar: Foo {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error[E0599]: no method named `c` found for reference `&dyn Foo` in the current scope error[E0599]: no method named `c` found for reference `&dyn Foo` in the current scope
--> $DIR/subtrait-method.rs:68:9 --> $DIR/subtrait-method.rs:67:9
| |
LL | foo.c(); LL | foo.c();
| ^ help: there is a method with a similar name: `a` | ^ help: there is a method with a similar name: `a`
| |
= help: items from traits can only be used if the trait is implemented and in scope = help: items from traits can only be used if the trait is implemented and in scope
note: `Baz` defines an item `c`, perhaps you need to implement it note: `Baz` defines an item `c`, perhaps you need to implement it
--> $DIR/subtrait-method.rs:28:1 --> $DIR/subtrait-method.rs:27:1
| |
LL | trait Baz: Bar { LL | trait Baz: Bar {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo: Bar<i32> + Bar<u32> {} trait Foo: Bar<i32> + Bar<u32> {}
trait Bar<T> { trait Bar<T> {

View file

@ -1,5 +1,5 @@
error[E0605]: non-primitive cast: `&dyn Foo` as `&dyn Bar<_>` error[E0605]: non-primitive cast: `&dyn Foo` as `&dyn Bar<_>`
--> $DIR/type-checking-test-1.rs:17:13 --> $DIR/type-checking-test-1.rs:16:13
| |
LL | let _ = x as &dyn Bar<_>; // Ambiguous LL | let _ = x as &dyn Bar<_>; // Ambiguous
| ^^^^^^^^^^^^^^^^ invalid cast | ^^^^^^^^^^^^^^^^ invalid cast
@ -10,7 +10,7 @@ LL | let _ = &x as &dyn Bar<_>; // Ambiguous
| + | +
error[E0277]: the trait bound `&dyn Foo: Bar<_>` is not satisfied error[E0277]: the trait bound `&dyn Foo: Bar<_>` is not satisfied
--> $DIR/type-checking-test-1.rs:17:13 --> $DIR/type-checking-test-1.rs:16:13
| |
LL | let _ = x as &dyn Bar<_>; // Ambiguous LL | let _ = x as &dyn Bar<_>; // Ambiguous
| ^ the trait `Bar<_>` is not implemented for `&dyn Foo` | ^ the trait `Bar<_>` is not implemented for `&dyn Foo`

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo<T>: Bar<i32> + Bar<T> {} trait Foo<T>: Bar<i32> + Bar<T> {}
trait Bar<T> { trait Bar<T> {

View file

@ -1,5 +1,5 @@
error[E0605]: non-primitive cast: `&dyn Foo<i32>` as `&dyn Bar<u32>` error[E0605]: non-primitive cast: `&dyn Foo<i32>` as `&dyn Bar<u32>`
--> $DIR/type-checking-test-2.rs:20:13 --> $DIR/type-checking-test-2.rs:19:13
| |
LL | let _ = x as &dyn Bar<u32>; // Error LL | let _ = x as &dyn Bar<u32>; // Error
| ^^^^^^^^^^^^^^^^^^ invalid cast | ^^^^^^^^^^^^^^^^^^ invalid cast
@ -10,7 +10,7 @@ LL | let _ = &x as &dyn Bar<u32>; // Error
| + | +
error[E0277]: the trait bound `&dyn Foo<i32>: Bar<u32>` is not satisfied error[E0277]: the trait bound `&dyn Foo<i32>: Bar<u32>` is not satisfied
--> $DIR/type-checking-test-2.rs:20:13 --> $DIR/type-checking-test-2.rs:19:13
| |
LL | let _ = x as &dyn Bar<u32>; // Error LL | let _ = x as &dyn Bar<u32>; // Error
| ^ the trait `Bar<u32>` is not implemented for `&dyn Foo<i32>` | ^ the trait `Bar<u32>` is not implemented for `&dyn Foo<i32>`
@ -18,7 +18,7 @@ LL | let _ = x as &dyn Bar<u32>; // Error
= note: required for the cast from `&dyn Foo<i32>` to the object type `dyn Bar<u32>` = note: required for the cast from `&dyn Foo<i32>` to the object type `dyn Bar<u32>`
error[E0605]: non-primitive cast: `&dyn Foo<u32>` as `&dyn Bar<_>` error[E0605]: non-primitive cast: `&dyn Foo<u32>` as `&dyn Bar<_>`
--> $DIR/type-checking-test-2.rs:26:13 --> $DIR/type-checking-test-2.rs:25:13
| |
LL | let a = x as &dyn Bar<_>; // Ambiguous LL | let a = x as &dyn Bar<_>; // Ambiguous
| ^^^^^^^^^^^^^^^^ invalid cast | ^^^^^^^^^^^^^^^^ invalid cast
@ -29,7 +29,7 @@ LL | let a = &x as &dyn Bar<_>; // Ambiguous
| + | +
error[E0277]: the trait bound `&dyn Foo<u32>: Bar<_>` is not satisfied error[E0277]: the trait bound `&dyn Foo<u32>: Bar<_>` is not satisfied
--> $DIR/type-checking-test-2.rs:26:13 --> $DIR/type-checking-test-2.rs:25:13
| |
LL | let a = x as &dyn Bar<_>; // Ambiguous LL | let a = x as &dyn Bar<_>; // Ambiguous
| ^ the trait `Bar<_>` is not implemented for `&dyn Foo<u32>` | ^ the trait `Bar<_>` is not implemented for `&dyn Foo<u32>`

View file

@ -1,22 +1,18 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-3.rs:13:13 --> $DIR/type-checking-test-3.rs:11:13
| |
LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
LL | let _ = x as &dyn Bar<'a>; // Error LL | let _ = x as &dyn Bar<'a>; // Error
| ^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
|
= help: consider replacing `'a` with `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-3.rs:18:13 --> $DIR/type-checking-test-3.rs:16:13
| |
LL | fn test_wrong2<'a>(x: &dyn Foo<'a>) { LL | fn test_wrong2<'a>(x: &dyn Foo<'a>) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
LL | let _ = x as &dyn Bar<'static>; // Error LL | let _ = x as &dyn Bar<'static>; // Error
| ^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
|
= help: consider replacing `'a` with `'static`
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo<'a>: Bar<'a> {} trait Foo<'a>: Bar<'a> {}
trait Bar<'a> {} trait Bar<'a> {}

View file

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-3.rs:12:13 --> $DIR/type-checking-test-3.rs:11:13
| |
LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -7,7 +7,7 @@ LL | let _ = x as &dyn Bar<'a>; // Error
| ^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-3.rs:17:13 --> $DIR/type-checking-test-3.rs:16:13
| |
LL | fn test_wrong2<'a>(x: &dyn Foo<'a>) { LL | fn test_wrong2<'a>(x: &dyn Foo<'a>) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here

View file

@ -1,33 +1,52 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:17:13 --> $DIR/type-checking-test-4.rs:15:13
| |
LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
LL | let _ = x as &dyn Bar<'static, 'a>; // Error LL | let _ = x as &dyn Bar<'static, 'a>; // Error
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
|
= help: consider replacing `'a` with `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:22:13 --> $DIR/type-checking-test-4.rs:20:13
| |
LL | fn test_wrong2<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong2<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
LL | let _ = x as &dyn Bar<'a, 'static>; // Error LL | let _ = x as &dyn Bar<'a, 'static>; // Error
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
|
= help: consider replacing `'a` with `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:29:5 --> $DIR/type-checking-test-4.rs:26:5
| |
LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> { LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
... LL | let y = x as &dyn Bar<'_, '_>;
LL | y.get_b() // ERROR LL | y.get_b() // ERROR
| ^^^^^^^^^ returning this value requires that `'a` must outlive `'static` | ^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:31:5
| |
= help: consider replacing `'a` with `'static` LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here
LL | <_ as Bar>::get_b(x) // ERROR
| ^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: aborting due to 3 previous errors error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:36:5
|
LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here
LL | <_ as Bar<'_, '_>>::get_b(x) // ERROR
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:44:5
|
LL | fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here
...
LL | z.get_b() // ERROR
| ^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: aborting due to 6 previous errors

View file

@ -1,5 +1,4 @@
#![feature(trait_upcasting)] #![feature(trait_upcasting)]
#![allow(incomplete_features)]
trait Foo<'a>: Bar<'a, 'a> {} trait Foo<'a>: Bar<'a, 'a> {}
trait Bar<'a, 'b> { trait Bar<'a, 'b> {

View file

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:16:13 --> $DIR/type-checking-test-4.rs:15:13
| |
LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong1<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -7,7 +7,7 @@ LL | let _ = x as &dyn Bar<'static, 'a>; // Error
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:21:13 --> $DIR/type-checking-test-4.rs:20:13
| |
LL | fn test_wrong2<'a>(x: &dyn Foo<'static>, y: &'a u32) { LL | fn test_wrong2<'a>(x: &dyn Foo<'static>, y: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -15,7 +15,7 @@ LL | let _ = x as &dyn Bar<'a, 'static>; // Error
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:27:5 --> $DIR/type-checking-test-4.rs:26:5
| |
LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> { LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -24,7 +24,7 @@ LL | y.get_b() // ERROR
| ^^^^^^^^^ returning this value requires that `'a` must outlive `'static` | ^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:32:5 --> $DIR/type-checking-test-4.rs:31:5
| |
LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> { LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -32,7 +32,7 @@ LL | <_ as Bar>::get_b(x) // ERROR
| ^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:37:5 --> $DIR/type-checking-test-4.rs:36:5
| |
LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> { LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here
@ -40,7 +40,7 @@ LL | <_ as Bar<'_, '_>>::get_b(x) // ERROR
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/type-checking-test-4.rs:45:5 --> $DIR/type-checking-test-4.rs:44:5
| |
LL | fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> { LL | fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here