Add feature gate
This commit is contained in:
@@ -1611,7 +1611,7 @@ impl Clean<Type> for ast::Ty {
|
||||
TyTypeof(..) => {
|
||||
panic!("Unimplemented type {:?}", self.node)
|
||||
},
|
||||
TyMac(..) => {
|
||||
TyMac(ref m) => {
|
||||
cx.tcx().sess.span_bug(m.span, "unexpanded type macro found during cleaning")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1555,6 +1555,7 @@ fn expand_and_rename_method(sig: ast::MethodSig, body: P<ast::Block>,
|
||||
pub fn expand_type(t: P<ast::Ty>, fld: &mut MacroExpander) -> P<ast::Ty> {
|
||||
let t = match t.node.clone() {
|
||||
ast::Ty_::TyMac(mac) => {
|
||||
if fld.cx.ecfg.features.unwrap().type_macros {
|
||||
let expanded_ty = match expand_mac_invoc(mac, t.span,
|
||||
|r| r.make_ty(),
|
||||
mark_ty,
|
||||
@@ -1575,9 +1576,18 @@ pub fn expand_type(t: P<ast::Ty>, fld: &mut MacroExpander) -> P<ast::Ty> {
|
||||
node: t.node,
|
||||
span: t.span,
|
||||
})
|
||||
} else {
|
||||
feature_gate::emit_feature_err(
|
||||
&fld.cx.parse_sess.span_diagnostic,
|
||||
"type_macros",
|
||||
t.span,
|
||||
"type macros are experimental (see tracking issue: 27336)");
|
||||
t
|
||||
}
|
||||
}
|
||||
_ => t
|
||||
};
|
||||
|
||||
fold::noop_fold_ty(t, fld)
|
||||
}
|
||||
|
||||
|
||||
@@ -169,6 +169,8 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Status)] = &[
|
||||
|
||||
// Allows associated type defaults
|
||||
("associated_type_defaults", "1.2.0", Active),
|
||||
// Allows macros to appear in the type position.
|
||||
("type_macros", "1.3.0", Active),
|
||||
];
|
||||
// (changing above list without updating src/doc/reference.md makes @cmr sad)
|
||||
|
||||
@@ -228,8 +230,7 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType)] = &[
|
||||
"no_std is experimental")),
|
||||
("lang", Gated("lang_items",
|
||||
"language items are subject to change")),
|
||||
("linkage", Gated("linkage",
|
||||
"the `linkage` attribute is experimental \
|
||||
("linkage", Gated("linkage", "the `linkage` attribute is experimental \
|
||||
and not portable across platforms")),
|
||||
("thread_local", Gated("thread_local",
|
||||
"`#[thread_local]` is an experimental feature, and does not \
|
||||
@@ -349,6 +350,7 @@ pub struct Features {
|
||||
pub const_fn: bool,
|
||||
pub static_recursion: bool,
|
||||
pub default_type_parameter_fallback: bool,
|
||||
pub type_macros: bool,
|
||||
}
|
||||
|
||||
impl Features {
|
||||
@@ -375,6 +377,7 @@ impl Features {
|
||||
const_fn: false,
|
||||
static_recursion: false,
|
||||
default_type_parameter_fallback: false,
|
||||
type_macros: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -878,6 +881,7 @@ fn check_crate_inner<F>(cm: &CodeMap, span_handler: &SpanHandler,
|
||||
const_fn: cx.has_feature("const_fn"),
|
||||
static_recursion: cx.has_feature("static_recursion"),
|
||||
default_type_parameter_fallback: cx.has_feature("default_type_parameter_fallback"),
|
||||
type_macros: cx.has_feature("type_macros"),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user