about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTaylor Cramer <cramertj@google.com>2018-03-21 18:32:44 -0700
committerTaylor Cramer <cramertj@google.com>2018-03-26 10:43:03 +0200
commit0f5b52e4a8d3004ef2d69b2ec7f410d4b2c9494c (patch)
tree817fd01d71545cf02b1d662698fcf07aa0c68b19
parentc393db67baf3a15ec61351ffb0e3811e07b8a467 (diff)
downloadrust-0f5b52e4a8d3004ef2d69b2ec7f410d4b2c9494c.tar.gz
rust-0f5b52e4a8d3004ef2d69b2ec7f410d4b2c9494c.zip
Stabilize conservative_impl_trait
-rw-r--r--src/Cargo.lock27
-rw-r--r--src/doc/unstable-book/src/language-features/conservative-impl-trait.md66
-rw-r--r--src/libcore/tests/lib.rs2
-rw-r--r--src/librustc/diagnostics.rs8
-rw-r--r--src/librustc/hir/lowering.rs11
-rw-r--r--src/librustc/lib.rs2
-rw-r--r--src/librustc_data_structures/lib.rs2
-rw-r--r--src/librustc_errors/lib.rs2
-rw-r--r--src/librustc_incremental/lib.rs2
-rw-r--r--src/librustc_metadata/lib.rs2
-rw-r--r--src/librustc_mir/lib.rs2
-rw-r--r--src/librustc_trans/lib.rs2
-rw-r--r--src/librustc_trans_utils/lib.rs2
-rw-r--r--src/librustc_typeck/lib.rs2
-rw-r--r--src/libsyntax/feature_gate.rs5
-rw-r--r--src/test/compile-fail/conservative_impl_trait.rs1
-rw-r--r--src/test/compile-fail/impl-trait/infinite-impl-trait-issue-38064.rs2
-rw-r--r--src/test/compile-fail/impl-trait/must_outlive_least_region_or_bound.rs2
-rw-r--r--src/test/compile-fail/impl-trait/needs_least_region_or_bound.rs2
-rw-r--r--src/test/compile-fail/impl-trait/no-trait.rs2
-rw-r--r--src/test/compile-fail/impl-trait/type_parameters_captured.rs2
-rw-r--r--src/test/compile-fail/impl-trait/where-allowed.rs2
-rw-r--r--src/test/compile-fail/issue-32995-2.rs1
-rw-r--r--src/test/compile-fail/issue-35668.rs2
-rw-r--r--src/test/compile-fail/issue-36379.rs2
-rw-r--r--src/test/compile-fail/private-inferred-type.rs1
-rw-r--r--src/test/compile-fail/private-type-in-interface.rs1
-rw-r--r--src/test/incremental/hashes/function_interfaces.rs1
-rw-r--r--src/test/run-pass/conservative_impl_trait.rs2
-rw-r--r--src/test/run-pass/generator/auxiliary/xcrate-reachable.rs2
-rw-r--r--src/test/run-pass/generator/auxiliary/xcrate.rs2
-rw-r--r--src/test/run-pass/generator/issue-44197.rs2
-rw-r--r--src/test/run-pass/generator/iterator-count.rs2
-rw-r--r--src/test/run-pass/generator/xcrate-reachable.rs2
-rw-r--r--src/test/run-pass/impl-trait/auto-trait-leak.rs2
-rw-r--r--src/test/run-pass/impl-trait/auxiliary/xcrate.rs2
-rw-r--r--src/test/run-pass/impl-trait/equality.rs2
-rw-r--r--src/test/run-pass/impl-trait/example-calendar.rs3
-rw-r--r--src/test/run-pass/impl-trait/example-st.rs2
-rw-r--r--src/test/run-pass/impl-trait/issue-42479.rs2
-rw-r--r--src/test/run-pass/impl-trait/lifetimes.rs2
-rw-r--r--src/test/run-pass/in-band-lifetimes.rs2
-rw-r--r--src/test/run-pass/issue-36792.rs1
-rw-r--r--src/test/run-pass/issue-46959.rs1
-rw-r--r--src/test/rustdoc/issue-43869.rs2
-rw-r--r--src/test/ui/casts-differing-anon.rs2
-rw-r--r--src/test/ui/casts-differing-anon.stderr2
-rw-r--r--src/test/ui/error-codes/E0657.rs1
-rw-r--r--src/test/ui/error-codes/E0657.stderr4
-rw-r--r--src/test/ui/feature-gate-conservative_impl_trait.rs14
-rw-r--r--src/test/ui/feature-gate-conservative_impl_trait.stderr11
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak.rs2
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak.stderr22
-rw-r--r--src/test/ui/impl-trait/equality.rs2
-rw-r--r--src/test/ui/impl-trait/region-escape-via-bound-contravariant-closure.rs1
-rw-r--r--src/test/ui/impl-trait/region-escape-via-bound-contravariant.rs1
-rw-r--r--src/test/ui/impl-trait/region-escape-via-bound.rs1
-rw-r--r--src/test/ui/impl-trait/region-escape-via-bound.stderr6
-rw-r--r--src/test/ui/impl_trait_projections.rs2
-rw-r--r--src/test/ui/issue-35869.rs2
-rw-r--r--src/test/ui/issue-35869.stderr8
-rw-r--r--src/test/ui/nested_impl_trait.rs2
-rw-r--r--src/test/ui/nested_impl_trait.stderr12
-rw-r--r--src/test/ui/nll/ty-outlives/impl-trait-captures.rs1
-rw-r--r--src/test/ui/nll/ty-outlives/impl-trait-captures.stderr4
-rw-r--r--src/test/ui/nll/ty-outlives/impl-trait-outlives.rs1
-rw-r--r--src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr8
m---------src/tools/clippy35
68 files changed, 77 insertions, 258 deletions
diff --git a/src/Cargo.lock b/src/Cargo.lock
index 371e505e9be..c45f18360b9 100644
--- a/src/Cargo.lock
+++ b/src/Cargo.lock
@@ -271,11 +271,11 @@ dependencies = [
 
 [[package]]
 name = "clippy"
-version = "0.0.188"
+version = "0.0.189"
 dependencies = [
  "cargo_metadata 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "clippy-mini-macro-test 0.2.0",
- "clippy_lints 0.0.188",
+ "clippy_lints 0.0.189",
  "compiletest_rs 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "derive-new 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -291,27 +291,7 @@ version = "0.2.0"
 
 [[package]]
 name = "clippy_lints"
-version = "0.0.188"
-dependencies = [
- "if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
- "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "clippy_lints"
 version = "0.0.189"
-source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "if_chain 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1419,7 +1399,7 @@ version = "0.126.0"
 dependencies = [
  "cargo 0.27.0",
  "cargo_metadata 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "clippy_lints 0.0.189 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clippy_lints 0.0.189",
  "env_logger 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "json 0.11.12 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2638,7 +2618,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
 "checksum chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c20ebe0b2b08b0aeddba49c609fe7957ba2e33449882cb186a180bc60682fa9"
 "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
-"checksum clippy_lints 0.0.189 (registry+https://github.com/rust-lang/crates.io-index)" = "fef652630bbf8c5e89601220abd000f5057e8fa9db608484b5ebaad98e9bce53"
 "checksum cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "56d741ea7a69e577f6d06b36b7dff4738f680593dc27a701ffa8506b73ce28bb"
 "checksum commoncrypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007"
 "checksum commoncrypto-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2"
diff --git a/src/doc/unstable-book/src/language-features/conservative-impl-trait.md b/src/doc/unstable-book/src/language-features/conservative-impl-trait.md
deleted file mode 100644
index 0be6a321103..00000000000
--- a/src/doc/unstable-book/src/language-features/conservative-impl-trait.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# `conservative_impl_trait`
-
-The tracking issue for this feature is: [#34511]
-
-[#34511]: https://github.com/rust-lang/rust/issues/34511
-
-------------------------
-
-The `conservative_impl_trait` feature allows a conservative form of abstract
-return types.
-
-Abstract return types allow a function to hide a concrete return type behind a
-trait interface similar to trait objects, while still generating the same
-statically dispatched code as with concrete types.
-
-## Examples
-
-```rust
-#![feature(conservative_impl_trait)]
-
-fn even_iter() -> impl Iterator<Item=u32> {
-    (0..).map(|n| n * 2)
-}
-
-fn main() {
-    let first_four_even_numbers = even_iter().take(4).collect::<Vec<_>>();
-    assert_eq!(first_four_even_numbers, vec![0, 2, 4, 6]);
-}
-```
-
-## Background
-
-In today's Rust, you can write function signatures like:
-
-````rust,ignore
-fn consume_iter_static<I: Iterator<Item=u8>>(iter: I) { }
-
-fn consume_iter_dynamic(iter: Box<Iterator<Item=u8>>) { }
-````
-
-In both cases, the function does not depend on the exact type of the argument.
-The type held is "abstract", and is assumed only to satisfy a trait bound.
-
-* In the `_static` version using generics, each use of the function is
-  specialized to a concrete, statically-known type, giving static dispatch,
-  inline layout, and other performance wins.
-* In the `_dynamic` version using trait objects, the concrete argument type is
-  only known at runtime using a vtable.
-
-On the other hand, while you can write:
-
-````rust,ignore
-fn produce_iter_dynamic() -> Box<Iterator<Item=u8>> { }
-````
-
-...but you _cannot_ write something like:
-
-````rust,ignore
-fn produce_iter_static() -> Iterator<Item=u8> { }
-````
-
-That is, in today's Rust, abstract return types can only be written using trait
-objects, which can be a significant performance penalty. This RFC proposes
-"unboxed abstract types" as a way of achieving signatures like
-`produce_iter_static`. Like generics, unboxed abstract types guarantee static
-dispatch and inline data layout.
diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs
index e9a8113ef10..1c71669abb1 100644
--- a/src/libcore/tests/lib.rs
+++ b/src/libcore/tests/lib.rs
@@ -27,7 +27,7 @@
 #![cfg_attr(stage0, feature(inclusive_range_syntax))]
 #![feature(iterator_try_fold)]
 #![feature(iterator_flatten)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(iter_rfind)]
 #![feature(iter_rfold)]
 #![feature(iterator_repeat_with)]
diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs
index e22e2b55703..f95c355012a 100644
--- a/src/librustc/diagnostics.rs
+++ b/src/librustc/diagnostics.rs
@@ -1789,8 +1789,6 @@ allowed as function return types.
 Erroneous code example:
 
 ```compile_fail,E0562
-#![feature(conservative_impl_trait)]
-
 fn main() {
     let count_to_ten: impl Iterator<Item=usize> = 0..10;
     // error: `impl Trait` not allowed outside of function and inherent method
@@ -1804,8 +1802,6 @@ fn main() {
 Make sure `impl Trait` only appears in return-type position.
 
 ```
-#![feature(conservative_impl_trait)]
-
 fn count_to_n(n: usize) -> impl Iterator<Item=usize> {
     0..n
 }
@@ -2081,8 +2077,6 @@ appear within the `impl Trait` itself.
 Erroneous code example:
 
 ```compile-fail,E0909
-#![feature(conservative_impl_trait)]
-
 use std::cell::Cell;
 
 trait Trait<'a> { }
@@ -2109,8 +2103,6 @@ type. For example, changing the return type to `impl Trait<'y> + 'x`
 would work:
 
 ```
-#![feature(conservative_impl_trait)]
-
 use std::cell::Cell;
 
 trait Trait<'a> { }
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index 2ae102fbef0..536d682566a 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -1108,20 +1108,9 @@ impl<'a> LoweringContext<'a> {
                 hir::TyTraitObject(bounds, lifetime_bound)
             }
             TyKind::ImplTrait(ref bounds) => {
-                use syntax::feature_gate::{emit_feature_err, GateIssue};
                 let span = t.span;
                 match itctx {
                     ImplTraitContext::Existential => {
-                        let has_feature = self.sess.features_untracked().conservative_impl_trait;
-                        if !t.span.allows_unstable() && !has_feature {
-                            emit_feature_err(
-                                &self.sess.parse_sess,
-                                "conservative_impl_trait",
-                                t.span,
-                                GateIssue::Language,
-                                "`impl Trait` in return position is experimental",
-                            );
-                        }
                         let def_index = self.resolver.definitions().opt_def_index(t.id).unwrap();
                         let hir_bounds = self.lower_bounds(bounds, itctx);
                         let (lifetimes, lifetime_defs) =
diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs
index d133352de07..1bb903c0627 100644
--- a/src/librustc/lib.rs
+++ b/src/librustc/lib.rs
@@ -43,7 +43,7 @@
 
 #![feature(box_patterns)]
 #![feature(box_syntax)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(const_fn)]
 #![cfg_attr(stage0, feature(copy_closures, clone_closures))]
 #![feature(core_intrinsics)]
diff --git a/src/librustc_data_structures/lib.rs b/src/librustc_data_structures/lib.rs
index 05bd3ae845f..ff869072871 100644
--- a/src/librustc_data_structures/lib.rs
+++ b/src/librustc_data_structures/lib.rs
@@ -28,7 +28,7 @@
 #![feature(unsize)]
 #![feature(i128_type)]
 #![feature(i128)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(specialization)]
 #![feature(optin_builtin_traits)]
 #![feature(underscore_lifetimes)]
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index dcbea793ba6..1152c9c574e 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -17,7 +17,7 @@
 #![allow(unused_attributes)]
 #![feature(range_contains)]
 #![cfg_attr(unix, feature(libc))]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(i128_type)]
 #![feature(optin_builtin_traits)]
 
diff --git a/src/librustc_incremental/lib.rs b/src/librustc_incremental/lib.rs
index d7ccf9d5562..6adb950fe4e 100644
--- a/src/librustc_incremental/lib.rs
+++ b/src/librustc_incremental/lib.rs
@@ -15,7 +15,7 @@
       html_root_url = "https://doc.rust-lang.org/nightly/")]
 #![deny(warnings)]
 
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(fs_read_write)]
 #![feature(i128_type)]
 #![cfg_attr(stage0, feature(inclusive_range_syntax))]
diff --git a/src/librustc_metadata/lib.rs b/src/librustc_metadata/lib.rs
index 85099667449..902dd87c574 100644
--- a/src/librustc_metadata/lib.rs
+++ b/src/librustc_metadata/lib.rs
@@ -14,7 +14,7 @@
 #![deny(warnings)]
 
 #![feature(box_patterns)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(fs_read_write)]
 #![feature(i128_type)]
 #![feature(libc)]
diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs
index ff35412ea5b..750839f8b00 100644
--- a/src/librustc_mir/lib.rs
+++ b/src/librustc_mir/lib.rs
@@ -21,7 +21,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
 #![feature(box_patterns)]
 #![feature(box_syntax)]
 #![feature(catch_expr)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(const_fn)]
 #![feature(core_intrinsics)]
 #![feature(decl_macro)]
diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs
index 9f654c8ab29..38adc603628 100644
--- a/src/librustc_trans/lib.rs
+++ b/src/librustc_trans/lib.rs
@@ -31,7 +31,7 @@
 #![feature(quote)]
 #![feature(rustc_diagnostic_macros)]
 #![cfg_attr(stage0, feature(slice_patterns))]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![feature(optin_builtin_traits)]
 #![feature(inclusive_range_fields)]
 
diff --git a/src/librustc_trans_utils/lib.rs b/src/librustc_trans_utils/lib.rs
index 0af5f467934..9e4addd1ed1 100644
--- a/src/librustc_trans_utils/lib.rs
+++ b/src/librustc_trans_utils/lib.rs
@@ -24,7 +24,7 @@
 #![feature(i128_type)]
 #![feature(quote)]
 #![feature(rustc_diagnostic_macros)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 
 extern crate ar;
 extern crate flate2;
diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs
index 5a7de6b56b5..e466ef39234 100644
--- a/src/librustc_typeck/lib.rs
+++ b/src/librustc_typeck/lib.rs
@@ -75,7 +75,7 @@ This API is completely unstable and subject to change.
 #![cfg_attr(stage0, feature(advanced_slice_patterns))]
 #![feature(box_patterns)]
 #![feature(box_syntax)]
-#![feature(conservative_impl_trait)]
+#![cfg_attr(stage0, feature(conservative_impl_trait))]
 #![cfg_attr(stage0, feature(copy_closures, clone_closures))]
 #![feature(crate_visibility_modifier)]
 #![feature(from_ref)]
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index db900ed6e35..1bb369b551d 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -276,9 +276,6 @@ declare_features! (
     // Allows cfg(target_has_atomic = "...").
     (active, cfg_target_has_atomic, "1.9.0", Some(32976), None),
 
-    // Allows `impl Trait` in function return types.
-    (active, conservative_impl_trait, "1.12.0", Some(34511), None),
-
     // Allows exhaustive pattern matching on types that contain uninhabited types.
     (active, exhaustive_patterns, "1.13.0", None, None),
 
@@ -565,6 +562,8 @@ declare_features! (
     (accepted, copy_closures, "1.26.0", Some(44490), None),
     // Allows `impl Trait` in function arguments.
     (accepted, universal_impl_trait, "1.26.0", Some(34511), None),
+    // Allows `impl Trait` in function return types.
+    (accepted, conservative_impl_trait, "1.26.0", Some(34511), None),
 );
 
 // If you change this, please modify src/doc/unstable-book as well. You must
diff --git a/src/test/compile-fail/conservative_impl_trait.rs b/src/test/compile-fail/conservative_impl_trait.rs
index 7fb0ec52f29..30895bce357 100644
--- a/src/test/compile-fail/conservative_impl_trait.rs
+++ b/src/test/compile-fail/conservative_impl_trait.rs
@@ -10,7 +10,6 @@
 
 // #39872, #39553
 
-#![feature(conservative_impl_trait)]
 fn will_ice(something: &u32) -> impl Iterator<Item = &u32> {
     //~^ ERROR the trait bound `(): std::iter::Iterator` is not satisfied [E0277]
 }
diff --git a/src/test/compile-fail/impl-trait/infinite-impl-trait-issue-38064.rs b/src/test/compile-fail/impl-trait/infinite-impl-trait-issue-38064.rs
index abde9689bd6..653ef1723e0 100644
--- a/src/test/compile-fail/impl-trait/infinite-impl-trait-issue-38064.rs
+++ b/src/test/compile-fail/impl-trait/infinite-impl-trait-issue-38064.rs
@@ -15,8 +15,6 @@
 
 // error-pattern:overflow evaluating the requirement `impl Quux`
 
-#![feature(conservative_impl_trait)]
-
 trait Quux {}
 
 fn foo() -> impl Quux {
diff --git a/src/test/compile-fail/impl-trait/must_outlive_least_region_or_bound.rs b/src/test/compile-fail/impl-trait/must_outlive_least_region_or_bound.rs
index 0eb99ca0fc3..537fc975bcf 100644
--- a/src/test/compile-fail/impl-trait/must_outlive_least_region_or_bound.rs
+++ b/src/test/compile-fail/impl-trait/must_outlive_least_region_or_bound.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 use std::fmt::Debug;
 
 fn elided(x: &i32) -> impl Copy { x }
diff --git a/src/test/compile-fail/impl-trait/needs_least_region_or_bound.rs b/src/test/compile-fail/impl-trait/needs_least_region_or_bound.rs
index 2a06580fe60..6c0a0b800ce 100644
--- a/src/test/compile-fail/impl-trait/needs_least_region_or_bound.rs
+++ b/src/test/compile-fail/impl-trait/needs_least_region_or_bound.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 use std::fmt::Debug;
 
 trait MultiRegionTrait<'a, 'b> {}
diff --git a/src/test/compile-fail/impl-trait/no-trait.rs b/src/test/compile-fail/impl-trait/no-trait.rs
index ce61c5bf63d..5299ba297d0 100644
--- a/src/test/compile-fail/impl-trait/no-trait.rs
+++ b/src/test/compile-fail/impl-trait/no-trait.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 fn f() -> impl 'static {} //~ ERROR at least one trait must be specified
 
 fn main() {}
diff --git a/src/test/compile-fail/impl-trait/type_parameters_captured.rs b/src/test/compile-fail/impl-trait/type_parameters_captured.rs
index c6ff762b905..7c3430ab90e 100644
--- a/src/test/compile-fail/impl-trait/type_parameters_captured.rs
+++ b/src/test/compile-fail/impl-trait/type_parameters_captured.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 use std::fmt::Debug;
 
 trait Any {}
diff --git a/src/test/compile-fail/impl-trait/where-allowed.rs b/src/test/compile-fail/impl-trait/where-allowed.rs
index c93bcf7f390..038eacaf110 100644
--- a/src/test/compile-fail/impl-trait/where-allowed.rs
+++ b/src/test/compile-fail/impl-trait/where-allowed.rs
@@ -10,7 +10,7 @@
 
 //! A simple test for testing many permutations of allowedness of
 //! impl Trait
-#![feature(conservative_impl_trait, dyn_trait)]
+#![feature(dyn_trait)]
 use std::fmt::Debug;
 
 // Allowed
diff --git a/src/test/compile-fail/issue-32995-2.rs b/src/test/compile-fail/issue-32995-2.rs
index 0e917ad95d9..18424fcc9e0 100644
--- a/src/test/compile-fail/issue-32995-2.rs
+++ b/src/test/compile-fail/issue-32995-2.rs
@@ -8,7 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
 #![allow(unused)]
 
 fn main() {
diff --git a/src/test/compile-fail/issue-35668.rs b/src/test/compile-fail/issue-35668.rs
index c9323db054c..17fd77b6df3 100644
--- a/src/test/compile-fail/issue-35668.rs
+++ b/src/test/compile-fail/issue-35668.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 fn func<'a, T>(a: &'a [T]) -> impl Iterator<Item=&'a T> {
     a.iter().map(|a| a*a)
     //~^ ERROR binary operation `*` cannot be applied to type `&T`
diff --git a/src/test/compile-fail/issue-36379.rs b/src/test/compile-fail/issue-36379.rs
index 2f513b034c3..b20765815e0 100644
--- a/src/test/compile-fail/issue-36379.rs
+++ b/src/test/compile-fail/issue-36379.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, rustc_attrs)]
+#![feature(rustc_attrs)]
 
 fn _test() -> impl Default { }
 
diff --git a/src/test/compile-fail/private-inferred-type.rs b/src/test/compile-fail/private-inferred-type.rs
index 351dc6b776b..5af8b063c16 100644
--- a/src/test/compile-fail/private-inferred-type.rs
+++ b/src/test/compile-fail/private-inferred-type.rs
@@ -9,7 +9,6 @@
 // except according to those terms.
 
 #![feature(associated_consts)]
-#![feature(conservative_impl_trait)]
 #![feature(decl_macro)]
 #![allow(private_in_public)]
 
diff --git a/src/test/compile-fail/private-type-in-interface.rs b/src/test/compile-fail/private-type-in-interface.rs
index eb8c40a7dd5..1842790a140 100644
--- a/src/test/compile-fail/private-type-in-interface.rs
+++ b/src/test/compile-fail/private-type-in-interface.rs
@@ -10,7 +10,6 @@
 
 // aux-build:private-inferred-type.rs
 
-#![feature(conservative_impl_trait)]
 #![allow(warnings)]
 
 extern crate private_inferred_type as ext;
diff --git a/src/test/incremental/hashes/function_interfaces.rs b/src/test/incremental/hashes/function_interfaces.rs
index abe0586efcd..6c4e11be1e4 100644
--- a/src/test/incremental/hashes/function_interfaces.rs
+++ b/src/test/incremental/hashes/function_interfaces.rs
@@ -22,7 +22,6 @@
 
 
 #![allow(warnings)]
-#![feature(conservative_impl_trait)]
 #![feature(intrinsics)]
 #![feature(linkage)]
 #![feature(rustc_attrs)]
diff --git a/src/test/run-pass/conservative_impl_trait.rs b/src/test/run-pass/conservative_impl_trait.rs
index 30090018e29..14e1ca612c0 100644
--- a/src/test/run-pass/conservative_impl_trait.rs
+++ b/src/test/run-pass/conservative_impl_trait.rs
@@ -10,8 +10,6 @@
 
 // #39665
 
-#![feature(conservative_impl_trait)]
-
 fn batches(n: &u32) -> impl Iterator<Item=&u32> {
     std::iter::once(n)
 }
diff --git a/src/test/run-pass/generator/auxiliary/xcrate-reachable.rs b/src/test/run-pass/generator/auxiliary/xcrate-reachable.rs
index a6a2a2d081e..91e43537cc2 100644
--- a/src/test/run-pass/generator/auxiliary/xcrate-reachable.rs
+++ b/src/test/run-pass/generator/auxiliary/xcrate-reachable.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, generators, generator_trait)]
+#![feature(generators, generator_trait)]
 
 use std::ops::Generator;
 
diff --git a/src/test/run-pass/generator/auxiliary/xcrate.rs b/src/test/run-pass/generator/auxiliary/xcrate.rs
index f6878e64fbf..fcfe0b754b6 100644
--- a/src/test/run-pass/generator/auxiliary/xcrate.rs
+++ b/src/test/run-pass/generator/auxiliary/xcrate.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(generators, generator_trait, conservative_impl_trait)]
+#![feature(generators, generator_trait)]
 
 use std::ops::Generator;
 
diff --git a/src/test/run-pass/generator/issue-44197.rs b/src/test/run-pass/generator/issue-44197.rs
index 8ce4fc6affa..272b7eb7bfd 100644
--- a/src/test/run-pass/generator/issue-44197.rs
+++ b/src/test/run-pass/generator/issue-44197.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, generators, generator_trait)]
+#![feature(generators, generator_trait)]
 
 use std::ops::{ Generator, GeneratorState };
 
diff --git a/src/test/run-pass/generator/iterator-count.rs b/src/test/run-pass/generator/iterator-count.rs
index 654b18928c0..3564ddaa806 100644
--- a/src/test/run-pass/generator/iterator-count.rs
+++ b/src/test/run-pass/generator/iterator-count.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(generators, generator_trait, conservative_impl_trait)]
+#![feature(generators, generator_trait)]
 
 use std::ops::{GeneratorState, Generator};
 
