Stabilize precise_capturing_in_traits
This commit is contained in:
parent
97fc1f62d8
commit
eb3707e4b4
24 changed files with 22 additions and 91 deletions
|
@ -141,9 +141,6 @@ ast_lowering_never_pattern_with_guard =
|
|||
|
||||
ast_lowering_no_precise_captures_on_apit = `use<...>` precise capturing syntax not allowed in argument-position `impl Trait`
|
||||
|
||||
ast_lowering_no_precise_captures_on_rpitit = `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||
.note = currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||
|
||||
ast_lowering_previously_used_here = previously used here
|
||||
|
||||
ast_lowering_register1 = register `{$reg1_name}`
|
||||
|
|
|
@ -444,14 +444,6 @@ pub(crate) struct NoPreciseCapturesOnApit {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(ast_lowering_no_precise_captures_on_rpitit)]
|
||||
#[note]
|
||||
pub(crate) struct NoPreciseCapturesOnRpitit {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(ast_lowering_yield_in_closure)]
|
||||
pub(crate) struct YieldInClosure {
|
||||
|
|
|
@ -1438,28 +1438,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
// frequently opened issues show.
|
||||
let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
|
||||
|
||||
// Feature gate for RPITIT + use<..>
|
||||
match origin {
|
||||
rustc_hir::OpaqueTyOrigin::FnReturn { in_trait_or_impl: Some(_), .. } => {
|
||||
if !self.tcx.features().precise_capturing_in_traits()
|
||||
&& let Some(span) = bounds.iter().find_map(|bound| match *bound {
|
||||
ast::GenericBound::Use(_, span) => Some(span),
|
||||
_ => None,
|
||||
})
|
||||
{
|
||||
let mut diag =
|
||||
self.tcx.dcx().create_err(errors::NoPreciseCapturesOnRpitit { span });
|
||||
add_feature_diagnostics(
|
||||
&mut diag,
|
||||
self.tcx.sess,
|
||||
sym::precise_capturing_in_traits,
|
||||
);
|
||||
diag.emit();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
self.lower_opaque_inner(opaque_ty_node_id, origin, opaque_ty_span, |this| {
|
||||
this.lower_param_bounds(bounds, itctx)
|
||||
})
|
||||
|
|
|
@ -331,6 +331,8 @@ declare_features! (
|
|||
(accepted, pattern_parentheses, "1.31.0", Some(51087)),
|
||||
/// Allows `use<'a, 'b, A, B>` in `impl Trait + use<...>` for precise capture of generic args.
|
||||
(accepted, precise_capturing, "1.82.0", Some(123432)),
|
||||
/// Allows `use<..>` precise capturign on impl Trait in traits.
|
||||
(accepted, precise_capturing_in_traits, "CURRENT_RUSTC_VERSION", Some(130044)),
|
||||
/// Allows procedural macros in `proc-macro` crates.
|
||||
(accepted, proc_macro, "1.29.0", Some(38356)),
|
||||
/// Allows multi-segment paths in attributes and derives.
|
||||
|
|
|
@ -600,8 +600,6 @@ declare_features! (
|
|||
(incomplete, pin_ergonomics, "1.83.0", Some(130494)),
|
||||
/// Allows postfix match `expr.match { ... }`
|
||||
(unstable, postfix_match, "1.79.0", Some(121618)),
|
||||
/// Allows `use<..>` precise capturign on impl Trait in traits.
|
||||
(unstable, precise_capturing_in_traits, "1.83.0", Some(130044)),
|
||||
/// Allows macro attributes on expressions, statements and non-inline modules.
|
||||
(unstable, proc_macro_hygiene, "1.30.0", Some(54727)),
|
||||
/// Allows the use of raw-dylibs on ELF platforms
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
trait Foo {
|
||||
fn test() -> impl Sized + use<Self>;
|
||||
//~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,13 +0,0 @@
|
|||
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||
--> $DIR/feature-gate-precise_capturing_in_traits.rs:2:31
|
||||
|
|
||||
LL | fn test() -> impl Sized + use<Self>;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||
= note: see issue #130044 <https://github.com/rust-lang/rust/issues/130044> for more information
|
||||
= help: add `#![feature(precise_capturing_in_traits)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
//@ compile-flags: -Zverbose-internals
|
||||
|
||||
#![feature(precise_capturing_in_traits, rustc_attrs)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![rustc_hidden_type_of_opaques]
|
||||
|
||||
trait Foo {
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
trait LifetimeParam<'a> {
|
||||
fn test() -> impl Sized;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
warning: impl trait in impl method captures fewer lifetimes than in trait
|
||||
--> $DIR/refine-captures.rs:8:31
|
||||
--> $DIR/refine-captures.rs:6:31
|
||||
|
|
||||
LL | fn test() -> impl Sized + use<> {}
|
||||
| ^^^^^
|
||||
|
@ -13,7 +13,7 @@ LL | fn test() -> impl Sized + use<'a> {}
|
|||
| ++
|
||||
|
||||
warning: impl trait in impl method captures fewer lifetimes than in trait
|
||||
--> $DIR/refine-captures.rs:22:31
|
||||
--> $DIR/refine-captures.rs:20:31
|
||||
|
|
||||
LL | fn test() -> impl Sized + use<> {}
|
||||
| ^^^^^
|
||||
|
@ -26,7 +26,7 @@ LL | fn test() -> impl Sized + use<'a> {}
|
|||
| ++
|
||||
|
||||
warning: impl trait in impl method captures fewer lifetimes than in trait
|
||||
--> $DIR/refine-captures.rs:27:31
|
||||
--> $DIR/refine-captures.rs:25:31
|
||||
|
|
||||
LL | fn test() -> impl Sized + use<'b> {}
|
||||
| ^^^^^^^
|
||||
|
@ -39,7 +39,7 @@ LL | fn test() -> impl Sized + use<'a, 'b> {}
|
|||
| ++++
|
||||
|
||||
error: `impl Trait` must mention all type parameters in scope in `use<...>`
|
||||
--> $DIR/refine-captures.rs:32:18
|
||||
--> $DIR/refine-captures.rs:30:18
|
||||
|
|
||||
LL | impl<T> TypeParam<T> for u64 {
|
||||
| - type parameter is implicitly captured by this `impl Trait`
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#![feature(rustc_attrs, precise_capturing_in_traits)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
#![rustc_variance_of_opaques]
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
fn type_param<T>() -> impl Sized + use<> {}
|
||||
//~^ ERROR `impl Trait` must mention all type parameters in scope
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: `impl Trait` must mention all type parameters in scope in `use<...>`
|
||||
--> $DIR/forgot-to-capture-type.rs:3:23
|
||||
--> $DIR/forgot-to-capture-type.rs:1:23
|
||||
|
|
||||
LL | fn type_param<T>() -> impl Sized + use<> {}
|
||||
| - ^^^^^^^^^^^^^^^^^^
|
||||
|
@ -9,7 +9,7 @@ LL | fn type_param<T>() -> impl Sized + use<> {}
|
|||
= note: currently, all type parameters are required to be mentioned in the precise captures list
|
||||
|
||||
error: `impl Trait` must mention the `Self` type of the trait in `use<...>`
|
||||
--> $DIR/forgot-to-capture-type.rs:7:17
|
||||
--> $DIR/forgot-to-capture-type.rs:5:17
|
||||
|
|
||||
LL | trait Foo {
|
||||
| --------- `Self` type parameter is implicitly captured by this `impl Trait`
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
//@ edition: 2024
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
#![deny(impl_trait_redundant_captures)]
|
||||
|
||||
fn hello<'a>() -> impl Sized + use<'a> {}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:6:19
|
||||
--> $DIR/redundant.rs:5:19
|
||||
|
|
||||
LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
||||
| ^^^^^^^^^^^^^-------
|
||||
|
@ -7,13 +7,13 @@ LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
|||
| help: remove the `use<...>` syntax
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/redundant.rs:4:9
|
||||
--> $DIR/redundant.rs:3:9
|
||||
|
|
||||
LL | #![deny(impl_trait_redundant_captures)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:11:27
|
||||
--> $DIR/redundant.rs:10:27
|
||||
|
|
||||
LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
||||
| ^^^^^^^^^^^^^-------
|
||||
|
@ -21,7 +21,7 @@ LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
|||
| help: remove the `use<...>` syntax
|
||||
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:16:22
|
||||
--> $DIR/redundant.rs:15:22
|
||||
|
|
||||
LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
||||
| ^^^^^^^^^^^^^-------------
|
||||
|
@ -29,7 +29,7 @@ LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
|||
| help: remove the `use<...>` syntax
|
||||
|
||||
error: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||
--> $DIR/redundant.rs:20:22
|
||||
--> $DIR/redundant.rs:19:22
|
||||
|
|
||||
LL | fn in_trait() -> impl Sized + use<'a> {}
|
||||
| ^^^^^^^^^^^^^-------
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
// trait definition, which is not allowed. Due to the default lifetime capture
|
||||
// rules of RPITITs, this is only doable if we use precise capturing.
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
pub trait Foo {
|
||||
fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: return type captures more lifetimes than trait definition
|
||||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:12:40
|
||||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:10:40
|
||||
|
|
||||
LL | fn bar<'im: 'im>(&'im mut self) -> impl Sized + use<'im> {}
|
||||
| --- ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -7,7 +7,7 @@ LL | fn bar<'im: 'im>(&'im mut self) -> impl Sized + use<'im> {}
|
|||
| this lifetime was captured
|
||||
|
|
||||
note: hidden type must only reference lifetimes captured by this impl trait
|
||||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:8:40
|
||||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:6:40
|
||||
|
|
||||
LL | fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
struct Invariant<'a>(&'a mut &'a mut ());
|
||||
|
||||
trait Trait {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: return type captures more lifetimes than trait definition
|
||||
--> $DIR/rpitit-impl-captures-too-much.rs:10:39
|
||||
--> $DIR/rpitit-impl-captures-too-much.rs:8:39
|
||||
|
|
||||
LL | fn hello(self_: Invariant<'_>) -> impl Sized + use<Self>;
|
||||
| -- this lifetime was captured
|
||||
|
@ -8,7 +8,7 @@ LL | fn hello(self_: Invariant<'_>) -> impl Sized + use<'_> {}
|
|||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: hidden type must only reference lifetimes captured by this impl trait
|
||||
--> $DIR/rpitit-impl-captures-too-much.rs:6:39
|
||||
--> $DIR/rpitit-impl-captures-too-much.rs:4:39
|
||||
|
|
||||
LL | fn hello(self_: Invariant<'_>) -> impl Sized + use<Self>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
// Ensure that we skip uncaptured args from RPITITs when comptuing outlives.
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
struct Invariant<T>(*mut T);
|
||||
|
||||
trait Foo {
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
// Ensure that we skip uncaptured args from RPITITs when collecting the regions
|
||||
// to enforce member constraints in opaque type inference.
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
struct Invariant<T>(*mut T);
|
||||
|
||||
trait Foo {
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
// To fix this soundly, we need to make sure that all the trait header args
|
||||
// remain captured, since they affect trait selection.
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
fn eq_types<T>(_: T, _: T) {}
|
||||
|
||||
trait TraitLt<'a: 'a> {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
|
||||
--> $DIR/rpitit.rs:11:19
|
||||
--> $DIR/rpitit.rs:9:19
|
||||
|
|
||||
LL | trait TraitLt<'a: 'a> {
|
||||
| -- all lifetime parameters originating from a trait are captured implicitly
|
||||
|
@ -7,7 +7,7 @@ LL | fn hello() -> impl Sized + use<Self>;
|
|||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/rpitit.rs:15:5
|
||||
--> $DIR/rpitit.rs:13:5
|
||||
|
|
||||
LL | fn trait_lt<'a, 'b, T: for<'r> TraitLt<'r>> () {
|
||||
| -- -- lifetime `'b` defined here
|
||||
|
@ -24,7 +24,7 @@ LL | | );
|
|||
= help: consider adding the following bound: `'a: 'b`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/rpitit.rs:15:5
|
||||
--> $DIR/rpitit.rs:13:5
|
||||
|
|
||||
LL | fn trait_lt<'a, 'b, T: for<'r> TraitLt<'r>> () {
|
||||
| -- -- lifetime `'b` defined here
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
//@ check-pass
|
||||
|
||||
#![feature(precise_capturing_in_traits)]
|
||||
|
||||
trait Foo {
|
||||
fn bar<'a>() -> impl Sized + use<Self>;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue