Add gate for precise capturing in traits
This commit is contained in:
parent
8d94e06ec9
commit
b7297ac440
10 changed files with 54 additions and 5 deletions
|
@ -1573,11 +1573,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
// Feature gate for RPITIT + use<..>
|
// Feature gate for RPITIT + use<..>
|
||||||
match origin {
|
match origin {
|
||||||
rustc_hir::OpaqueTyOrigin::FnReturn { in_trait_or_impl: Some(_), .. } => {
|
rustc_hir::OpaqueTyOrigin::FnReturn { in_trait_or_impl: Some(_), .. } => {
|
||||||
if let Some(span) = bounds.iter().find_map(|bound| match *bound {
|
if !self.tcx.features().precise_capturing_in_traits
|
||||||
ast::GenericBound::Use(_, span) => Some(span),
|
&& let Some(span) = bounds.iter().find_map(|bound| match *bound {
|
||||||
_ => None,
|
ast::GenericBound::Use(_, span) => Some(span),
|
||||||
}) {
|
_ => None,
|
||||||
self.tcx.dcx().emit_err(errors::NoPreciseCapturesOnRpitit { span });
|
})
|
||||||
|
{
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
@ -565,6 +565,8 @@ declare_features! (
|
||||||
(incomplete, pin_ergonomics, "CURRENT_RUSTC_VERSION", Some(130494)),
|
(incomplete, pin_ergonomics, "CURRENT_RUSTC_VERSION", Some(130494)),
|
||||||
/// Allows postfix match `expr.match { ... }`
|
/// Allows postfix match `expr.match { ... }`
|
||||||
(unstable, postfix_match, "1.79.0", Some(121618)),
|
(unstable, postfix_match, "1.79.0", Some(121618)),
|
||||||
|
/// Allows `use<..>` precise capturign on impl Trait in traits.
|
||||||
|
(unstable, precise_capturing_in_traits, "CURRENT_RUSTC_VERSION", Some(130044)),
|
||||||
/// Allows macro attributes on expressions, statements and non-inline modules.
|
/// Allows macro attributes on expressions, statements and non-inline modules.
|
||||||
(unstable, proc_macro_hygiene, "1.30.0", Some(54727)),
|
(unstable, proc_macro_hygiene, "1.30.0", Some(54727)),
|
||||||
/// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024.
|
/// Makes `&` and `&mut` patterns eat only one layer of references in Rust 2024.
|
||||||
|
|
|
@ -1479,6 +1479,7 @@ symbols! {
|
||||||
powif64,
|
powif64,
|
||||||
pre_dash_lto: "pre-lto",
|
pre_dash_lto: "pre-lto",
|
||||||
precise_capturing,
|
precise_capturing,
|
||||||
|
precise_capturing_in_traits,
|
||||||
precise_pointer_size_matching,
|
precise_pointer_size_matching,
|
||||||
pref_align_of,
|
pref_align_of,
|
||||||
prefetch_read_data,
|
prefetch_read_data,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
trait Foo {
|
||||||
|
fn test() -> impl Sized + use<Self>;
|
||||||
|
//~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,13 @@
|
||||||
|
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
|
||||||
|
|
|
@ -5,6 +5,9 @@ LL | fn bar() -> impl Sized + use<>;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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: `impl Trait` must mention all type parameters in scope in `use<...>`
|
error: `impl Trait` must mention all type parameters in scope in `use<...>`
|
||||||
--> $DIR/forgot-to-capture-type.rs:1:23
|
--> $DIR/forgot-to-capture-type.rs:1:23
|
||||||
|
|
|
@ -5,6 +5,9 @@ LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
||||||
| ^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
--> $DIR/redundant.rs:21:35
|
--> $DIR/redundant.rs:21:35
|
||||||
|
@ -13,6 +16,9 @@ LL | fn in_trait() -> impl Sized + use<'a> {}
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@ LL | fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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: return type captures more lifetimes than trait definition
|
error: return type captures more lifetimes than trait definition
|
||||||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:11:40
|
--> $DIR/rpitit-captures-more-method-lifetimes.rs:11:40
|
||||||
|
|
|
@ -5,6 +5,9 @@ LL | fn hello() -> impl PartialEq + use<Self>;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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: `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
|
error: `impl Trait` captures lifetime parameter, but it is not mentioned in `use<...>` precise captures list
|
||||||
--> $DIR/rpitit.rs:9:19
|
--> $DIR/rpitit.rs:9:19
|
||||||
|
|
|
@ -5,6 +5,9 @@ LL | fn bar<'a>() -> impl Sized + use<Self>;
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
= 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
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue