about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorChristopher Vittal <christopher.vittal@gmail.com>2017-11-10 12:58:52 -0500
committerChristopher Vittal <christopher.vittal@gmail.com>2017-11-15 15:46:01 -0500
commitbdff9463a0afbbdcd52825ead6b6f9f1245652db (patch)
treec0fe98cd7611f0311268b9392a786e5990f0e21b /src
parent109f2dd36b38d0642246ad50101bba21f5c0fba9 (diff)
downloadrust-bdff9463a0afbbdcd52825ead6b6f9f1245652db.tar.gz
rust-bdff9463a0afbbdcd52825ead6b6f9f1245652db.zip
Add universal_impl_trait feature gate
Move feature gate check to inside HIR lowering. Change error messages
and update tests.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/hir/lowering.rs12
-rw-r--r--src/libsyntax/feature_gate.rs7
-rw-r--r--src/test/compile-fail/impl-trait/feature-gate-universal.rs16
-rw-r--r--src/test/compile-fail/impl-trait/feature-gate.rs2
4 files changed, 32 insertions, 5 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index ec5ca5c89ac..723f50faa85 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -771,9 +771,21 @@ impl<'a> LoweringContext<'a> {
                 use syntax::feature_gate::{emit_feature_err, GateIssue};
                 match itctx {
                     ImplTraitContext::Existential => {
+                        let has_feature = self.sess.features.borrow().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");
+                        }
                         hir::TyImplTraitExistential(self.lower_bounds(bounds, itctx))
                     },
                     ImplTraitContext::Universal(def_id) => {
+                        let has_feature = self.sess.features.borrow().universal_impl_trait;
+                        if !t.span.allows_unstable() && !has_feature {
+                            emit_feature_err(&self.sess.parse_sess, "universal_impl_trait",
+                                             t.span, GateIssue::Language,
+                                             "`impl Trait` in argument position is experimental");
+                        }
                         hir::TyImplTraitUniversal(def_id, self.lower_bounds(bounds, itctx))
                     },
                     ImplTraitContext::Disallowed => {
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index b6cb3ac1308..97eec3a21e9 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -275,6 +275,9 @@ declare_features! (
     // Allows `impl Trait` in function return types.
     (active, conservative_impl_trait, "1.12.0", Some(34511)),
 
+    // Allows `impl Trait` in function arguments.
+    (active, universal_impl_trait, "1.23.0", Some(34511)),
+
     // The `!` type
     (active, never_type, "1.13.0", Some(35121)),
 
@@ -1451,10 +1454,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
             ast::TyKind::BareFn(ref bare_fn_ty) => {
                 self.check_abi(bare_fn_ty.abi, ty.span);
             }
-            ast::TyKind::ImplTrait(..) => {
-                gate_feature_post!(&self, conservative_impl_trait, ty.span,
-                                   "`impl Trait` is experimental");
-            }
             ast::TyKind::Never => {
                 gate_feature_post!(&self, never_type, ty.span,
                                    "The `!` type is experimental");
diff --git a/src/test/compile-fail/impl-trait/feature-gate-universal.rs b/src/test/compile-fail/impl-trait/feature-gate-universal.rs
new file mode 100644
index 00000000000..e5bdf3a42eb
--- /dev/null
+++ b/src/test/compile-fail/impl-trait/feature-gate-universal.rs
@@ -0,0 +1,16 @@
+// 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.
+
+// gate-test-universal_impl_trait
+
+fn foo(x: impl std::fmt::Debug) { print!("{:?}", x); }
+//~^ ERROR `impl Trait` in argument position is experimental
+
+fn main() {}
diff --git a/src/test/compile-fail/impl-trait/feature-gate.rs b/src/test/compile-fail/impl-trait/feature-gate.rs
index f171b6becc4..d46a16450db 100644
--- a/src/test/compile-fail/impl-trait/feature-gate.rs
+++ b/src/test/compile-fail/impl-trait/feature-gate.rs
@@ -11,6 +11,6 @@
 // gate-test-conservative_impl_trait
 
 fn foo() -> impl Fn() { || {} }
-//~^ ERROR `impl Trait` is experimental
+//~^ ERROR `impl Trait` in return position is experimental
 
 fn main() {}