mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Deny use<> for RPITITs
This commit is contained in:
parent
dd557d8c37
commit
6521c3971d
@ -130,6 +130,9 @@ 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_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_previously_used_here = previously used here
|
||||||
|
|
||||||
ast_lowering_register1 = register `{$reg1_name}`
|
ast_lowering_register1 = register `{$reg1_name}`
|
||||||
|
@ -424,6 +424,14 @@ pub(crate) struct NoPreciseCapturesOnApit {
|
|||||||
pub span: Span,
|
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)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(ast_lowering_yield_in_closure)]
|
#[diag(ast_lowering_yield_in_closure)]
|
||||||
pub(crate) struct YieldInClosure {
|
pub(crate) struct YieldInClosure {
|
||||||
|
@ -1594,6 +1594,26 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
};
|
};
|
||||||
debug!(?captured_lifetimes_to_duplicate);
|
debug!(?captured_lifetimes_to_duplicate);
|
||||||
|
|
||||||
|
match fn_kind {
|
||||||
|
// Deny `use<>` on RPITIT in trait/trait-impl for now.
|
||||||
|
Some(FnDeclKind::Trait | FnDeclKind::Impl) => {
|
||||||
|
if let Some(span) = bounds.iter().find_map(|bound| match *bound {
|
||||||
|
ast::GenericBound::Use(_, span) => Some(span),
|
||||||
|
_ => None,
|
||||||
|
}) {
|
||||||
|
self.tcx.dcx().emit_err(errors::NoPreciseCapturesOnRpitit { span });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
| Some(
|
||||||
|
FnDeclKind::Fn
|
||||||
|
| FnDeclKind::Inherent
|
||||||
|
| FnDeclKind::ExternFn
|
||||||
|
| FnDeclKind::Closure
|
||||||
|
| FnDeclKind::Pointer,
|
||||||
|
) => {}
|
||||||
|
}
|
||||||
|
|
||||||
self.lower_opaque_inner(
|
self.lower_opaque_inner(
|
||||||
opaque_ty_node_id,
|
opaque_ty_node_id,
|
||||||
origin,
|
origin,
|
||||||
|
@ -6,6 +6,7 @@ fn type_param<T>() -> impl Sized + use<> {}
|
|||||||
trait Foo {
|
trait Foo {
|
||||||
fn bar() -> impl Sized + use<>;
|
fn bar() -> impl Sized + use<>;
|
||||||
//~^ ERROR `impl Trait` must mention the `Self` type of the trait
|
//~^ ERROR `impl Trait` must mention the `Self` type of the trait
|
||||||
|
//~| ERROR `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
|
--> $DIR/forgot-to-capture-type.rs:7:30
|
||||||
|
|
|
||||||
|
LL | fn bar() -> impl Sized + use<>;
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||||
|
|
||||||
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:3:23
|
--> $DIR/forgot-to-capture-type.rs:3:23
|
||||||
|
|
|
|
||||||
@ -18,5 +26,5 @@ LL | fn bar() -> impl Sized + use<>;
|
|||||||
|
|
|
|
||||||
= note: currently, all type parameters are required to be mentioned in the precise captures list
|
= note: currently, all type parameters are required to be mentioned in the precise captures list
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||||
|
--> $DIR/redundant.rs:7:19
|
||||||
|
|
|
||||||
|
LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
||||||
|
| ^^^^^^^^^^^^^-------
|
||||||
|
| |
|
||||||
|
| help: remove the `use<...>` syntax
|
||||||
|
|
|
||||||
|
= note: `#[warn(impl_trait_redundant_captures)]` on by default
|
||||||
|
|
||||||
|
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
||||||
|
--> $DIR/redundant.rs:12:27
|
||||||
|
|
|
||||||
|
LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
||||||
|
| ^^^^^^^^^^^^^-------
|
||||||
|
| |
|
||||||
|
| help: remove the `use<...>` syntax
|
||||||
|
|
||||||
|
warning: 2 warnings emitted
|
||||||
|
|
@ -0,0 +1,18 @@
|
|||||||
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
|
--> $DIR/redundant.rs:18:35
|
||||||
|
|
|
||||||
|
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
|
||||||
|
|
||||||
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
|
--> $DIR/redundant.rs:23:35
|
||||||
|
|
|
||||||
|
LL | fn in_trait() -> impl Sized + use<'a> {}
|
||||||
|
| ^^^^^^^
|
||||||
|
|
|
||||||
|
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
@ -1,24 +1,27 @@
|
|||||||
//@ compile-flags: -Zunstable-options --edition=2024
|
//@ compile-flags: -Zunstable-options --edition=2024
|
||||||
//@ check-pass
|
//@ revisions: normal rpitit
|
||||||
|
//@[normal] check-pass
|
||||||
|
|
||||||
#![feature(precise_capturing)]
|
#![feature(precise_capturing)]
|
||||||
|
|
||||||
fn hello<'a>() -> impl Sized + use<'a> {}
|
fn hello<'a>() -> impl Sized + use<'a> {}
|
||||||
//~^ WARN all possible in-scope parameters are already captured
|
//[normal]~^ WARN all possible in-scope parameters are already captured
|
||||||
|
|
||||||
struct Inherent;
|
struct Inherent;
|
||||||
impl Inherent {
|
impl Inherent {
|
||||||
fn inherent(&self) -> impl Sized + use<'_> {}
|
fn inherent(&self) -> impl Sized + use<'_> {}
|
||||||
//~^ WARN all possible in-scope parameters are already captured
|
//[normal]~^ WARN all possible in-scope parameters are already captured
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(rpitit)]
|
||||||
trait Test<'a> {
|
trait Test<'a> {
|
||||||
fn in_trait() -> impl Sized + use<'a, Self>;
|
fn in_trait() -> impl Sized + use<'a, Self>;
|
||||||
//~^ WARN all possible in-scope parameters are already captured
|
//[rpitit]~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
}
|
}
|
||||||
|
#[cfg(rpitit)]
|
||||||
impl<'a> Test<'a> for () {
|
impl<'a> Test<'a> for () {
|
||||||
fn in_trait() -> impl Sized + use<'a> {}
|
fn in_trait() -> impl Sized + use<'a> {}
|
||||||
//~^ WARN all possible in-scope parameters are already captured
|
//[rpitit]~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
|
||||||
--> $DIR/redundant.rs:6:19
|
|
||||||
|
|
|
||||||
LL | fn hello<'a>() -> impl Sized + use<'a> {}
|
|
||||||
| ^^^^^^^^^^^^^-------
|
|
||||||
| |
|
|
||||||
| help: remove the `use<...>` syntax
|
|
||||||
|
|
|
||||||
= note: `#[warn(impl_trait_redundant_captures)]` on by default
|
|
||||||
|
|
||||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
|
||||||
--> $DIR/redundant.rs:11:27
|
|
||||||
|
|
|
||||||
LL | fn inherent(&self) -> impl Sized + use<'_> {}
|
|
||||||
| ^^^^^^^^^^^^^-------
|
|
||||||
| |
|
|
||||||
| help: remove the `use<...>` syntax
|
|
||||||
|
|
||||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
|
||||||
--> $DIR/redundant.rs:16:22
|
|
||||||
|
|
|
||||||
LL | fn in_trait() -> impl Sized + use<'a, Self>;
|
|
||||||
| ^^^^^^^^^^^^^-------------
|
|
||||||
| |
|
|
||||||
| help: remove the `use<...>` syntax
|
|
||||||
|
|
||||||
warning: all possible in-scope parameters are already captured, so `use<...>` syntax is redundant
|
|
||||||
--> $DIR/redundant.rs:20:22
|
|
||||||
|
|
|
||||||
LL | fn in_trait() -> impl Sized + use<'a> {}
|
|
||||||
| ^^^^^^^^^^^^^-------
|
|
||||||
| |
|
|
||||||
| help: remove the `use<...>` syntax
|
|
||||||
|
|
||||||
warning: 4 warnings emitted
|
|
||||||
|
|
@ -1,3 +1,11 @@
|
|||||||
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
|
--> $DIR/rpitit.rs:11:36
|
||||||
|
|
|
||||||
|
LL | fn hello() -> impl PartialEq + use<Self>;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||||
|
|
||||||
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:11:19
|
--> $DIR/rpitit.rs:11:19
|
||||||
|
|
|
|
||||||
@ -38,5 +46,5 @@ LL | | );
|
|||||||
|
|
||||||
help: `'a` and `'b` must be the same: replace one with the other
|
help: `'a` and `'b` must be the same: replace one with the other
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
//@ check-pass
|
|
||||||
|
|
||||||
#![feature(precise_capturing)]
|
#![feature(precise_capturing)]
|
||||||
|
|
||||||
trait Foo {
|
trait Foo {
|
||||||
fn bar<'a>() -> impl Sized + use<Self>;
|
fn bar<'a>() -> impl Sized + use<Self>;
|
||||||
|
//~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
10
tests/ui/impl-trait/precise-capturing/self-capture.stderr
Normal file
10
tests/ui/impl-trait/precise-capturing/self-capture.stderr
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits
|
||||||
|
--> $DIR/self-capture.rs:4:34
|
||||||
|
|
|
||||||
|
LL | fn bar<'a>() -> impl Sized + use<Self>;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user