diff options
| author | Jared Roesch <roeschinc@gmail.com> | 2015-07-28 09:00:32 -0700 |
|---|---|---|
| committer | Jared Roesch <roeschinc@gmail.com> | 2015-08-04 16:05:07 -0700 |
| commit | 15e7aa79f5280047a34e47628fb50c3eb3c898ad (patch) | |
| tree | eb51b90108465e517b574bb07ee0bd30825999dd /src/libsyntax | |
| parent | 0bb5a1a8249e3c5b97b4e60a2ab37cc5a2300306 (diff) | |
| download | rust-15e7aa79f5280047a34e47628fb50c3eb3c898ad.tar.gz rust-15e7aa79f5280047a34e47628fb50c3eb3c898ad.zip | |
Add feature gate
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 48 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 8 |
2 files changed, 35 insertions, 21 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index cd340fc9189..aadc3cfbafe 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -1555,29 +1555,39 @@ 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) => { - 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) } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 945e457a77b..02764215612 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -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"), } } |
