about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2018-08-03 00:08:44 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2018-08-03 00:08:44 -0700
commitce9d469a700682b164defabd15e6783595c7ea57 (patch)
treef024ec6017d59a88fc15744bb5c0e38901e1f271
parent7e8ca9f8bd8325398e76bc30ac09aab138bbb127 (diff)
downloadrust-ce9d469a700682b164defabd15e6783595c7ea57.tar.gz
rust-ce9d469a700682b164defabd15e6783595c7ea57.zip
Extract impl_header_lifetime_elision out of in_band_lifetimes
-rw-r--r--src/librustc/hir/lowering.rs14
-rw-r--r--src/libsyntax/feature_gate.rs4
-rw-r--r--src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.rs27
-rw-r--r--src/test/ui/feature-gate-impl_header_lifetime_elision-with-in_band.stderr15
-rw-r--r--src/test/ui/feature-gate-impl_header_lifetime_elision.rs (renamed from src/test/ui/feature-gate-in_band_lifetimes-impl.rs)0
-rw-r--r--src/test/ui/feature-gate-impl_header_lifetime_elision.stderr (renamed from src/test/ui/feature-gate-in_band_lifetimes-impl.stderr)4
-rw-r--r--src/test/ui/feature-gate-in_band_lifetimes.rs3
-rw-r--r--src/test/ui/feature-gate-in_band_lifetimes.stderr34
-rw-r--r--src/test/ui/impl-header-lifetime-elision/assoc-type.rs (renamed from src/test/ui/in-band-lifetimes/impl/assoc-type.rs)4
-rw-r--r--src/test/ui/impl-header-lifetime-elision/assoc-type.stderr (renamed from src/test/ui/in-band-lifetimes/impl/assoc-type.stderr)0
-rw-r--r--src/test/ui/impl-header-lifetime-elision/dyn-trait.nll.stderr (renamed from src/test/ui/in-band-lifetimes/impl/dyn-trait.nll.stderr)0
-rw-r--r--src/test/ui/impl-header-lifetime-elision/dyn-trait.rs (renamed from src/test/ui/in-band-lifetimes/impl/dyn-trait.rs)2
-rw-r--r--src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr (renamed from src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr)0
-rw-r--r--src/test/ui/impl-header-lifetime-elision/path-elided.rs (renamed from src/test/ui/in-band-lifetimes/impl/path-elided.rs)2
-rw-r--r--src/test/ui/impl-header-lifetime-elision/path-elided.stderr (renamed from src/test/ui/in-band-lifetimes/impl/path-elided.stderr)0
-rw-r--r--src/test/ui/impl-header-lifetime-elision/path-underscore.rs (renamed from src/test/ui/in-band-lifetimes/impl/path-underscore.rs)2
-rw-r--r--src/test/ui/impl-header-lifetime-elision/ref-underscore.rs (renamed from src/test/ui/in-band-lifetimes/impl/ref-underscore.rs)2
-rw-r--r--src/test/ui/impl-header-lifetime-elision/trait-elided.rs (renamed from src/test/ui/in-band-lifetimes/impl/trait-elided.rs)2
-rw-r--r--src/test/ui/impl-header-lifetime-elision/trait-elided.stderr (renamed from src/test/ui/in-band-lifetimes/impl/trait-elided.stderr)0
-rw-r--r--src/test/ui/impl-header-lifetime-elision/trait-underscore.rs (renamed from src/test/ui/in-band-lifetimes/impl/trait-underscore.rs)2
20 files changed, 86 insertions, 31 deletions
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<I:Iterator> 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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
index 3eb2ac1b008..3eb2ac1b008 100644
--- a/src/test/ui/feature-gate-in_band_lifetimes-impl.rs
+++ b/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
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
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
index 59b2cfd2226..59b2cfd2226 100644
--- a/src/test/ui/in-band-lifetimes/impl/assoc-type.stderr
+++ b/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
index f5d98e04ad8..f5d98e04ad8 100644
--- a/src/test/ui/in-band-lifetimes/impl/dyn-trait.nll.stderr
+++ b/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
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
index 3e54ebeb398..3e54ebeb398 100644
--- a/src/test/ui/in-band-lifetimes/impl/dyn-trait.stderr
+++ b/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
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
index 6c1d72411bf..6c1d72411bf 100644
--- a/src/test/ui/in-band-lifetimes/impl/path-elided.stderr
+++ b/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
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
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
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
index fe3ded8e04c..fe3ded8e04c 100644
--- a/src/test/ui/in-band-lifetimes/impl/trait-elided.stderr
+++ b/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
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> { }