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};
|
use syntax::feature_gate::{emit_feature_err, GateIssue};
|
||||||
match itctx {
|
match itctx {
|
||||||
ImplTraitContext::Existential => {
|
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))
|
hir::TyImplTraitExistential(self.lower_bounds(bounds, itctx))
|
||||||
},
|
},
|
||||||
ImplTraitContext::Universal(def_id) => {
|
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))
|
hir::TyImplTraitUniversal(def_id, self.lower_bounds(bounds, itctx))
|
||||||
},
|
},
|
||||||
ImplTraitContext::Disallowed => {
|
ImplTraitContext::Disallowed => {
|
||||||
|
@ -275,6 +275,9 @@ declare_features! (
|
|||||||
// Allows `impl Trait` in function return types.
|
// Allows `impl Trait` in function return types.
|
||||||
(active, conservative_impl_trait, "1.12.0", Some(34511)),
|
(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
|
// The `!` type
|
||||||
(active, never_type, "1.13.0", Some(35121)),
|
(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) => {
|
ast::TyKind::BareFn(ref bare_fn_ty) => {
|
||||||
self.check_abi(bare_fn_ty.abi, ty.span);
|
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 => {
|
ast::TyKind::Never => {
|
||||||
gate_feature_post!(&self, never_type, ty.span,
|
gate_feature_post!(&self, never_type, ty.span,
|
||||||
"The `!` type is experimental");
|
"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
|
// gate-test-conservative_impl_trait
|
||||||
|
|
||||||
fn foo() -> impl Fn() { || {} }
|
fn foo() -> impl Fn() { || {} }
|
||||||
//~^ ERROR `impl Trait` is experimental
|
//~^ ERROR `impl Trait` in return position is experimental
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user