Add universal_impl_trait feature gate

Move feature gate check to inside HIR lowering. Change error messages
and update tests.
This commit is contained in:
Christopher Vittal 2017-11-10 12:58:52 -05:00
parent 109f2dd36b
commit bdff9463a0
4 changed files with 32 additions and 5 deletions

View File

@ -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 => {

View File

@ -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");

View File

@ -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() {}

View File

@ -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() {}