diff options
| -rw-r--r-- | src/librustc_driver/driver.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 14 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 5f2548a5504..89299c01199 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -606,7 +606,7 @@ pub fn phase_2_configure_and_expand(sess: &Session, feature_gated_cfgs.sort(); feature_gated_cfgs.dedup(); for cfg in &feature_gated_cfgs { - cfg.check_and_emit(sess.diagnostic(), &features); + cfg.check_and_emit(sess.diagnostic(), &features, sess.codemap()); } }); diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 390e8253dcf..caad7c6e7f5 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -454,10 +454,13 @@ impl PartialOrd for GatedCfgAttr { } impl GatedCfgAttr { - pub fn check_and_emit(&self, diagnostic: &Handler, features: &Features) { + pub fn check_and_emit(&self, + diagnostic: &Handler, + features: &Features, + codemap: &CodeMap) { match *self { GatedCfgAttr::GatedCfg(ref cfg) => { - cfg.check_and_emit(diagnostic, features); + cfg.check_and_emit(diagnostic, features, codemap); } GatedCfgAttr::GatedAttr(span) => { if !features.stmt_expr_attributes { @@ -484,9 +487,12 @@ impl GatedCfg { } }) } - fn check_and_emit(&self, diagnostic: &Handler, features: &Features) { + fn check_and_emit(&self, + diagnostic: &Handler, + features: &Features, + codemap: &CodeMap) { let (cfg, feature, has_feature) = GATED_CFGS[self.index]; - if !has_feature(features) { + if !has_feature(features) && !codemap.span_allows_unstable(self.span) { let explain = format!("`cfg({})` is experimental and subject to change", cfg); emit_feature_err(diagnostic, feature, self.span, GateIssue::Language, &explain); } |
