Add lifetime_capture_rules_2024
This commit is contained in:
parent
ec94480d98
commit
0ad160a585
@ -1571,8 +1571,10 @@ fn lower_opaque_impl_trait(
|
||||
Vec::new()
|
||||
}
|
||||
hir::OpaqueTyOrigin::FnReturn(..) => {
|
||||
if let FnDeclKind::Impl | FnDeclKind::Trait =
|
||||
fn_kind.expect("expected RPITs to be lowered with a FnKind")
|
||||
if matches!(
|
||||
fn_kind.expect("expected RPITs to be lowered with a FnKind"),
|
||||
FnDeclKind::Impl | FnDeclKind::Trait
|
||||
) || self.tcx.features().lifetime_capture_rules_2024
|
||||
{
|
||||
// return-position impl trait in trait was decided to capture all
|
||||
// in-scope lifetimes, which we collect for all opaques during resolution.
|
||||
|
@ -195,6 +195,8 @@ pub fn internal(&self, feature: Symbol) -> bool {
|
||||
(internal, intrinsics, "1.0.0", None, None),
|
||||
/// Allows using `#[lang = ".."]` attribute for linking items to special compiler logic.
|
||||
(internal, lang_items, "1.0.0", None, None),
|
||||
/// Changes `impl Trait` to capture all lifetimes in scope.
|
||||
(unstable, lifetime_capture_rules_2024, "CURRENT_RUSTC_VERSION", None, None),
|
||||
/// Allows `#[link(..., cfg(..))]`; perma-unstable per #37406
|
||||
(unstable, link_cfg, "1.14.0", None, None),
|
||||
/// Allows the `multiple_supertrait_upcastable` lint.
|
||||
|
@ -929,6 +929,7 @@
|
||||
lib,
|
||||
libc,
|
||||
lifetime,
|
||||
lifetime_capture_rules_2024,
|
||||
lifetimes,
|
||||
likely,
|
||||
line,
|
||||
|
@ -0,0 +1,6 @@
|
||||
fn foo(x: &Vec<i32>) -> impl Sized {
|
||||
x
|
||||
//~^ ERROR hidden type for `impl Sized` captures lifetime that does not appear in bounds
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,18 @@
|
||||
error[E0700]: hidden type for `impl Sized` captures lifetime that does not appear in bounds
|
||||
--> $DIR/feature-gate-lifetime-capture-rules-2024.rs:2:5
|
||||
|
|
||||
LL | fn foo(x: &Vec<i32>) -> impl Sized {
|
||||
| --------- ---------- opaque type defined here
|
||||
| |
|
||||
| hidden type `&Vec<i32>` captures the anonymous lifetime defined here
|
||||
LL | x
|
||||
| ^
|
||||
|
|
||||
help: to declare that `impl Sized` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
LL | fn foo(x: &Vec<i32>) -> impl Sized + '_ {
|
||||
| ++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0700`.
|
26
tests/ui/impl-trait/variance.new.stderr
Normal file
26
tests/ui/impl-trait/variance.new.stderr
Normal file
@ -0,0 +1,26 @@
|
||||
error: [*, o]
|
||||
--> $DIR/variance.rs:12:36
|
||||
|
|
||||
LL | fn not_captured_early<'a: 'a>() -> impl Sized {}
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [*, o]
|
||||
--> $DIR/variance.rs:16:32
|
||||
|
|
||||
LL | fn captured_early<'a: 'a>() -> impl Sized + Captures<'a> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:18:40
|
||||
|
|
||||
LL | fn not_captured_late<'a>(_: &'a ()) -> impl Sized {}
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:22:36
|
||||
|
|
||||
LL | fn captured_late<'a>(_: &'a ()) -> impl Sized + Captures<'a> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
@ -1,23 +1,23 @@
|
||||
error: [*]
|
||||
--> $DIR/variance.rs:8:36
|
||||
--> $DIR/variance.rs:12:36
|
||||
|
|
||||
LL | fn not_captured_early<'a: 'a>() -> impl Sized {}
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [*, o]
|
||||
--> $DIR/variance.rs:10:32
|
||||
--> $DIR/variance.rs:16:32
|
||||
|
|
||||
LL | fn captured_early<'a: 'a>() -> impl Sized + Captures<'a> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: []
|
||||
--> $DIR/variance.rs:12:40
|
||||
--> $DIR/variance.rs:18:40
|
||||
|
|
||||
LL | fn not_captured_late<'a>(_: &'a ()) -> impl Sized {}
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:14:36
|
||||
--> $DIR/variance.rs:22:36
|
||||
|
|
||||
LL | fn captured_late<'a>(_: &'a ()) -> impl Sized + Captures<'a> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
@ -1,3 +1,7 @@
|
||||
// revisions: old new
|
||||
|
||||
#![cfg_attr(new, feature(lifetime_capture_rules_2024))]
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
#![rustc_variance_of_opaques]
|
||||
@ -5,11 +9,15 @@
|
||||
trait Captures<'a> {}
|
||||
impl<T> Captures<'_> for T {}
|
||||
|
||||
fn not_captured_early<'a: 'a>() -> impl Sized {} //~ [*]
|
||||
fn not_captured_early<'a: 'a>() -> impl Sized {}
|
||||
//[old]~^ [*]
|
||||
//[new]~^^ [*, o]
|
||||
|
||||
fn captured_early<'a: 'a>() -> impl Sized + Captures<'a> {} //~ [*, o]
|
||||
|
||||
fn not_captured_late<'a>(_: &'a ()) -> impl Sized {} //~ []
|
||||
fn not_captured_late<'a>(_: &'a ()) -> impl Sized {}
|
||||
//[old]~^ []
|
||||
//[new]~^^ [o]
|
||||
|
||||
fn captured_late<'a>(_: &'a ()) -> impl Sized + Captures<'a> {} //~ [o]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user