pub fn expand_type(t: P<ast::Ty>, fld: &mut MacroExpander) -> P<ast::Ty> {
let t = match t.node.clone() {
ast::Ty_::TyMac(mac) => {
- let expanded_ty = match expand_mac_invoc(mac, t.span,
- |r| r.make_ty(),
- mark_ty,
- fld) {
- Some(ty) => ty,
- None => {
- return DummyResult::raw_ty(t.span);
- }
- };
-
- // Keep going, outside-in.
- //
- let fully_expanded = fld.fold_ty(expanded_ty);
- fld.cx.bt_pop();
+ if fld.cx.ecfg.features.unwrap().type_macros {
+ let expanded_ty = match expand_mac_invoc(mac, t.span,
+ |r| r.make_ty(),
+ mark_ty,
+ fld) {
+ Some(ty) => ty,
+ None => {
+ return DummyResult::raw_ty(t.span);
+ }
+ };
- fully_expanded.map(|t| ast::Ty {
- id: ast::DUMMY_NODE_ID,
- node: t.node,
- span: t.span,
- })
+ // Keep going, outside-in.
+ //
+ let fully_expanded = fld.fold_ty(expanded_ty);
+ fld.cx.bt_pop();
+
+ fully_expanded.map(|t| ast::Ty {
+ id: ast::DUMMY_NODE_ID,
+ 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)
}
// 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)
"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 \
pub const_fn: bool,
pub static_recursion: bool,
pub default_type_parameter_fallback: bool,
+ pub type_macros: bool,
}
impl Features {
const_fn: false,
static_recursion: false,
default_type_parameter_fallback: false,
+ type_macros: false,
}
}
}
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"),
}
}