Always use CreateParameter mode for function definitions.
This commit is contained in:
parent
a639f89d04
commit
031b2c53cd
@ -758,7 +758,10 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
|
|||||||
// We don't need to deal with patterns in parameters, because
|
// We don't need to deal with patterns in parameters, because
|
||||||
// they are not possible for foreign or bodiless functions.
|
// they are not possible for foreign or bodiless functions.
|
||||||
self.with_lifetime_rib(
|
self.with_lifetime_rib(
|
||||||
LifetimeRibKind::AnonymousPassThrough(fn_id, false),
|
LifetimeRibKind::AnonymousCreateParameter {
|
||||||
|
binder: fn_id,
|
||||||
|
report_in_path: false,
|
||||||
|
},
|
||||||
|this| walk_list!(this, visit_param, &sig.decl.inputs),
|
|this| walk_list!(this, visit_param, &sig.decl.inputs),
|
||||||
);
|
);
|
||||||
self.with_lifetime_rib(
|
self.with_lifetime_rib(
|
||||||
@ -792,18 +795,13 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
|
|||||||
// generic parameters. This is especially useful for `async fn`, where
|
// generic parameters. This is especially useful for `async fn`, where
|
||||||
// these fresh generic parameters can be applied to the opaque `impl Trait`
|
// these fresh generic parameters can be applied to the opaque `impl Trait`
|
||||||
// return type.
|
// return type.
|
||||||
let rib = if async_node_id.is_some() {
|
this.with_lifetime_rib(
|
||||||
// Only emit a hard error for `async fn`, since this kind of
|
|
||||||
// elision has always been allowed in regular `fn`s.
|
|
||||||
LifetimeRibKind::AnonymousCreateParameter {
|
LifetimeRibKind::AnonymousCreateParameter {
|
||||||
binder: fn_id,
|
binder: fn_id,
|
||||||
report_in_path: true,
|
// Only emit a hard error for `async fn`, since this kind of
|
||||||
}
|
// elision has always been allowed in regular `fn`s.
|
||||||
} else {
|
report_in_path: async_node_id.is_some(),
|
||||||
LifetimeRibKind::AnonymousPassThrough(fn_id, false)
|
},
|
||||||
};
|
|
||||||
this.with_lifetime_rib(
|
|
||||||
rib,
|
|
||||||
// Add each argument to the rib.
|
// Add each argument to the rib.
|
||||||
|this| this.resolve_params(&declaration.inputs),
|
|this| this.resolve_params(&declaration.inputs),
|
||||||
);
|
);
|
||||||
|
@ -4,12 +4,12 @@ error[E0478]: lifetime bound not satisfied
|
|||||||
LL | fn do_sth(_: u32) {}
|
LL | fn do_sth(_: u32) {}
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: lifetime parameter instantiated with the anonymous lifetime #2 defined here
|
note: lifetime parameter instantiated with the anonymous lifetime as defined here
|
||||||
--> $DIR/issue-87748.rs:18:5
|
--> $DIR/issue-87748.rs:18:5
|
||||||
|
|
|
|
||||||
LL | fn do_sth(_: u32) {}
|
LL | fn do_sth(_: u32) {}
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
note: but lifetime parameter must outlive the anonymous lifetime #1 defined here
|
note: but lifetime parameter must outlive the anonymous lifetime as defined here
|
||||||
--> $DIR/issue-87748.rs:18:5
|
--> $DIR/issue-87748.rs:18:5
|
||||||
|
|
|
|
||||||
LL | fn do_sth(_: u32) {}
|
LL | fn do_sth(_: u32) {}
|
||||||
|
@ -11,7 +11,10 @@ trait Foo {
|
|||||||
fn foo(x: &impl Foo<Item<'_> = u32>) { }
|
fn foo(x: &impl Foo<Item<'_> = u32>) { }
|
||||||
//~^ ERROR `'_` cannot be used here [E0637]
|
//~^ ERROR `'_` cannot be used here [E0637]
|
||||||
|
|
||||||
|
// Ok: the anonymous lifetime is bound to the function.
|
||||||
fn bar(x: &impl for<'a> Foo<Item<'a> = &'_ u32>) { }
|
fn bar(x: &impl for<'a> Foo<Item<'a> = &'_ u32>) { }
|
||||||
//~^ ERROR missing lifetime specifier
|
|
||||||
|
// Ok: the anonymous lifetime is bound to the function.
|
||||||
|
fn baz(x: &impl for<'a> Foo<Item<'a> = &u32>) { }
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -4,18 +4,6 @@ error[E0637]: `'_` cannot be used here
|
|||||||
LL | fn foo(x: &impl Foo<Item<'_> = u32>) { }
|
LL | fn foo(x: &impl Foo<Item<'_> = u32>) { }
|
||||||
| ^^ `'_` is a reserved lifetime name
|
| ^^ `'_` is a reserved lifetime name
|
||||||
|
|
||||||
error[E0106]: missing lifetime specifier
|
error: aborting due to previous error
|
||||||
--> $DIR/issue-95305.rs:14:41
|
|
||||||
|
|
|
||||||
LL | fn bar(x: &impl for<'a> Foo<Item<'a> = &'_ u32>) { }
|
|
||||||
| ^^ expected named lifetime parameter
|
|
||||||
|
|
|
||||||
help: consider using the `'a` lifetime
|
|
||||||
|
|
|
||||||
LL | fn bar(x: &impl for<'a> Foo<Item<'a> = &'a u32>) { }
|
|
||||||
| ~~
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
For more information about this error, try `rustc --explain E0637`.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0106, E0637.
|
|
||||||
For more information about an error, try `rustc --explain E0106`.
|
|
||||||
|
@ -6,7 +6,7 @@ LL | fn next(&'a mut self) -> Option<Self::Item>
|
|||||||
|
|
|
|
||||||
= note: expected fn pointer `fn(&mut RepeatMut<'a, T>) -> Option<_>`
|
= note: expected fn pointer `fn(&mut RepeatMut<'a, T>) -> Option<_>`
|
||||||
found fn pointer `fn(&'a mut RepeatMut<'a, T>) -> Option<_>`
|
found fn pointer `fn(&'a mut RepeatMut<'a, T>) -> Option<_>`
|
||||||
note: the anonymous lifetime #1 defined here...
|
note: the anonymous lifetime as defined here...
|
||||||
--> $DIR/issue-37884.rs:6:5
|
--> $DIR/issue-37884.rs:6:5
|
||||||
|
|
|
|
||||||
LL | fn next(&'a mut self) -> Option<Self::Item>
|
LL | fn next(&'a mut self) -> Option<Self::Item>
|
||||||
|
@ -2,14 +2,14 @@ error[E0700]: hidden type for `impl Trait` captures lifetime that does not appea
|
|||||||
--> $DIR/impl-trait-captures.rs:11:5
|
--> $DIR/impl-trait-captures.rs:11:5
|
||||||
|
|
|
|
||||||
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> {
|
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> {
|
||||||
| -- hidden type `&ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrAnon(0)) T` captures the anonymous lifetime defined here
|
| -- hidden type `&ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrNamed(DefId(0:13 ~ impl_trait_captures[1afc]::foo::'_), '_)) T` captures the anonymous lifetime defined here
|
||||||
LL | x
|
LL | x
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures `ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrAnon(0))`, you can add an explicit `ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrAnon(0))` lifetime bound
|
help: to declare that the `impl Trait` captures `ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrNamed(DefId(0:13 ~ impl_trait_captures[1afc]::foo::'_), '_))`, you can add an explicit `ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrNamed(DefId(0:13 ~ impl_trait_captures[1afc]::foo::'_), '_))` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> + ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrAnon(0)) {
|
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> + ReFree(DefId(0:8 ~ impl_trait_captures[1afc]::foo), BrNamed(DefId(0:13 ~ impl_trait_captures[1afc]::foo::'_), '_)) {
|
||||||
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -1,2 +1,8 @@
|
|||||||
fn f(_: impl Iterator<Item = &'_ ()>) {} //~ ERROR missing lifetime specifier
|
// This is understood as `fn foo<'_1>(_: impl Iterator<Item = &'_1 ()>) {}`.
|
||||||
|
fn f(_: impl Iterator<Item = &'_ ()>) {}
|
||||||
|
|
||||||
|
// But that lifetime does not participate in resolution.
|
||||||
|
fn g(x: impl Iterator<Item = &'_ ()>) -> Option<&'_ ()> { x.next() }
|
||||||
|
//~^ ERROR missing lifetime specifier
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
error[E0106]: missing lifetime specifier
|
error[E0106]: missing lifetime specifier
|
||||||
--> $DIR/impl-trait-missing-lifetime.rs:1:31
|
--> $DIR/impl-trait-missing-lifetime.rs:5:50
|
||||||
|
|
|
|
||||||
LL | fn f(_: impl Iterator<Item = &'_ ()>) {}
|
LL | fn g(x: impl Iterator<Item = &'_ ()>) -> Option<&'_ ()> { x.next() }
|
||||||
| ^^ expected named lifetime parameter
|
| ^^ expected named lifetime parameter
|
||||||
|
|
|
|
||||||
help: consider introducing a named lifetime parameter
|
= help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
|
||||||
|
help: consider using the `'static` lifetime
|
||||||
|
|
|
|
||||||
LL | fn f<'a>(_: impl Iterator<Item = &'a ()>) {}
|
LL | fn g(x: impl Iterator<Item = &'_ ()>) -> Option<&'static ()> { x.next() }
|
||||||
| ++++ ~~
|
| ~~~~~~~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -21,11 +21,11 @@ note: because this has an unmet lifetime requirement
|
|||||||
|
|
|
|
||||||
LL | pub struct Wrapper<T: Trait>(T);
|
LL | pub struct Wrapper<T: Trait>(T);
|
||||||
| ^^^^^ introduces a `'static` lifetime requirement
|
| ^^^^^ introduces a `'static` lifetime requirement
|
||||||
note: the anonymous lifetime #1 defined here...
|
note: the anonymous lifetime as defined here...
|
||||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:5
|
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:16:29
|
||||||
|
|
|
|
||||||
LL | pub fn repro(_: Wrapper<Ref>);
|
LL | pub fn repro(_: Wrapper<Ref>);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^
|
||||||
note: ...does not necessarily outlive the static lifetime introduced by the compatible `impl`
|
note: ...does not necessarily outlive the static lifetime introduced by the compatible `impl`
|
||||||
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:13:1
|
--> $DIR/wf-in-foreign-fn-decls-issue-80468.rs:13:1
|
||||||
|
|
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user