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:
parent
109f2dd36b
commit
bdff9463a0
@ -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 => {
|
||||
|
@ -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");
|
||||
|
16
src/test/compile-fail/impl-trait/feature-gate-universal.rs
Normal file
16
src/test/compile-fail/impl-trait/feature-gate-universal.rs
Normal 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() {}
|
@ -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() {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user