diff --git a/src/test/run-pass/generator/xcrate-reachable.rs b/src/test/run-pass/generator/xcrate-reachable.rs
index 8eeb0133144..2fc39ba1869 100644
--- a/src/test/run-pass/generator/xcrate-reachable.rs
+++ b/src/test/run-pass/generator/xcrate-reachable.rs
@@ -10,7 +10,7 @@
 
 // aux-build:xcrate-reachable.rs
 
-#![feature(conservative_impl_trait, generator_trait)]
+#![feature(generator_trait)]
 
 extern crate xcrate_reachable as foo;
 
diff --git a/src/test/run-pass/impl-trait/auto-trait-leak.rs b/src/test/run-pass/impl-trait/auto-trait-leak.rs
index 011d910c5a5..62fbae7b40c 100644
--- a/src/test/run-pass/impl-trait/auto-trait-leak.rs
+++ b/src/test/run-pass/impl-trait/auto-trait-leak.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 // Fast path, main can see the concrete type returned.
 fn before() -> impl FnMut(i32) {
     let mut p = Box::new(0);
diff --git a/src/test/run-pass/impl-trait/auxiliary/xcrate.rs b/src/test/run-pass/impl-trait/auxiliary/xcrate.rs
index e4f525a9826..c27a2dd89d5 100644
--- a/src/test/run-pass/impl-trait/auxiliary/xcrate.rs
+++ b/src/test/run-pass/impl-trait/auxiliary/xcrate.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 // NOTE commented out due to issue #45994
 //pub fn fourway_add(a: i32) -> impl Fn(i32) -> impl Fn(i32) -> impl Fn(i32) -> i32 {
 //    move |b| move |c| move |d| a + b + c + d
diff --git a/src/test/run-pass/impl-trait/equality.rs b/src/test/run-pass/impl-trait/equality.rs
index ceed454e5ad..034d3d7c80f 100644
--- a/src/test/run-pass/impl-trait/equality.rs
+++ b/src/test/run-pass/impl-trait/equality.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, specialization)]
+#![feature(specialization)]
 
 trait Foo: std::fmt::Debug + Eq {}
 
