use abi::Abi;
use ast::{self, NodeId, PatKind, RangeEnd};
use attr;
-use codemap::{CodeMap, Spanned};
+use codemap::Spanned;
use syntax_pos::Span;
use errors::{DiagnosticBuilder, Handler, FatalError};
use visit::{self, FnKind, Visitor};
// Allows attributes on lifetime/type formal parameters in generics (RFC 1327)
(active, generic_param_attrs, "1.11.0", Some(34761)),
- // The #![windows_subsystem] attribute
- (active, windows_subsystem, "1.14.0", Some(37499)),
-
// Allows #[link(..., cfg(..))]
(active, link_cfg, "1.14.0", Some(37406)),
// `extern "x86-interrupt" fn()`
(active, abi_x86_interrupt, "1.17.0", Some(40180)),
+
// Allows the `catch {...}` expression
(active, catch_expr, "1.17.0", Some(31436)),
// See rust-lang/rfcs#1414. Allows code like `let x: &'static u32 = &42` to work.
(active, rvalue_static_promotion, "1.15.1", Some(38865)),
+
+ // Used to preserve symbols (see llvm.used)
+ (active, used, "1.18.0", Some(40289)),
);
declare_features! (
(accepted, static_recursion, "1.17.0", Some(29719)),
// pub(restricted) visibilities (RFC 1422)
(accepted, pub_restricted, "1.17.0", Some(32409)),
-
+ // The #![windows_subsystem] attribute
+ (accepted, windows_subsystem, "1.18.0", Some(37499)),
);
// If you change this, please modify src/doc/unstable-book as well. You must
// move that documentation into the relevant place in the other docs, and
"unwind_attributes",
"#[unwind] is experimental",
cfg_fn!(unwind_attributes))),
+ ("used", Whitelisted, Gated(
+ Stability::Unstable, "used",
+ "the `#[used]` attribute is an experimental feature",
+ cfg_fn!(used))),
// used in resolve
("prelude_import", Whitelisted, Gated(Stability::Unstable,
"unboxed_closures are still evolving",
cfg_fn!(unboxed_closures))),
- ("windows_subsystem", Whitelisted, Gated(Stability::Unstable,
- "windows_subsystem",
- "the windows subsystem attribute \
- is currently unstable",
- cfg_fn!(windows_subsystem))),
+ ("windows_subsystem", Whitelisted, Ungated),
("proc_macro_attribute", Normal, Gated(Stability::Unstable,
"proc_macro",
pub fn check_and_emit(&self, sess: &ParseSess, features: &Features) {
let (cfg, feature, has_feature) = GATED_CFGS[self.index];
- if !has_feature(features) && !sess.codemap().span_allows_unstable(self.span) {
+ if !has_feature(features) && !self.span.allows_unstable() {
let explain = format!("`cfg({})` is experimental and subject to change", cfg);
emit_feature_err(sess, feature, self.span, GateIssue::Language, &explain);
}
struct Context<'a> {
features: &'a Features,
parse_sess: &'a ParseSess,
- cm: &'a CodeMap,
plugin_attributes: &'a [(String, AttributeType)],
}
let (cx, has_feature, span, name, explain) = ($cx, $has_feature, $span, $name, $explain);
let has_feature: bool = has_feature(&$cx.features);
debug!("gate_feature(feature = {:?}, span = {:?}); has? {}", name, span, has_feature);
- if !has_feature && !cx.cm.span_allows_unstable(span) {
+ if !has_feature && !span.allows_unstable() {
emit_feature_err(cx.parse_sess, name, span, GateIssue::Language, explain);
}
}}
}
}
-pub fn check_attribute(attr: &ast::Attribute, parse_sess: &ParseSess,
- cm: &CodeMap, features: &Features) {
- let cx = Context {
- features: features, parse_sess: parse_sess,
- cm: cm, plugin_attributes: &[]
- };
+pub fn check_attribute(attr: &ast::Attribute, parse_sess: &ParseSess, features: &Features) {
+ let cx = Context { features: features, parse_sess: parse_sess, plugin_attributes: &[] };
cx.check_attribute(attr, true);
}
macro_rules! gate_feature_post {
($cx: expr, $feature: ident, $span: expr, $explain: expr) => {{
let (cx, span) = ($cx, $span);
- if !cx.context.cm.span_allows_unstable(span) {
+ if !span.allows_unstable() {
gate_feature!(cx.context, $feature, span, $explain)
}
}}
impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
fn visit_attribute(&mut self, attr: &ast::Attribute) {
- if !self.context.cm.span_allows_unstable(attr.span) {
+ if !attr.span.allows_unstable() {
// check for gated attributes
self.context.check_attribute(attr, false);
}
let ctx = Context {
features: features,
parse_sess: sess,
- cm: sess.codemap(),
plugin_attributes: plugin_attributes,
};
visit::walk_crate(&mut PostExpansionVisitor { context: &ctx }, krate);