diff options
| author | Christopher Vittal <christopher.vittal@gmail.com> | 2017-11-10 12:58:52 -0500 |
|---|---|---|
| committer | Christopher Vittal <christopher.vittal@gmail.com> | 2017-11-15 15:46:01 -0500 |
| commit | bdff9463a0afbbdcd52825ead6b6f9f1245652db (patch) | |
| tree | c0fe98cd7611f0311268b9392a786e5990f0e21b /src | |
| parent | 109f2dd36b38d0642246ad50101bba21f5c0fba9 (diff) | |
| download | rust-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.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 7 | ||||
| -rw-r--r-- | src/test/compile-fail/impl-trait/feature-gate-universal.rs | 16 | ||||
| -rw-r--r-- | src/test/compile-fail/impl-trait/feature-gate.rs | 2 |
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() {} |