diff --git a/src/test/run-pass/impl-trait/example-calendar.rs b/src/test/run-pass/impl-trait/example-calendar.rs
index d1e2b471d9a..b1db2030717 100644
--- a/src/test/run-pass/impl-trait/example-calendar.rs
+++ b/src/test/run-pass/impl-trait/example-calendar.rs
@@ -11,8 +11,7 @@
 // revisions: normal nll
 //[nll] compile-flags: -Znll -Zborrowck=mir
 
-#![feature(conservative_impl_trait,
-           fn_traits,
+#![feature(fn_traits,
            step_trait,
            unboxed_closures,
            copy_closures,
diff --git a/src/test/run-pass/impl-trait/example-st.rs b/src/test/run-pass/impl-trait/example-st.rs
index e9326ed286a..a06bde7f532 100644
--- a/src/test/run-pass/impl-trait/example-st.rs
+++ b/src/test/run-pass/impl-trait/example-st.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 struct State;
 type Error = ();
 
diff --git a/src/test/run-pass/impl-trait/issue-42479.rs b/src/test/run-pass/impl-trait/issue-42479.rs
index 629948a5dc4..df7a6c13092 100644
--- a/src/test/run-pass/impl-trait/issue-42479.rs
+++ b/src/test/run-pass/impl-trait/issue-42479.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 use std::iter::once;
 
 struct Foo {
diff --git a/src/test/run-pass/impl-trait/lifetimes.rs b/src/test/run-pass/impl-trait/lifetimes.rs
index c589e23f950..1b50ceefbe1 100644
--- a/src/test/run-pass/impl-trait/lifetimes.rs
+++ b/src/test/run-pass/impl-trait/lifetimes.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, underscore_lifetimes)]
+#![feature(underscore_lifetimes)]
 #![allow(warnings)]
 
 use std::fmt::Debug;
