From 37393576eced8680065d2ae629a6e96912a782f9 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Wed, 3 Oct 2018 00:27:12 -0700 Subject: [PATCH 1/6] Stabilize impl_header_lifetime_elision in 2015 It's already stable in 2018; this finishes the stabilization. --- src/libcore/lib.rs | 2 +- src/libcore/tests/lib.rs | 2 +- src/librustc/hir/lowering.rs | 13 +++---- src/librustc/lib.rs | 2 +- src/librustc_data_structures/lib.rs | 2 +- src/librustc_mir/lib.rs | 2 +- src/libsyntax/feature_gate.rs | 7 ++-- ...pl_header_lifetime_elision-with-in_band.rs | 27 --------------- ...eader_lifetime_elision-with-in_band.stderr | 15 -------- ...ature-gate-impl_header_lifetime_elision.rs | 21 ------------ ...e-gate-impl_header_lifetime_elision.stderr | 15 -------- .../feature-gate-in_band_lifetimes.rs | 3 -- .../feature-gate-in_band_lifetimes.stderr | 34 +++++++++---------- .../assoc-type.rs | 2 -- .../assoc-type.stderr | 4 +-- .../impl-header-lifetime-elision/dyn-trait.rs | 2 -- .../dyn-trait.stderr | 6 ++-- .../explicit-and-elided-same-header.rs | 2 -- .../path-elided.rs | 2 -- .../path-elided.stderr | 2 +- .../path-underscore.rs | 2 -- .../ref-underscore.rs | 2 -- .../trait-elided.rs | 2 -- .../trait-elided.stderr | 2 +- .../trait-underscore.rs | 2 -- src/test/ui/nll/issue-52742.rs | 1 - src/test/ui/nll/issue-52742.stderr | 2 +- 27 files changed, 37 insertions(+), 141 deletions(-) delete mode 100644 src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.stderr diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 59cc312bee5fc..4156b1bec92a0 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -87,7 +87,7 @@ #![feature(doc_spotlight)] #![feature(extern_types)] #![feature(fundamental)] -#![feature(impl_header_lifetime_elision)] +#![cfg_attr(stage0, feature(impl_header_lifetime_elision))] #![feature(intrinsics)] #![feature(lang_items)] #![feature(link_llvm_intrinsics)] diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index 965bd545eed59..d340924aab1db 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -19,7 +19,7 @@ #![feature(flt2dec)] #![feature(fmt_internals)] #![feature(hashmap_internals)] -#![feature(impl_header_lifetime_elision)] +#![cfg_attr(stage0, feature(impl_header_lifetime_elision))] #![feature(pattern)] #![feature(range_is_empty)] #![feature(raw)] diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index da5979e699aa1..1daea18d05319 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -125,9 +125,8 @@ pub struct LoweringContext<'a> { // Whether or not in-band lifetimes are being collected. This is used to // indicate whether or not we're in a place where new lifetimes will result - // in in-band lifetime definitions, such a function or an impl header. - // This will always be false unless the `in_band_lifetimes` or - // `impl_header_lifetime_elision` feature is enabled. + // in in-band lifetime definitions, such a function or an impl header, + // including implicit lifetimes from `impl_header_lifetime_elision`. is_collecting_in_band_lifetimes: bool, // Currently in-scope lifetimes defined in impl headers, fn headers, or HRTB. @@ -709,12 +708,8 @@ impl<'a> LoweringContext<'a> { assert!(self.lifetimes_to_define.is_empty()); let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode; - if self.sess.features_untracked().impl_header_lifetime_elision { - self.anonymous_lifetime_mode = anonymous_lifetime_mode; - self.is_collecting_in_band_lifetimes = true; - } else if self.sess.features_untracked().in_band_lifetimes { - self.is_collecting_in_band_lifetimes = true; - } + self.anonymous_lifetime_mode = anonymous_lifetime_mode; + self.is_collecting_in_band_lifetimes = true; let (in_band_ty_params, res) = f(self); diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 3c2caa39d76e0..d8defabd3fe66 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -67,7 +67,7 @@ #![feature(step_trait)] #![feature(integer_atomics)] #![feature(test)] -#![feature(impl_header_lifetime_elision)] +#![cfg_attr(stage0, feature(impl_header_lifetime_elision))] #![feature(in_band_lifetimes)] #![feature(macro_at_most_once_rep)] #![feature(crate_visibility_modifier)] diff --git a/src/librustc_data_structures/lib.rs b/src/librustc_data_structures/lib.rs index 5b01892dcb37e..b197d29b184de 100644 --- a/src/librustc_data_structures/lib.rs +++ b/src/librustc_data_structures/lib.rs @@ -21,7 +21,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![feature(in_band_lifetimes)] -#![feature(impl_header_lifetime_elision)] +#![cfg_attr(stage0, feature(impl_header_lifetime_elision))] #![feature(unboxed_closures)] #![feature(fn_traits)] #![feature(unsize)] diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index b3ef9eab8017d..2f44dff2e22c3 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -16,7 +16,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! #![feature(nll)] #![feature(in_band_lifetimes)] -#![feature(impl_header_lifetime_elision)] +#![cfg_attr(stage0, feature(impl_header_lifetime_elision))] #![feature(slice_patterns)] #![feature(slice_sort_by_cached_key)] #![feature(box_patterns)] diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 84122688c83d2..90a5a4cef2186 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -462,10 +462,6 @@ declare_features! ( (active, abi_amdgpu_kernel, "1.29.0", Some(51575), None), - // impl Iterator for &mut Iterator - // impl Debug for Foo<'_> - (active, impl_header_lifetime_elision, "1.30.0", Some(15872), Some(Edition::Edition2018)), - // Support for arbitrary delimited token streams in non-macro attributes (active, unrestricted_attribute_tokens, "1.30.0", Some(44690), None), @@ -684,6 +680,9 @@ declare_features! ( (accepted, min_const_fn, "1.31.0", Some(53555), None), // Scoped lints (accepted, tool_lints, "1.31.0", Some(44690), None), + // impl Iterator for &mut Iterator + // impl Debug for Foo<'_> + (accepted, impl_header_lifetime_elision, "1.31.0", Some(15872), None), ); // If you change this, please modify src/doc/unstable-book as well. You must diff --git a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.rs b/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.rs deleted file mode 100644 index b7e07e1dca674..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![allow(warnings)] - -// Make sure this related feature didn't accidentally enable this -#![feature(in_band_lifetimes)] - -trait MyTrait<'a> { } - -impl MyTrait<'a> for &u32 { } -//~^ ERROR missing lifetime specifier - -struct MyStruct; -trait MarkerTrait {} - -impl MarkerTrait for &'_ MyStruct { } -//~^ ERROR missing lifetime specifier - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.stderr b/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.stderr deleted file mode 100644 index 9487d11d505ca..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision-with-in_band.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error[E0106]: missing lifetime specifier - --> $DIR/feature-gate-impl_header_lifetime_elision-with-in_band.rs:18:22 - | -LL | impl MyTrait<'a> for &u32 { } - | ^ expected lifetime parameter - -error[E0106]: missing lifetime specifier - --> $DIR/feature-gate-impl_header_lifetime_elision-with-in_band.rs:24:23 - | -LL | impl MarkerTrait for &'_ MyStruct { } - | ^^ expected lifetime parameter - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0106`. diff --git a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.rs b/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.rs deleted file mode 100644 index 3eb2ac1b00851..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![allow(warnings)] - -trait MyTrait<'a> { } - -impl<'a> MyTrait<'a> for &u32 { } -//~^ ERROR missing lifetime specifier - -impl<'a> MyTrait<'_> for &'a f32 { } -//~^ ERROR missing lifetime specifier - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.stderr b/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.stderr deleted file mode 100644 index 2c8a7dd4305a7..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-impl_header_lifetime_elision.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error[E0106]: missing lifetime specifier - --> $DIR/feature-gate-impl_header_lifetime_elision.rs:15:26 - | -LL | impl<'a> MyTrait<'a> for &u32 { } - | ^ expected lifetime parameter - -error[E0106]: missing lifetime specifier - --> $DIR/feature-gate-impl_header_lifetime_elision.rs:18:18 - | -LL | impl<'a> MyTrait<'_> for &'a f32 { } - | ^^ expected lifetime parameter - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0106`. diff --git a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.rs b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.rs index 23b30711cf3c0..ae1f81c2f5721 100644 --- a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.rs +++ b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.rs @@ -10,9 +10,6 @@ #![allow(warnings)] -// Make sure this related feature didn't accidentally enable this -#![feature(impl_header_lifetime_elision)] - fn foo(x: &'x u8) -> &'x u8 { x } //~^ ERROR use of undeclared lifetime name //~^^ ERROR use of undeclared lifetime name diff --git a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr index 5fe143959d2c5..cc0855306e162 100644 --- a/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr +++ b/src/test/ui/feature-gates/feature-gate-in_band_lifetimes.stderr @@ -1,101 +1,101 @@ error[E0261]: use of undeclared lifetime name `'x` - --> $DIR/feature-gate-in_band_lifetimes.rs:16:12 + --> $DIR/feature-gate-in_band_lifetimes.rs:13:12 | LL | fn foo(x: &'x u8) -> &'x u8 { x } | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'x` - --> $DIR/feature-gate-in_band_lifetimes.rs:16:23 + --> $DIR/feature-gate-in_band_lifetimes.rs:13:23 | LL | fn foo(x: &'x u8) -> &'x u8 { x } | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:28:12 + --> $DIR/feature-gate-in_band_lifetimes.rs:25:12 | LL | impl<'a> X<'b> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:30:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:27:27 | LL | fn inner_2(&self) -> &'b u8 { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:36:8 + --> $DIR/feature-gate-in_band_lifetimes.rs:33:8 | LL | impl X<'b> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:38:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:35:27 | LL | fn inner_3(&self) -> &'b u8 { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:46:9 + --> $DIR/feature-gate-in_band_lifetimes.rs:43:9 | LL | impl Y<&'a u8> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:48:25 + --> $DIR/feature-gate-in_band_lifetimes.rs:45:25 | LL | fn inner(&self) -> &'a u8 { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:56:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:53:27 | LL | fn any_lifetime() -> &'b u8; | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:58:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:55:27 | LL | fn borrowed_lifetime(&'b self) -> &'b u8; | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:58:40 + --> $DIR/feature-gate-in_band_lifetimes.rs:55:40 | LL | fn borrowed_lifetime(&'b self) -> &'b u8; | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:63:14 + --> $DIR/feature-gate-in_band_lifetimes.rs:60:14 | LL | impl MyTrait<'a> for Y<&'a u8> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:63:25 + --> $DIR/feature-gate-in_band_lifetimes.rs:60:25 | LL | impl MyTrait<'a> for Y<&'a u8> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:66:31 + --> $DIR/feature-gate-in_band_lifetimes.rs:63:31 | LL | fn my_lifetime(&self) -> &'a u8 { self.0 } | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:68:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:65:27 | LL | fn any_lifetime() -> &'b u8 { &0 } | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:70:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:67:27 | LL | fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 } | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:70:40 + --> $DIR/feature-gate-in_band_lifetimes.rs:67:40 | LL | fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 } | ^^ undeclared lifetime diff --git a/src/test/ui/impl-header-lifetime-elision/assoc-type.rs b/src/test/ui/impl-header-lifetime-elision/assoc-type.rs index 15cf07771f268..49f528df8f6cc 100644 --- a/src/test/ui/impl-header-lifetime-elision/assoc-type.rs +++ b/src/test/ui/impl-header-lifetime-elision/assoc-type.rs @@ -13,8 +13,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait { type Output; } diff --git a/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr b/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr index 59b2cfd2226db..022b8bc717b96 100644 --- a/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr +++ b/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr @@ -1,11 +1,11 @@ error[E0106]: missing lifetime specifier - --> $DIR/assoc-type.rs:23:19 + --> $DIR/assoc-type.rs:21:19 | LL | type Output = &i32; | ^ expected lifetime parameter error[E0106]: missing lifetime specifier - --> $DIR/assoc-type.rs:28:20 + --> $DIR/assoc-type.rs:26:20 | LL | type Output = &'_ i32; | ^^ expected lifetime parameter diff --git a/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs index 661bfa8bdcc9b..384c08ff5bb38 100644 --- a/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs +++ b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs @@ -13,8 +13,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - use std::fmt::Debug; // Equivalent to `Box`: diff --git a/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr b/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr index 3e54ebeb398d6..f0e174a12074d 100644 --- a/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr +++ b/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr @@ -1,11 +1,11 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements - --> $DIR/dyn-trait.rs:32:16 + --> $DIR/dyn-trait.rs:30:16 | LL | static_val(x); //~ ERROR cannot infer | ^ | -note: first, the lifetime cannot outlive the lifetime 'a as defined on the function body at 31:26... - --> $DIR/dyn-trait.rs:31:26 +note: first, the lifetime cannot outlive the lifetime 'a as defined on the function body at 29:26... + --> $DIR/dyn-trait.rs:29:26 | LL | fn with_dyn_debug_static<'a>(x: Box) { | ^^ diff --git a/src/test/ui/impl-header-lifetime-elision/explicit-and-elided-same-header.rs b/src/test/ui/impl-header-lifetime-elision/explicit-and-elided-same-header.rs index 56dd6691abbe5..c0d454d942646 100644 --- a/src/test/ui/impl-header-lifetime-elision/explicit-and-elided-same-header.rs +++ b/src/test/ui/impl-header-lifetime-elision/explicit-and-elided-same-header.rs @@ -12,8 +12,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - // This works for functions... fn foo<'a>(x: &str, y: &'a str) {} diff --git a/src/test/ui/impl-header-lifetime-elision/path-elided.rs b/src/test/ui/impl-header-lifetime-elision/path-elided.rs index f88c899065c1b..b68a0f375f60d 100644 --- a/src/test/ui/impl-header-lifetime-elision/path-elided.rs +++ b/src/test/ui/impl-header-lifetime-elision/path-elided.rs @@ -9,8 +9,6 @@ // except according to those terms. #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait { } struct Foo<'a> { x: &'a u32 } diff --git a/src/test/ui/impl-header-lifetime-elision/path-elided.stderr b/src/test/ui/impl-header-lifetime-elision/path-elided.stderr index 6c1d72411bf57..03e8f8c9ad5d2 100644 --- a/src/test/ui/impl-header-lifetime-elision/path-elided.stderr +++ b/src/test/ui/impl-header-lifetime-elision/path-elided.stderr @@ -1,5 +1,5 @@ error[E0106]: missing lifetime specifier - --> $DIR/path-elided.rs:18:18 + --> $DIR/path-elided.rs:16:18 | LL | impl MyTrait for Foo { | ^^^ expected lifetime parameter diff --git a/src/test/ui/impl-header-lifetime-elision/path-underscore.rs b/src/test/ui/impl-header-lifetime-elision/path-underscore.rs index 38118f0d21333..b2c7a415efe98 100644 --- a/src/test/ui/impl-header-lifetime-elision/path-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/path-underscore.rs @@ -14,8 +14,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait { } struct Foo<'a> { x: &'a u32 } diff --git a/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs b/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs index 96a56aacd87cc..e62e7dc56a4af 100644 --- a/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs @@ -14,8 +14,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait { } impl MyTrait for &i32 { diff --git a/src/test/ui/impl-header-lifetime-elision/trait-elided.rs b/src/test/ui/impl-header-lifetime-elision/trait-elided.rs index afdf2200d909a..1fb57b96ba9b4 100644 --- a/src/test/ui/impl-header-lifetime-elision/trait-elided.rs +++ b/src/test/ui/impl-header-lifetime-elision/trait-elided.rs @@ -9,8 +9,6 @@ // except according to those terms. #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait<'a> { } impl MyTrait for u32 { diff --git a/src/test/ui/impl-header-lifetime-elision/trait-elided.stderr b/src/test/ui/impl-header-lifetime-elision/trait-elided.stderr index fe3ded8e04c33..7138b321f97d4 100644 --- a/src/test/ui/impl-header-lifetime-elision/trait-elided.stderr +++ b/src/test/ui/impl-header-lifetime-elision/trait-elided.stderr @@ -1,5 +1,5 @@ error[E0106]: missing lifetime specifier - --> $DIR/trait-elided.rs:16:6 + --> $DIR/trait-elided.rs:14:6 | LL | impl MyTrait for u32 { | ^^^^^^^ expected lifetime parameter diff --git a/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs index 98242ff657795..54d23f5f4dea8 100644 --- a/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs @@ -15,8 +15,6 @@ #![allow(warnings)] -#![feature(impl_header_lifetime_elision)] - trait MyTrait<'a> { } // This is equivalent to `MyTrait<'a> for &'b i32`, which is proven by diff --git a/src/test/ui/nll/issue-52742.rs b/src/test/ui/nll/issue-52742.rs index c36e4cc70fd58..84d06a1d20aac 100644 --- a/src/test/ui/nll/issue-52742.rs +++ b/src/test/ui/nll/issue-52742.rs @@ -10,7 +10,6 @@ #![feature(nll)] #![feature(in_band_lifetimes)] -#![feature(impl_header_lifetime_elision)] struct Foo<'a, 'b> { x: &'a u32, diff --git a/src/test/ui/nll/issue-52742.stderr b/src/test/ui/nll/issue-52742.stderr index 83a594941c0a5..ccd6ec5cb77fa 100644 --- a/src/test/ui/nll/issue-52742.stderr +++ b/src/test/ui/nll/issue-52742.stderr @@ -1,5 +1,5 @@ error: unsatisfied lifetime constraints - --> $DIR/issue-52742.rs:26:9 + --> $DIR/issue-52742.rs:25:9 | LL | fn take_bar(&mut self, b: Bar<'_>) { | --------- -- let's call this `'1` From faf68f473ff70743c316e91632c4616ea62f820f Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sun, 7 Oct 2018 23:48:51 -0700 Subject: [PATCH 2/6] Hooray! 19982 finally works the way people wanted in December 2014 :) --- src/test/ui/issues/issue-19982-2.rs | 33 --------------------------- src/test/ui/issues/issue-19982.rs | 19 +++++++++++++-- src/test/ui/issues/issue-19982.stderr | 9 -------- 3 files changed, 17 insertions(+), 44 deletions(-) delete mode 100644 src/test/ui/issues/issue-19982-2.rs delete mode 100644 src/test/ui/issues/issue-19982.stderr diff --git a/src/test/ui/issues/issue-19982-2.rs b/src/test/ui/issues/issue-19982-2.rs deleted file mode 100644 index 8c3462dcf45d2..0000000000000 --- a/src/test/ui/issues/issue-19982-2.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-pass -// pretty-expanded FIXME #23616 - -#![feature(fn_traits, unboxed_closures)] - -#[allow(dead_code)] -struct Foo; - -impl<'a> Fn<(&'a (),)> for Foo { - extern "rust-call" fn call(&self, (_,): (&(),)) {} -} - -impl<'a> FnMut<(&'a (),)> for Foo { - extern "rust-call" fn call_mut(&mut self, (_,): (&(),)) {} -} - -impl<'a> FnOnce<(&'a (),)> for Foo { - type Output = (); - - extern "rust-call" fn call_once(self, (_,): (&(),)) {} -} - -fn main() {} diff --git a/src/test/ui/issues/issue-19982.rs b/src/test/ui/issues/issue-19982.rs index 9dbca997341fc..3de817c28a85f 100644 --- a/src/test/ui/issues/issue-19982.rs +++ b/src/test/ui/issues/issue-19982.rs @@ -8,10 +8,25 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![feature(unboxed_closures)] +// compile-pass +#![feature(fn_traits, unboxed_closures)] + +#[allow(dead_code)] struct Foo; -impl Fn<(&(),)> for Foo { } //~ ERROR missing lifetime specifier +impl Fn<(&(),)> for Foo { + extern "rust-call" fn call(&self, (_,): (&(),)) {} +} + +impl FnMut<(&(),)> for Foo { + extern "rust-call" fn call_mut(&mut self, (_,): (&(),)) {} +} + +impl FnOnce<(&(),)> for Foo { + type Output = (); + + extern "rust-call" fn call_once(self, (_,): (&(),)) {} +} fn main() {} diff --git a/src/test/ui/issues/issue-19982.stderr b/src/test/ui/issues/issue-19982.stderr deleted file mode 100644 index 9f13ba640a950..0000000000000 --- a/src/test/ui/issues/issue-19982.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0106]: missing lifetime specifier - --> $DIR/issue-19982.rs:15:10 - | -LL | impl Fn<(&(),)> for Foo { } //~ ERROR missing lifetime specifier - | ^ expected lifetime parameter - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0106`. From ae130b0889181e63b96bc32d5ce17b432f9225b1 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Mon, 8 Oct 2018 00:00:58 -0700 Subject: [PATCH 3/6] Move an underscore-lifetime error test to an IHLE success test --- .../inherent-impl.rs | 19 +++++++++++++++++++ .../underscore-lifetime-binders.rs | 4 ---- .../underscore-lifetime-binders.stderr | 16 +++++----------- 3 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 src/test/ui/impl-header-lifetime-elision/inherent-impl.rs diff --git a/src/test/ui/impl-header-lifetime-elision/inherent-impl.rs b/src/test/ui/impl-header-lifetime-elision/inherent-impl.rs new file mode 100644 index 0000000000000..d4b8acd60108b --- /dev/null +++ b/src/test/ui/impl-header-lifetime-elision/inherent-impl.rs @@ -0,0 +1,19 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass + +struct Foo<'a>(&'a u8); + +impl Foo<'_> { + fn x() {} +} + +fn main() {} diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.rs b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.rs index 2652fc62bb622..9048e65648a2b 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.rs +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.rs @@ -11,10 +11,6 @@ struct Foo<'a>(&'a u8); struct Baz<'a>(&'_ &'a u8); //~ ERROR missing lifetime specifier -impl Foo<'_> { //~ ERROR missing lifetime specifier - fn x() {} -} - fn foo<'_> //~ ERROR cannot be used here (_: Foo<'_>) {} diff --git a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr index fc9f3e642d402..bccecd60e1c9e 100644 --- a/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr +++ b/src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr @@ -1,11 +1,11 @@ error[E0637]: `'_` cannot be used here - --> $DIR/underscore-lifetime-binders.rs:18:8 + --> $DIR/underscore-lifetime-binders.rs:14:8 | LL | fn foo<'_> //~ ERROR cannot be used here | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/underscore-lifetime-binders.rs:24:21 + --> $DIR/underscore-lifetime-binders.rs:20:21 | LL | fn meh() -> Box Meh<'_>> //~ ERROR cannot be used here | ^^ `'_` is a reserved lifetime name @@ -17,13 +17,7 @@ LL | struct Baz<'a>(&'_ &'a u8); //~ ERROR missing lifetime specifier | ^^ expected lifetime parameter error[E0106]: missing lifetime specifier - --> $DIR/underscore-lifetime-binders.rs:14:10 - | -LL | impl Foo<'_> { //~ ERROR missing lifetime specifier - | ^^ expected lifetime parameter - -error[E0106]: missing lifetime specifier - --> $DIR/underscore-lifetime-binders.rs:24:29 + --> $DIR/underscore-lifetime-binders.rs:20:29 | LL | fn meh() -> Box Meh<'_>> //~ ERROR cannot be used here | ^^ expected lifetime parameter @@ -32,14 +26,14 @@ LL | fn meh() -> Box Meh<'_>> //~ ERROR cannot be used here = help: consider giving it a 'static lifetime error[E0106]: missing lifetime specifier - --> $DIR/underscore-lifetime-binders.rs:30:35 + --> $DIR/underscore-lifetime-binders.rs:26:35 | LL | fn foo2(_: &'_ u8, y: &'_ u8) -> &'_ u8 { y } //~ ERROR missing lifetime specifier | ^^ expected lifetime parameter | = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `_` or `y` -error: aborting due to 6 previous errors +error: aborting due to 5 previous errors Some errors occurred: E0106, E0637. For more information about an error, try `rustc --explain E0106`. From 4ab691ac2c3dbfc28ecaeb292f76c933adb0a5e7 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Mon, 8 Oct 2018 01:13:37 -0700 Subject: [PATCH 4/6] 17905 also no longer errors, thanks to IHLE But its test was written in an outdated way that hits a different error despite IHLE, so keep a variant around for that case. --- src/test/ui/issues/issue-17905-2.rs | 26 ++++++++++++++ src/test/ui/issues/issue-17905-2.stderr | 45 +++++++++++++++++++++++++ src/test/ui/issues/issue-17905.rs | 8 +++-- src/test/ui/issues/issue-17905.stderr | 9 ----- 4 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/test/ui/issues/issue-17905-2.rs create mode 100644 src/test/ui/issues/issue-17905-2.stderr delete mode 100644 src/test/ui/issues/issue-17905.stderr diff --git a/src/test/ui/issues/issue-17905-2.rs b/src/test/ui/issues/issue-17905-2.rs new file mode 100644 index 0000000000000..7b4a40e26b1bf --- /dev/null +++ b/src/test/ui/issues/issue-17905-2.rs @@ -0,0 +1,26 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[derive(Debug)] +struct Pair (T, V); + +impl Pair< + &str, + isize +> { + fn say(self: &Pair<&str, isize>) { + println!("{:?}", self); + } +} + +fn main() { + let result = &Pair("shane", 1); + result.say(); +} diff --git a/src/test/ui/issues/issue-17905-2.stderr b/src/test/ui/issues/issue-17905-2.stderr new file mode 100644 index 0000000000000..f6f23be2ab88a --- /dev/null +++ b/src/test/ui/issues/issue-17905-2.stderr @@ -0,0 +1,45 @@ +error[E0308]: mismatched method receiver + --> $DIR/issue-17905-2.rs:18:18 + | +LL | fn say(self: &Pair<&str, isize>) { + | ^^^^^^^^^^^^^^^^^^ lifetime mismatch + | + = note: expected type `Pair<&'_ str, _>` + found type `Pair<&str, _>` +note: the anonymous lifetime #2 defined on the method body at 18:5... + --> $DIR/issue-17905-2.rs:18:5 + | +LL | / fn say(self: &Pair<&str, isize>) { +LL | | println!("{:?}", self); +LL | | } + | |_____^ +note: ...does not necessarily outlive the lifetime '_ as defined on the impl at 15:5 + --> $DIR/issue-17905-2.rs:15:5 + | +LL | &str, + | ^ + +error[E0308]: mismatched method receiver + --> $DIR/issue-17905-2.rs:18:18 + | +LL | fn say(self: &Pair<&str, isize>) { + | ^^^^^^^^^^^^^^^^^^ lifetime mismatch + | + = note: expected type `Pair<&'_ str, _>` + found type `Pair<&str, _>` +note: the lifetime '_ as defined on the impl at 15:5... + --> $DIR/issue-17905-2.rs:15:5 + | +LL | &str, + | ^ +note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 18:5 + --> $DIR/issue-17905-2.rs:18:5 + | +LL | / fn say(self: &Pair<&str, isize>) { +LL | | println!("{:?}", self); +LL | | } + | |_____^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/issues/issue-17905.rs b/src/test/ui/issues/issue-17905.rs index f11d482ea16db..fc5069d9443f5 100644 --- a/src/test/ui/issues/issue-17905.rs +++ b/src/test/ui/issues/issue-17905.rs @@ -8,15 +8,17 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// run-pass + #[derive(Debug)] struct Pair (T, V); impl Pair< - &str, //~ ERROR missing lifetime specifier + &str, isize > { - fn say(self: &Pair<&str, isize>) { - println!("{}", self); + fn say(&self) { + println!("{:?}", self); } } diff --git a/src/test/ui/issues/issue-17905.stderr b/src/test/ui/issues/issue-17905.stderr deleted file mode 100644 index 1a7aba1748015..0000000000000 --- a/src/test/ui/issues/issue-17905.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0106]: missing lifetime specifier - --> $DIR/issue-17905.rs:15:5 - | -LL | &str, //~ ERROR missing lifetime specifier - | ^ expected lifetime parameter - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0106`. From 74df5ec387e40097853df9fb25318a5f501e5d99 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Mon, 8 Oct 2018 23:31:50 -0700 Subject: [PATCH 5/6] Add a stub feature so we can still test E0705 --- src/libsyntax/diagnostic_list.rs | 8 ++++---- src/libsyntax/feature_gate.rs | 3 +++ src/test/ui/E0705.rs | 7 +++++-- src/test/ui/E0705.stderr | 8 ++++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/libsyntax/diagnostic_list.rs b/src/libsyntax/diagnostic_list.rs index 5155ebbe19d47..cd421de5f1db4 100644 --- a/src/libsyntax/diagnostic_list.rs +++ b/src/libsyntax/diagnostic_list.rs @@ -375,15 +375,15 @@ and likely to change in the future. E0705: r##" A `#![feature]` attribute was declared for a feature that is stable in -the current edition. +the current edition, but not in all editions. Erroneous code example: ```ignore (limited to a warning during 2018 edition development) #![feature(rust_2018_preview)] -#![feature(impl_header_lifetime_elision)] // error: the feature - // `impl_header_lifetime_elision` is - // included in the Rust 2018 edition +#![feature(test_2018_feature)] // error: the feature + // `test_2018_feature` is + // included in the Rust 2018 edition ``` "##, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 90a5a4cef2186..1025943deccf1 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -462,6 +462,9 @@ declare_features! ( (active, abi_amdgpu_kernel, "1.29.0", Some(51575), None), + // Perma-unstable; added for testing E0705 + (active, test_2018_feature, "1.31.0", Some(0), Some(Edition::Edition2018)), + // Support for arbitrary delimited token streams in non-macro attributes (active, unrestricted_attribute_tokens, "1.30.0", Some(44690), None), diff --git a/src/test/ui/E0705.rs b/src/test/ui/E0705.rs index 2e3492937acb9..19f9ecc26cf01 100644 --- a/src/test/ui/E0705.rs +++ b/src/test/ui/E0705.rs @@ -10,8 +10,11 @@ // compile-pass -#![feature(impl_header_lifetime_elision)] -//~^ WARN the feature `impl_header_lifetime_elision` is included in the Rust 2018 edition +// This is a stub feature that doesn't control anything, so to make tidy happy, +// gate-test-test_2018_feature + +#![feature(test_2018_feature)] +//~^ WARN the feature `test_2018_feature` is included in the Rust 2018 edition #![feature(rust_2018_preview)] fn main() {} diff --git a/src/test/ui/E0705.stderr b/src/test/ui/E0705.stderr index c40064d38d2ff..ccf8a04fdfc66 100644 --- a/src/test/ui/E0705.stderr +++ b/src/test/ui/E0705.stderr @@ -1,6 +1,6 @@ -warning[E0705]: the feature `impl_header_lifetime_elision` is included in the Rust 2018 edition - --> $DIR/E0705.rs:13:12 +warning[E0705]: the feature `test_2018_feature` is included in the Rust 2018 edition + --> $DIR/E0705.rs:16:12 | -LL | #![feature(impl_header_lifetime_elision)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #![feature(test_2018_feature)] + | ^^^^^^^^^^^^^^^^^ From 18f7db3d69377ebf85b6ff3a319445411f4b16b1 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Fri, 19 Oct 2018 22:57:41 -0700 Subject: [PATCH 6/6] `impl<'_> IceCube<'_> {}` is now only one error in both editions --- .../in-binder.Rust2015.stderr | 46 ------------------- src/test/ui/underscore-lifetime/in-binder.rs | 22 +++------ ...inder.Rust2018.stderr => in-binder.stderr} | 12 ++--- 3 files changed, 12 insertions(+), 68 deletions(-) delete mode 100644 src/test/ui/underscore-lifetime/in-binder.Rust2015.stderr rename src/test/ui/underscore-lifetime/{in-binder.Rust2018.stderr => in-binder.stderr} (82%) diff --git a/src/test/ui/underscore-lifetime/in-binder.Rust2015.stderr b/src/test/ui/underscore-lifetime/in-binder.Rust2015.stderr deleted file mode 100644 index a851e6b2071b2..0000000000000 --- a/src/test/ui/underscore-lifetime/in-binder.Rust2015.stderr +++ /dev/null @@ -1,46 +0,0 @@ -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:12:6 - | -LL | impl<'_> IceCube<'_> {} - | ^^ `'_` is a reserved lifetime name - -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:17:15 - | -LL | struct Struct<'_> { - | ^^ `'_` is a reserved lifetime name - -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:23:11 - | -LL | enum Enum<'_> { - | ^^ `'_` is a reserved lifetime name - -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:29:13 - | -LL | union Union<'_> { - | ^^ `'_` is a reserved lifetime name - -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:35:13 - | -LL | trait Trait<'_> { - | ^^ `'_` is a reserved lifetime name - -error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:40:8 - | -LL | fn foo<'_>() { - | ^^ `'_` is a reserved lifetime name - -error[E0106]: missing lifetime specifier - --> $DIR/in-binder.rs:12:18 - | -LL | impl<'_> IceCube<'_> {} - | ^^ expected lifetime parameter - -error: aborting due to 7 previous errors - -Some errors occurred: E0106, E0637. -For more information about an error, try `rustc --explain E0106`. diff --git a/src/test/ui/underscore-lifetime/in-binder.rs b/src/test/ui/underscore-lifetime/in-binder.rs index c94947d1eab1c..e4ee5e8cb2741 100644 --- a/src/test/ui/underscore-lifetime/in-binder.rs +++ b/src/test/ui/underscore-lifetime/in-binder.rs @@ -2,44 +2,34 @@ // // Regression test for #52098. -// revisions: Rust2015 Rust2018 -//[Rust2018] edition:2018 - struct IceCube<'a> { v: Vec<&'a char> } impl<'_> IceCube<'_> {} -//[Rust2015]~^ ERROR `'_` cannot be used here -//[Rust2015]~| ERROR missing lifetime specifier -//[Rust2018]~^^^ ERROR `'_` cannot be used here +//~^ ERROR `'_` cannot be used here struct Struct<'_> { -//[Rust2015]~^ ERROR `'_` cannot be used here -//[Rust2018]~^^ ERROR `'_` cannot be used here +//~^ ERROR `'_` cannot be used here v: Vec<&'static char> } enum Enum<'_> { -//[Rust2015]~^ ERROR `'_` cannot be used here -//[Rust2018]~^^ ERROR `'_` cannot be used here +//~^ ERROR `'_` cannot be used here Variant } union Union<'_> { -//[Rust2015]~^ ERROR `'_` cannot be used here -//[Rust2018]~^^ ERROR `'_` cannot be used here +//~^ ERROR `'_` cannot be used here a: u32 } trait Trait<'_> { -//[Rust2015]~^ ERROR `'_` cannot be used here -//[Rust2018]~^^ ERROR `'_` cannot be used here +//~^ ERROR `'_` cannot be used here } fn foo<'_>() { - //[Rust2015]~^ ERROR `'_` cannot be used here - //[Rust2018]~^^ ERROR `'_` cannot be used here + //~^ ERROR `'_` cannot be used here } fn main() {} diff --git a/src/test/ui/underscore-lifetime/in-binder.Rust2018.stderr b/src/test/ui/underscore-lifetime/in-binder.stderr similarity index 82% rename from src/test/ui/underscore-lifetime/in-binder.Rust2018.stderr rename to src/test/ui/underscore-lifetime/in-binder.stderr index 77da3038724b8..fcd7eddb57605 100644 --- a/src/test/ui/underscore-lifetime/in-binder.Rust2018.stderr +++ b/src/test/ui/underscore-lifetime/in-binder.stderr @@ -1,35 +1,35 @@ error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:12:6 + --> $DIR/in-binder.rs:9:6 | LL | impl<'_> IceCube<'_> {} | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:17:15 + --> $DIR/in-binder.rs:12:15 | LL | struct Struct<'_> { | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:23:11 + --> $DIR/in-binder.rs:17:11 | LL | enum Enum<'_> { | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:29:13 + --> $DIR/in-binder.rs:22:13 | LL | union Union<'_> { | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:35:13 + --> $DIR/in-binder.rs:27:13 | LL | trait Trait<'_> { | ^^ `'_` is a reserved lifetime name error[E0637]: `'_` cannot be used here - --> $DIR/in-binder.rs:40:8 + --> $DIR/in-binder.rs:31:8 | LL | fn foo<'_>() { | ^^ `'_` is a reserved lifetime name