From ce9d469a700682b164defabd15e6783595c7ea57 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Fri, 3 Aug 2018 00:08:44 -0700 Subject: [PATCH 1/3] Extract impl_header_lifetime_elision out of in_band_lifetimes --- src/librustc/hir/lowering.rs | 14 +++++--- src/libsyntax/feature_gate.rs | 4 +++ ...pl_header_lifetime_elision-with-in_band.rs | 27 +++++++++++++++ ...eader_lifetime_elision-with-in_band.stderr | 15 ++++++++ ...ture-gate-impl_header_lifetime_elision.rs} | 0 ...-gate-impl_header_lifetime_elision.stderr} | 4 +-- src/test/ui/feature-gate-in_band_lifetimes.rs | 3 ++ .../ui/feature-gate-in_band_lifetimes.stderr | 34 +++++++++---------- .../assoc-type.rs | 4 +-- .../assoc-type.stderr | 0 .../dyn-trait.nll.stderr | 0 .../dyn-trait.rs | 2 +- .../dyn-trait.stderr | 0 .../path-elided.rs | 2 +- .../path-elided.stderr | 0 .../path-underscore.rs | 2 +- .../ref-underscore.rs | 2 +- .../trait-elided.rs | 2 +- .../trait-elided.stderr | 0 .../trait-underscore.rs | 2 +- 20 files changed, 86 insertions(+), 31 deletions(-) create mode 100644 src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.rs create mode 100644 src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.stderr rename src/test/ui/{feature-gate-in_band_lifetimes-impl.rs => feature-gate-impl_header_lifetime_elision.rs} (100%) rename src/test/ui/{feature-gate-in_band_lifetimes-impl.stderr => feature-gate-impl_header_lifetime_elision.stderr} (76%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/assoc-type.rs (92%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/assoc-type.stderr (100%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/dyn-trait.nll.stderr (100%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/dyn-trait.rs (96%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/dyn-trait.stderr (100%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/path-elided.rs (93%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/path-elided.stderr (100%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/path-underscore.rs (96%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/ref-underscore.rs (95%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/trait-elided.rs (93%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/trait-elided.stderr (100%) rename src/test/ui/{in-band-lifetimes/impl => impl-header-lifetime-elision}/trait-underscore.rs (96%) diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 4b69e3b6bc7..0cc5d3034e0 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -123,8 +123,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` feature is - // enabled. + // This will always be false unless the `in_band_lifetimes` or + // `impl_header_lifetime_elision` feature is enabled. is_collecting_in_band_lifetimes: bool, // Currently in-scope lifetimes defined in impl headers, fn headers, or HRTB. @@ -658,9 +658,11 @@ impl<'a> LoweringContext<'a> { assert!(self.lifetimes_to_define.is_empty()); let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode; - self.is_collecting_in_band_lifetimes = self.sess.features_untracked().in_band_lifetimes; - if self.is_collecting_in_band_lifetimes { + 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; } let (in_band_ty_params, res) = f(self); @@ -718,6 +720,10 @@ impl<'a> LoweringContext<'a> { return; } + if !self.sess.features_untracked().in_band_lifetimes { + return; + } + if self.in_scope_lifetimes.contains(&ident.modern()) { return; } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 77e3faa5b1f..684de34e7db 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -482,6 +482,10 @@ declare_features! ( (active, alloc_error_handler, "1.29.0", Some(51540), None), (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)), ); declare_features! ( diff --git a/src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.rs b/src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.rs new file mode 100644 index 00000000000..b7e07e1dca6 --- /dev/null +++ b/src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.rs @@ -0,0 +1,27 @@ +// 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-gate-impl_header_lifetime_elision-with-in_band.stderr b/src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.stderr new file mode 100644 index 00000000000..9487d11d505 --- /dev/null +++ b/src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.stderr @@ -0,0 +1,15 @@ +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-gate-in_band_lifetimes-impl.rs b/src/test/ui/feature-gate-impl_header_lifetime_elision.rs similarity index 100% rename from src/test/ui/feature-gate-in_band_lifetimes-impl.rs rename to src/test/ui/feature-gate-impl_header_lifetime_elision.rs diff --git a/src/test/ui/feature-gate-in_band_lifetimes-impl.stderr b/src/test/ui/feature-gate-impl_header_lifetime_elision.stderr similarity index 76% rename from src/test/ui/feature-gate-in_band_lifetimes-impl.stderr rename to src/test/ui/feature-gate-impl_header_lifetime_elision.stderr index 95bf81f41f8..2c8a7dd4305 100644 --- a/src/test/ui/feature-gate-in_band_lifetimes-impl.stderr +++ b/src/test/ui/feature-gate-impl_header_lifetime_elision.stderr @@ -1,11 +1,11 @@ error[E0106]: missing lifetime specifier - --> $DIR/feature-gate-in_band_lifetimes-impl.rs:15:26 + --> $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-in_band_lifetimes-impl.rs:18:18 + --> $DIR/feature-gate-impl_header_lifetime_elision.rs:18:18 | LL | impl<'a> MyTrait<'_> for &'a f32 { } | ^^ expected lifetime parameter diff --git a/src/test/ui/feature-gate-in_band_lifetimes.rs b/src/test/ui/feature-gate-in_band_lifetimes.rs index ae1f81c2f57..23b30711cf3 100644 --- a/src/test/ui/feature-gate-in_band_lifetimes.rs +++ b/src/test/ui/feature-gate-in_band_lifetimes.rs @@ -10,6 +10,9 @@ #![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-gate-in_band_lifetimes.stderr b/src/test/ui/feature-gate-in_band_lifetimes.stderr index cc0855306e1..5fe143959d2 100644 --- a/src/test/ui/feature-gate-in_band_lifetimes.stderr +++ b/src/test/ui/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:13:12 + --> $DIR/feature-gate-in_band_lifetimes.rs:16: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:13:23 + --> $DIR/feature-gate-in_band_lifetimes.rs:16: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:25:12 + --> $DIR/feature-gate-in_band_lifetimes.rs:28:12 | LL | impl<'a> X<'b> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:27:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:30: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:33:8 + --> $DIR/feature-gate-in_band_lifetimes.rs:36:8 | LL | impl X<'b> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:35:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:38: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:43:9 + --> $DIR/feature-gate-in_band_lifetimes.rs:46:9 | LL | impl Y<&'a u8> { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/feature-gate-in_band_lifetimes.rs:45:25 + --> $DIR/feature-gate-in_band_lifetimes.rs:48:25 | LL | fn inner(&self) -> &'a u8 { | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:53:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:56:27 | LL | fn any_lifetime() -> &'b u8; | ^^ undeclared lifetime error[E0261]: use of undeclared lifetime name `'b` - --> $DIR/feature-gate-in_band_lifetimes.rs:55:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:58: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:55:40 + --> $DIR/feature-gate-in_band_lifetimes.rs:58: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:60:14 + --> $DIR/feature-gate-in_band_lifetimes.rs:63: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:60:25 + --> $DIR/feature-gate-in_band_lifetimes.rs:63: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:63:31 + --> $DIR/feature-gate-in_band_lifetimes.rs:66: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:65:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:68: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:67:27 + --> $DIR/feature-gate-in_band_lifetimes.rs:70: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:67:40 + --> $DIR/feature-gate-in_band_lifetimes.rs:70:40 | LL | fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 } | ^^ undeclared lifetime diff --git a/src/test/ui/in-band-lifetimes/impl/assoc-type.rs b/src/test/ui/impl-header-lifetime-elision/assoc-type.rs similarity index 92% rename from src/test/ui/in-band-lifetimes/impl/assoc-type.rs rename to src/test/ui/impl-header-lifetime-elision/assoc-type.rs index ab35331b279..15cf07771f2 100644 --- a/src/test/ui/in-band-lifetimes/impl/assoc-type.rs +++ b/src/test/ui/impl-header-lifetime-elision/assoc-type.rs @@ -13,7 +13,7 @@ #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait { type Output; @@ -30,7 +30,7 @@ impl MyTrait for &u32 { } // This is what you have to do: -impl MyTrait for &'a f32 { +impl<'a> MyTrait for &'a f32 { type Output = &'a f32; } diff --git a/src/test/ui/in-band-lifetimes/impl/assoc-type.stderr b/src/test/ui/impl-header-lifetime-elision/assoc-type.stderr similarity index 100% rename from src/test/ui/in-band-lifetimes/impl/assoc-type.stderr rename to src/test/ui/impl-header-lifetime-elision/assoc-type.stderr diff --git a/src/test/ui/in-band-lifetimes/impl/dyn-trait.nll.stderr b/src/test/ui/impl-header-lifetime-elision/dyn-trait.nll.stderr similarity index 100% rename from src/test/ui/in-band-lifetimes/impl/dyn-trait.nll.stderr rename to src/test/ui/impl-header-lifetime-elision/dyn-trait.nll.stderr diff --git a/src/test/ui/in-band-lifetimes/impl/dyn-trait.rs b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs similarity index 96% rename from src/test/ui/in-band-lifetimes/impl/dyn-trait.rs rename to src/test/ui/impl-header-lifetime-elision/dyn-trait.rs index c27bbe77fbf..661bfa8bdcc 100644 --- a/src/test/ui/in-band-lifetimes/impl/dyn-trait.rs +++ b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs @@ -13,7 +13,7 @@ #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] use std::fmt::Debug; diff --git a/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr b/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr similarity index 100% rename from src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr rename to src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr diff --git a/src/test/ui/in-band-lifetimes/impl/path-elided.rs b/src/test/ui/impl-header-lifetime-elision/path-elided.rs similarity index 93% rename from src/test/ui/in-band-lifetimes/impl/path-elided.rs rename to src/test/ui/impl-header-lifetime-elision/path-elided.rs index 8a758b124ba..f88c899065c 100644 --- a/src/test/ui/in-band-lifetimes/impl/path-elided.rs +++ b/src/test/ui/impl-header-lifetime-elision/path-elided.rs @@ -9,7 +9,7 @@ // except according to those terms. #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait { } diff --git a/src/test/ui/in-band-lifetimes/impl/path-elided.stderr b/src/test/ui/impl-header-lifetime-elision/path-elided.stderr similarity index 100% rename from src/test/ui/in-band-lifetimes/impl/path-elided.stderr rename to src/test/ui/impl-header-lifetime-elision/path-elided.stderr diff --git a/src/test/ui/in-band-lifetimes/impl/path-underscore.rs b/src/test/ui/impl-header-lifetime-elision/path-underscore.rs similarity index 96% rename from src/test/ui/in-band-lifetimes/impl/path-underscore.rs rename to src/test/ui/impl-header-lifetime-elision/path-underscore.rs index 756991d97a5..38118f0d213 100644 --- a/src/test/ui/in-band-lifetimes/impl/path-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/path-underscore.rs @@ -14,7 +14,7 @@ #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait { } diff --git a/src/test/ui/in-band-lifetimes/impl/ref-underscore.rs b/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs similarity index 95% rename from src/test/ui/in-band-lifetimes/impl/ref-underscore.rs rename to src/test/ui/impl-header-lifetime-elision/ref-underscore.rs index 99708afff35..96a56aacd87 100644 --- a/src/test/ui/in-band-lifetimes/impl/ref-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/ref-underscore.rs @@ -14,7 +14,7 @@ #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait { } diff --git a/src/test/ui/in-band-lifetimes/impl/trait-elided.rs b/src/test/ui/impl-header-lifetime-elision/trait-elided.rs similarity index 93% rename from src/test/ui/in-band-lifetimes/impl/trait-elided.rs rename to src/test/ui/impl-header-lifetime-elision/trait-elided.rs index e0709ab6dd0..afdf2200d90 100644 --- a/src/test/ui/in-band-lifetimes/impl/trait-elided.rs +++ b/src/test/ui/impl-header-lifetime-elision/trait-elided.rs @@ -9,7 +9,7 @@ // except according to those terms. #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait<'a> { } diff --git a/src/test/ui/in-band-lifetimes/impl/trait-elided.stderr b/src/test/ui/impl-header-lifetime-elision/trait-elided.stderr similarity index 100% rename from src/test/ui/in-band-lifetimes/impl/trait-elided.stderr rename to src/test/ui/impl-header-lifetime-elision/trait-elided.stderr diff --git a/src/test/ui/in-band-lifetimes/impl/trait-underscore.rs b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs similarity index 96% rename from src/test/ui/in-band-lifetimes/impl/trait-underscore.rs rename to src/test/ui/impl-header-lifetime-elision/trait-underscore.rs index 971fd1fe759..98242ff6577 100644 --- a/src/test/ui/in-band-lifetimes/impl/trait-underscore.rs +++ b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs @@ -15,7 +15,7 @@ #![allow(warnings)] -#![feature(in_band_lifetimes)] +#![feature(impl_header_lifetime_elision)] trait MyTrait<'a> { } From 7398c3125b0b22fa95326a626e06ece9411d6522 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Fri, 3 Aug 2018 08:52:30 -0700 Subject: [PATCH 2/3] Fix the stage1 build --- src/librustc/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index bac511aac1f..842c0f5b489 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -70,6 +70,7 @@ #![feature(step_trait)] #![feature(integer_atomics)] #![feature(test)] +#![cfg_attr(not(stage0), feature(impl_header_lifetime_elision))] #![feature(in_band_lifetimes)] #![feature(macro_at_most_once_rep)] #![feature(inclusive_range_methods)] From 1c7af279aac534d179021b473f2c1667c3442cf6 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 4 Aug 2018 00:36:46 -0700 Subject: [PATCH 3/3] Remove in-band lifetimes from the 2018 edition As mentioned in the 2018-08-04 edition status update, these are postponed as lacking consensus to stabilize. --- src/libsyntax/feature_gate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 684de34e7db..7797e947ed7 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -381,7 +381,7 @@ declare_features! ( (active, crate_in_paths, "1.23.0", Some(45477), Some(Edition::Edition2018)), // In-band lifetime bindings (e.g. `fn foo(x: &'a u8) -> &'a u8`) - (active, in_band_lifetimes, "1.23.0", Some(44524), Some(Edition::Edition2018)), + (active, in_band_lifetimes, "1.23.0", Some(44524), None), // generic associated types (RFC 1598) (active, generic_associated_types, "1.23.0", Some(44265), None),