diff --git a/src/test/run-pass/in-band-lifetimes.rs b/src/test/run-pass/in-band-lifetimes.rs
index b5b73675ca7..6edd0d686ef 100644
--- a/src/test/run-pass/in-band-lifetimes.rs
+++ b/src/test/run-pass/in-band-lifetimes.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 #![allow(warnings)]
-#![feature(in_band_lifetimes, conservative_impl_trait)]
+#![feature(in_band_lifetimes)]
 
 fn foo(x: &'x u8) -> &'x u8 { x }
 fn foo2(x: &'a u8, y: &u8) -> &'a u8 { x }
diff --git a/src/test/run-pass/issue-36792.rs b/src/test/run-pass/issue-36792.rs
index faf983f6ecb..f2755ec3f84 100644
--- a/src/test/run-pass/issue-36792.rs
+++ b/src/test/run-pass/issue-36792.rs
@@ -8,7 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
 fn foo() -> impl Copy {
     foo
 }
diff --git a/src/test/run-pass/issue-46959.rs b/src/test/run-pass/issue-46959.rs
index 876b8c0a1d3..7f050c055b0 100644
--- a/src/test/run-pass/issue-46959.rs
+++ b/src/test/run-pass/issue-46959.rs
@@ -8,7 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
 #![deny(non_camel_case_types)]
 
 #[allow(dead_code)]
diff --git a/src/test/rustdoc/issue-43869.rs b/src/test/rustdoc/issue-43869.rs
index 554c71500cc..a5ed3d892ce 100644
--- a/src/test/rustdoc/issue-43869.rs
+++ b/src/test/rustdoc/issue-43869.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 pub fn g() -> impl Iterator<Item=u8> {
     Some(1u8).into_iter()
 }
diff --git a/src/test/ui/casts-differing-anon.rs b/src/test/ui/casts-differing-anon.rs
index 74c8ff370f9..05a03d3b179 100644
--- a/src/test/ui/casts-differing-anon.rs
+++ b/src/test/ui/casts-differing-anon.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 use std::fmt;
 
 fn foo() -> Box<impl fmt::Debug+?Sized> {
diff --git a/src/test/ui/casts-differing-anon.stderr b/src/test/ui/casts-differing-anon.stderr
index acbff4f73c3..dac24af671c 100644
--- a/src/test/ui/casts-differing-anon.stderr
+++ b/src/test/ui/casts-differing-anon.stderr
@@ -1,5 +1,5 @@
 error[E0606]: casting `*mut impl std::fmt::Debug+?Sized` as `*mut impl std::fmt::Debug+?Sized` is invalid
-  --> $DIR/casts-differing-anon.rs:33:13
+  --> $DIR/casts-differing-anon.rs:31:13
    |
 LL |     b_raw = f_raw as *mut _; //~ ERROR is invalid
    |             ^^^^^^^^^^^^^^^
diff --git a/src/test/ui/error-codes/E0657.rs b/src/test/ui/error-codes/E0657.rs
index 31b3acd86ef..c23aa40ee37 100644
--- a/src/test/ui/error-codes/E0657.rs
+++ b/src/test/ui/error-codes/E0657.rs
@@ -8,7 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 #![allow(warnings)]
-#![feature(conservative_impl_trait)]
 
 trait Id<T> {}
 trait Lt<'a> {}
diff --git a/src/test/ui/error-codes/E0657.stderr b/src/test/ui/error-codes/E0657.stderr
index f0529142023..737ae3a163a 100644
--- a/src/test/ui/error-codes/E0657.stderr
+++ b/src/test/ui/error-codes/E0657.stderr
@@ -1,11 +1,11 @@
 error[E0657]: `impl Trait` can only capture lifetimes bound at the fn or impl level
-  --> $DIR/E0657.rs:20:31
+  --> $DIR/E0657.rs:19:31
    |
 LL |     -> Box<for<'a> Id<impl Lt<'a>>>
    |                               ^^
 
 error[E0657]: `impl Trait` can only capture lifetimes bound at the fn or impl level
-  --> $DIR/E0657.rs:29:35
+  --> $DIR/E0657.rs:28:35
    |
 LL |         -> Box<for<'a> Id<impl Lt<'a>>>
    |                                   ^^
diff --git a/src/test/ui/feature-gate-conservative_impl_trait.rs b/src/test/ui/feature-gate-conservative_impl_trait.rs
deleted file mode 100644
index 7a3ae639bfc..00000000000
--- a/src/test/ui/feature-gate-conservative_impl_trait.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 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.
-
-fn foo() -> impl Fn() { || {} }
-//~^ ERROR `impl Trait` in return position is experimental
-
-fn main() {}
diff --git a/src/test/ui/feature-gate-conservative_impl_trait.stderr b/src/test/ui/feature-gate-conservative_impl_trait.stderr
deleted file mode 100644
index 5400226450b..00000000000
--- a/src/test/ui/feature-gate-conservative_impl_trait.stderr
+++ /dev/null
@@ -1,11 +0,0 @@
-error[E0658]: `impl Trait` in return position is experimental (see issue #34511)
-  --> $DIR/feature-gate-conservative_impl_trait.rs:11:13
-   |
-LL | fn foo() -> impl Fn() { || {} }
-   |             ^^^^^^^^^
-   |
-   = help: add #![feature(conservative_impl_trait)] to the crate attributes to enable
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/impl-trait/auto-trait-leak.rs b/src/test/ui/impl-trait/auto-trait-leak.rs
index 5a6aac43ec7..99a7dd5e785 100644
--- a/src/test/ui/impl-trait/auto-trait-leak.rs
+++ b/src/test/ui/impl-trait/auto-trait-leak.rs
@@ -10,8 +10,6 @@
 
 // ignore-tidy-linelength
 
-#![feature(conservative_impl_trait)]
-
 use std::cell::Cell;
 use std::rc::Rc;
 
diff --git a/src/test/ui/impl-trait/auto-trait-leak.stderr b/src/test/ui/impl-trait/auto-trait-leak.stderr
index 71ca8675db4..ca639f1076d 100644
--- a/src/test/ui/impl-trait/auto-trait-leak.stderr
+++ b/src/test/ui/impl-trait/auto-trait-leak.stderr
@@ -1,56 +1,56 @@
 error[E0277]: the trait bound `std::rc::Rc<std::cell::Cell<i32>>: std::marker::Send` is not satisfied in `impl std::ops::Fn<(i32,)>`
-  --> $DIR/auto-trait-leak.rs:27:5
+  --> $DIR/auto-trait-leak.rs:25:5
    |
 LL |     send(before());
    |     ^^^^ `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely
    |
    = help: within `impl std::ops::Fn<(i32,)>`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::cell::Cell<i32>>`
-   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak.rs:21:5: 21:22 p:std::rc::Rc<std::cell::Cell<i32>>]`
+   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak.rs:19:5: 19:22 p:std::rc::Rc<std::cell::Cell<i32>>]`
    = note: required because it appears within the type `impl std::ops::Fn<(i32,)>`
 note: required by `send`
-  --> $DIR/auto-trait-leak.rs:24:1
+  --> $DIR/auto-trait-leak.rs:22:1
    |
 LL | fn send<T: Send>(_: T) {}
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0277]: the trait bound `std::rc::Rc<std::cell::Cell<i32>>: std::marker::Send` is not satisfied in `impl std::ops::Fn<(i32,)>`
-  --> $DIR/auto-trait-leak.rs:30:5
+  --> $DIR/auto-trait-leak.rs:28:5
    |
 LL |     send(after());
    |     ^^^^ `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely
    |
    = help: within `impl std::ops::Fn<(i32,)>`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::cell::Cell<i32>>`
-   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak.rs:38:5: 38:22 p:std::rc::Rc<std::cell::Cell<i32>>]`
+   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak.rs:36:5: 36:22 p:std::rc::Rc<std::cell::Cell<i32>>]`
    = note: required because it appears within the type `impl std::ops::Fn<(i32,)>`
 note: required by `send`
-  --> $DIR/auto-trait-leak.rs:24:1
+  --> $DIR/auto-trait-leak.rs:22:1
    |
 LL | fn send<T: Send>(_: T) {}
    | ^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0391]: cyclic dependency detected
-  --> $DIR/auto-trait-leak.rs:44:1
+  --> $DIR/auto-trait-leak.rs:42:1
    |
 LL | fn cycle1() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^ cyclic reference
    |
 note: the cycle begins when processing `cycle1`...
-  --> $DIR/auto-trait-leak.rs:44:1
+  --> $DIR/auto-trait-leak.rs:42:1
    |
 LL | fn cycle1() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 note: ...which then requires processing `cycle2::{{impl-Trait}}`...
-  --> $DIR/auto-trait-leak.rs:52:16
+  --> $DIR/auto-trait-leak.rs:50:16
    |
 LL | fn cycle2() -> impl Clone {
    |                ^^^^^^^^^^
 note: ...which then requires processing `cycle2`...
-  --> $DIR/auto-trait-leak.rs:52:1
+  --> $DIR/auto-trait-leak.rs:50:1
    |
 LL | fn cycle2() -> impl Clone {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 note: ...which then requires processing `cycle1::{{impl-Trait}}`...
-  --> $DIR/auto-trait-leak.rs:44:16
+  --> $DIR/auto-trait-leak.rs:42:16
    |
 LL | fn cycle1() -> impl Clone {
    |                ^^^^^^^^^^
diff --git a/src/test/ui/impl-trait/equality.rs b/src/test/ui/impl-trait/equality.rs
index 9d9d4cef311..b65e477f21f 100644
--- a/src/test/ui/impl-trait/equality.rs
+++ b/src/test/ui/impl-trait/equality.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait, specialization)]
+#![feature(specialization)]
 
 trait Foo: Copy + ToString {}
 
diff --git a/src/test/ui/impl-trait/region-escape-via-bound-contravariant-closure.rs b/src/test/ui/impl-trait/region-escape-via-bound-contravariant-closure.rs
index f554efe9036..78ae922c751 100644
--- a/src/test/ui/impl-trait/region-escape-via-bound-contravariant-closure.rs
+++ b/src/test/ui/impl-trait/region-escape-via-bound-contravariant-closure.rs
@@ -18,7 +18,6 @@
 // run-pass
 
 #![allow(dead_code)]
-#![feature(conservative_impl_trait)]
 #![feature(in_band_lifetimes)]
 #![feature(nll)]
 
diff --git a/src/test/ui/impl-trait/region-escape-via-bound-contravariant.rs b/src/test/ui/impl-trait/region-escape-via-bound-contravariant.rs
index 416bdae5178..972461c2ffd 100644
--- a/src/test/ui/impl-trait/region-escape-via-bound-contravariant.rs
+++ b/src/test/ui/impl-trait/region-escape-via-bound-contravariant.rs
@@ -18,7 +18,6 @@
 // run-pass
 
 #![allow(dead_code)]
-#![feature(conservative_impl_trait)]
 #![feature(in_band_lifetimes)]
 #![feature(nll)]
 
diff --git a/src/test/ui/impl-trait/region-escape-via-bound.rs b/src/test/ui/impl-trait/region-escape-via-bound.rs
index 38c18ce6104..e73f15606dc 100644
--- a/src/test/ui/impl-trait/region-escape-via-bound.rs
+++ b/src/test/ui/impl-trait/region-escape-via-bound.rs
@@ -14,7 +14,6 @@
 // See https://github.com/rust-lang/rust/issues/46541 for more details.
 
 #![allow(dead_code)]
-#![feature(conservative_impl_trait)]
 #![feature(in_band_lifetimes)]
 #![feature(nll)]
 
diff --git a/src/test/ui/impl-trait/region-escape-via-bound.stderr b/src/test/ui/impl-trait/region-escape-via-bound.stderr
index 5659fee9bed..4281a4c10ad 100644
--- a/src/test/ui/impl-trait/region-escape-via-bound.stderr
+++ b/src/test/ui/impl-trait/region-escape-via-bound.stderr
@@ -1,11 +1,11 @@
 error[E0909]: hidden type for `impl Trait` captures lifetime that does not appear in bounds
-  --> $DIR/region-escape-via-bound.rs:27:29
+  --> $DIR/region-escape-via-bound.rs:26:29
    |
 LL | fn foo(x: Cell<&'x u32>) -> impl Trait<'y>
    |                             ^^^^^^^^^^^^^^
    |
-note: hidden type `std::cell::Cell<&'x u32>` captures the lifetime 'x as defined on the function body at 27:1
-  --> $DIR/region-escape-via-bound.rs:27:1
+note: hidden type `std::cell::Cell<&'x u32>` captures the lifetime 'x as defined on the function body at 26:1
+  --> $DIR/region-escape-via-bound.rs:26:1
    |
 LL | / fn foo(x: Cell<&'x u32>) -> impl Trait<'y>
 LL | |     //~^ ERROR hidden type for `impl Trait` captures lifetime that does not appear in bounds [E0909]
diff --git a/src/test/ui/impl_trait_projections.rs b/src/test/ui/impl_trait_projections.rs
index 05e88bf848d..6a727942271 100644
--- a/src/test/ui/impl_trait_projections.rs
+++ b/src/test/ui/impl_trait_projections.rs
@@ -7,7 +7,7 @@
 // <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.
-#![feature(dyn_trait, conservative_impl_trait)]
+#![feature(dyn_trait)]
 
 use std::fmt::Debug;
 use std::option;
diff --git a/src/test/ui/issue-35869.rs b/src/test/ui/issue-35869.rs
index 17ee62aed1b..7bab22edcf6 100644
--- a/src/test/ui/issue-35869.rs
+++ b/src/test/ui/issue-35869.rs
@@ -8,8 +8,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(conservative_impl_trait)]
-
 trait Foo {
     fn foo(_: fn(u8) -> ());
     fn bar(_: Option<u8>);
diff --git a/src/test/ui/issue-35869.stderr b/src/test/ui/issue-35869.stderr
index fa971c111a4..1930dd5bbcb 100644
--- a/src/test/ui/issue-35869.stderr
+++ b/src/test/ui/issue-35869.stderr
@@ -1,5 +1,5 @@
 error[E0053]: method `foo` has an incompatible type for trait
-  --> $DIR/issue-35869.rs:23:15
+  --> $DIR/issue-35869.rs:21:15
    |
 LL |     fn foo(_: fn(u8) -> ());
    |               ------------ type in trait
@@ -11,7 +11,7 @@ LL |     fn foo(_: fn(u16) -> ()) {}
               found type `fn(fn(u16))`
 
 error[E0053]: method `bar` has an incompatible type for trait
-  --> $DIR/issue-35869.rs:25:15
+  --> $DIR/issue-35869.rs:23:15
    |
 LL |     fn bar(_: Option<u8>);
    |               ---------- type in trait
@@ -23,7 +23,7 @@ LL |     fn bar(_: Option<u16>) {}
               found type `fn(std::option::Option<u16>)`
 
 error[E0053]: method `baz` has an incompatible type for trait
-  --> $DIR/issue-35869.rs:27:15
+  --> $DIR/issue-35869.rs:25:15
    |
 LL |     fn baz(_: (u8, u16));
    |               --------- type in trait
@@ -35,7 +35,7 @@ LL |     fn baz(_: (u16, u16)) {}
               found type `fn((u16, u16))`
 
 error[E0053]: method `qux` has an incompatible type for trait
-  --> $DIR/issue-35869.rs:29:17
+  --> $DIR/issue-35869.rs:27:17
    |
 LL |     fn qux() -> u8;
    |                 -- type in trait
diff --git a/src/test/ui/nested_impl_trait.rs b/src/test/ui/nested_impl_trait.rs
index 0fb1222d797..be0454472dd 100644
--- a/src/test/ui/nested_impl_trait.rs
+++ b/src/test/ui/nested_impl_trait.rs
@@ -7,8 +7,6 @@
 // <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.
-#![feature(conservative_impl_trait)]
-
 use std::fmt::Debug;
 
 fn fine(x: impl Into<u32>) -> impl Into<u32> { x }
diff --git a/src/test/ui/nested_impl_trait.stderr b/src/test/ui/nested_impl_trait.stderr
index 10d767db8d3..ee53194e2b4 100644
--- a/src/test/ui/nested_impl_trait.stderr
+++ b/src/test/ui/nested_impl_trait.stderr
@@ -1,5 +1,5 @@
 error[E0666]: nested `impl Trait` is not allowed
-  --> $DIR/nested_impl_trait.rs:16:56
+  --> $DIR/nested_impl_trait.rs:14:56
    |
 LL | fn bad_in_ret_position(x: impl Into<u32>) -> impl Into<impl Debug> { x }
    |                                              ----------^^^^^^^^^^-
@@ -8,7 +8,7 @@ LL | fn bad_in_ret_position(x: impl Into<u32>) -> impl Into<impl Debug> { x }
    |                                              outer `impl Trait`
 
 error[E0666]: nested `impl Trait` is not allowed
-  --> $DIR/nested_impl_trait.rs:19:42
+  --> $DIR/nested_impl_trait.rs:17:42
    |
 LL | fn bad_in_fn_syntax(x: fn() -> impl Into<impl Debug>) {}
    |                                ----------^^^^^^^^^^-
@@ -17,7 +17,7 @@ LL | fn bad_in_fn_syntax(x: fn() -> impl Into<impl Debug>) {}
    |                                outer `impl Trait`
 
 error[E0666]: nested `impl Trait` is not allowed
-  --> $DIR/nested_impl_trait.rs:23:37
+  --> $DIR/nested_impl_trait.rs:21:37
    |
 LL | fn bad_in_arg_position(_: impl Into<impl Debug>) { }
    |                           ----------^^^^^^^^^^-
@@ -26,7 +26,7 @@ LL | fn bad_in_arg_position(_: impl Into<impl Debug>) { }
    |                           outer `impl Trait`
 
 error[E0666]: nested `impl Trait` is not allowed
-  --> $DIR/nested_impl_trait.rs:28:44
+  --> $DIR/nested_impl_trait.rs:26:44
    |
 LL |     fn bad(x: impl Into<u32>) -> impl Into<impl Debug> { x }
    |                                  ----------^^^^^^^^^^-
@@ -35,13 +35,13 @@ LL |     fn bad(x: impl Into<u32>) -> impl Into<impl Debug> { x }
    |                                  outer `impl Trait`
 
 error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
-  --> $DIR/nested_impl_trait.rs:19:32
+  --> $DIR/nested_impl_trait.rs:17:32
    |
 LL | fn bad_in_fn_syntax(x: fn() -> impl Into<impl Debug>) {}
    |                                ^^^^^^^^^^^^^^^^^^^^^
 
 error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
-  --> $DIR/nested_impl_trait.rs:36:42
+  --> $DIR/nested_impl_trait.rs:34:42
    |
 LL | fn allowed_in_ret_type() -> impl Fn() -> impl Into<u32> {
    |                                          ^^^^^^^^^^^^^^
diff --git a/src/test/ui/nll/ty-outlives/impl-trait-captures.rs b/src/test/ui/nll/ty-outlives/impl-trait-captures.rs
index 850cd1e7336..571bd9fd76e 100644
--- a/src/test/ui/nll/ty-outlives/impl-trait-captures.rs
+++ b/src/test/ui/nll/ty-outlives/impl-trait-captures.rs
@@ -11,7 +11,6 @@
 // compile-flags:-Znll -Zborrowck=mir -Zverbose
 
 #![allow(warnings)]
-#![feature(conservative_impl_trait)]
 
 trait Foo<'a> {
 }
diff --git a/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr b/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr
index bfa58bfc807..92e4f72da3a 100644
--- a/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr
+++ b/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr
@@ -1,11 +1,11 @@
 warning: not reporting region error due to -Znll
-  --> $DIR/impl-trait-captures.rs:22:5
+  --> $DIR/impl-trait-captures.rs:21:5
    |
 LL |     x
    |     ^
 
 error[E0621]: explicit lifetime required in the type of `x`
-  --> $DIR/impl-trait-captures.rs:22:5
+  --> $DIR/impl-trait-captures.rs:21:5
    |
 LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> {
    |               - consider changing the type of `x` to `&ReEarlyBound(0, 'a) T`
diff --git a/src/test/ui/nll/ty-outlives/impl-trait-outlives.rs b/src/test/ui/nll/ty-outlives/impl-trait-outlives.rs
index 135805a7339..2e0671f1a51 100644
--- a/src/test/ui/nll/ty-outlives/impl-trait-outlives.rs
+++ b/src/test/ui/nll/ty-outlives/impl-trait-outlives.rs
@@ -11,7 +11,6 @@
 // compile-flags:-Znll -Zborrowck=mir -Zverbose
 
 #![allow(warnings)]
-#![feature(conservative_impl_trait)]
 
 use std::fmt::Debug;
 
diff --git a/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr b/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr
index f29d2233e70..2b90d53774e 100644
--- a/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr
+++ b/src/test/ui/nll/ty-outlives/impl-trait-outlives.stderr
@@ -1,17 +1,17 @@
 warning: not reporting region error due to -Znll
-  --> $DIR/impl-trait-outlives.rs:18:35
+  --> $DIR/impl-trait-outlives.rs:17:35
    |
 LL | fn no_region<'a, T>(x: Box<T>) -> impl Debug + 'a
    |                                   ^^^^^^^^^^^^^^^
 
 warning: not reporting region error due to -Znll
-  --> $DIR/impl-trait-outlives.rs:34:42
+  --> $DIR/impl-trait-outlives.rs:33:42
    |
 LL | fn wrong_region<'a, 'b, T>(x: Box<T>) -> impl Debug + 'a
    |                                          ^^^^^^^^^^^^^^^
 
 error[E0309]: the parameter type `T` may not live long enough
-  --> $DIR/impl-trait-outlives.rs:23:5
+  --> $DIR/impl-trait-outlives.rs:22:5
    |
 LL |     x
    |     ^
@@ -19,7 +19,7 @@ LL |     x
    = help: consider adding an explicit lifetime bound `T: ReEarlyBound(0, 'a)`...
 
 error[E0309]: the parameter type `T` may not live long enough
-  --> $DIR/impl-trait-outlives.rs:39:5
+  --> $DIR/impl-trait-outlives.rs:38:5
    |
 LL |     x
    |     ^
diff --git a/src/tools/clippy b/src/tools/clippy
-Subproject 4edd140e57cce900fa930e1439bab469f5bbce4
+Subproject eafd09010815da43302ac947afee45b0f5219e6