Skip to content

Commit 79077f1

Browse files
committed
move GateIssue to rustc_feature & simplify emit_feature_err
1 parent 91fcd40 commit 79077f1

File tree

17 files changed

+159
-165
lines changed

17 files changed

+159
-165
lines changed

src/librustc/lint/levels.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,13 @@ impl<'a> LintLevelsBuilder<'a> {
232232
// don't have any lint names (`#[level(reason = "foo")]`)
233233
if let ast::LitKind::Str(rationale, _) = name_value.kind {
234234
if !self.sess.features_untracked().lint_reasons {
235-
feature_gate::emit_feature_err(
235+
feature_gate::feature_err(
236236
&self.sess.parse_sess,
237237
sym::lint_reasons,
238238
item.span,
239-
feature_gate::GateIssue::Language,
240239
"lint reasons are experimental"
241-
);
240+
)
241+
.emit();
242242
}
243243
reason = Some(rationale);
244244
} else {

src/librustc/middle/stability.rs

+14-10
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ use crate::ty::query::Providers;
1313
use crate::middle::privacy::AccessLevels;
1414
use crate::session::{DiagnosticMessageId, Session};
1515
use errors::DiagnosticBuilder;
16+
use rustc_feature::GateIssue;
1617
use syntax::symbol::{Symbol, sym};
1718
use syntax_pos::{Span, MultiSpan};
1819
use syntax::ast::{Attribute, CRATE_NODE_ID};
1920
use syntax::errors::Applicability;
20-
use syntax::feature_gate::{GateIssue, emit_feature_err};
21+
use syntax::feature_gate::{feature_err, feature_err_issue};
2122
use syntax::attr::{self, Stability, Deprecation, RustcDeprecation};
2223
use crate::ty::{self, TyCtxt};
2324
use crate::util::nodemap::{FxHashSet, FxHashMap};
@@ -512,9 +513,8 @@ pub fn report_unstable(
512513
if is_soft {
513514
soft_handler(lint::builtin::SOFT_UNSTABLE, span, &msg)
514515
} else {
515-
emit_feature_err(
516-
&sess.parse_sess, feature, span, GateIssue::Library(issue), &msg
517-
);
516+
feature_err_issue(&sess.parse_sess, feature, span, GateIssue::Library(issue), &msg)
517+
.emit();
518518
}
519519
}
520520
}
@@ -842,15 +842,19 @@ impl Visitor<'tcx> for Checker<'tcx> {
842842
let ty = self.tcx.type_of(def_id);
843843

844844
if adt_def.has_dtor(self.tcx) {
845-
emit_feature_err(&self.tcx.sess.parse_sess,
846-
sym::untagged_unions, item.span, GateIssue::Language,
847-
"unions with `Drop` implementations are unstable");
845+
feature_err(
846+
&self.tcx.sess.parse_sess, sym::untagged_unions, item.span,
847+
"unions with `Drop` implementations are unstable"
848+
)
849+
.emit();
848850
} else {
849851
let param_env = self.tcx.param_env(def_id);
850852
if !param_env.can_type_implement_copy(self.tcx, ty).is_ok() {
851-
emit_feature_err(&self.tcx.sess.parse_sess,
852-
sym::untagged_unions, item.span, GateIssue::Language,
853-
"unions with non-`Copy` fields are unstable");
853+
feature_err(
854+
&self.tcx.sess.parse_sess, sym::untagged_unions, item.span,
855+
"unions with non-`Copy` fields are unstable"
856+
)
857+
.emit();
854858
}
855859
}
856860
}

src/librustc_feature/lib.rs

+32-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ pub struct Feature {
4949
}
5050

5151
impl Feature {
52-
// FIXME(Centril): privatize again.
53-
pub fn issue(&self) -> Option<NonZeroU32> {
52+
fn issue(&self) -> Option<NonZeroU32> {
5453
self.issue.and_then(|i| NonZeroU32::new(i))
5554
}
5655
}
@@ -97,6 +96,37 @@ impl UnstableFeatures {
9796
}
9897
}
9998

99+
fn find_lang_feature_issue(feature: Symbol) -> Option<NonZeroU32> {
100+
if let Some(info) = ACTIVE_FEATURES.iter().find(|t| t.name == feature) {
101+
// FIXME (#28244): enforce that active features have issue numbers
102+
// assert!(info.issue().is_some())
103+
info.issue()
104+
} else {
105+
// search in Accepted, Removed, or Stable Removed features
106+
let found = ACCEPTED_FEATURES
107+
.iter()
108+
.chain(REMOVED_FEATURES)
109+
.chain(STABLE_REMOVED_FEATURES)
110+
.find(|t| t.name == feature);
111+
match found {
112+
Some(found) => found.issue(),
113+
None => panic!("feature `{}` is not declared anywhere", feature),
114+
}
115+
}
116+
}
117+
118+
pub enum GateIssue {
119+
Language,
120+
Library(Option<NonZeroU32>)
121+
}
122+
123+
pub fn find_feature_issue(feature: Symbol, issue: GateIssue) -> Option<NonZeroU32> {
124+
match issue {
125+
GateIssue::Language => find_lang_feature_issue(feature),
126+
GateIssue::Library(lib) => lib,
127+
}
128+
}
129+
100130
pub use accepted::ACCEPTED_FEATURES;
101131
pub use active::{ACTIVE_FEATURES, Features, INCOMPLETE_FEATURES};
102132
pub use removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};

src/librustc_metadata/native_libs.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rustc::util::nodemap::FxHashSet;
77
use rustc_target::spec::abi::Abi;
88
use syntax::attr;
99
use syntax::source_map::Span;
10-
use syntax::feature_gate::{self, GateIssue};
10+
use syntax::feature_gate::feature_err;
1111
use syntax::symbol::{kw, sym, Symbol};
1212
use syntax::{span_err, struct_span_err};
1313

@@ -158,27 +158,29 @@ impl Collector<'tcx> {
158158
}
159159
}
160160
if lib.cfg.is_some() && !self.tcx.features().link_cfg {
161-
feature_gate::emit_feature_err(&self.tcx.sess.parse_sess,
162-
sym::link_cfg,
163-
span.unwrap(),
164-
GateIssue::Language,
165-
"is unstable");
161+
feature_err(&self.tcx.sess.parse_sess, sym::link_cfg, span.unwrap(), "is unstable")
162+
.emit();
166163
}
167164
if lib.kind == cstore::NativeStaticNobundle &&
168-
!self.tcx.features().static_nobundle {
169-
feature_gate::emit_feature_err(&self.tcx.sess.parse_sess,
170-
sym::static_nobundle,
171-
span.unwrap_or_else(|| syntax_pos::DUMMY_SP),
172-
GateIssue::Language,
173-
"kind=\"static-nobundle\" is unstable");
165+
!self.tcx.features().static_nobundle
166+
{
167+
feature_err(
168+
&self.tcx.sess.parse_sess,
169+
sym::static_nobundle,
170+
span.unwrap_or_else(|| syntax_pos::DUMMY_SP),
171+
"kind=\"static-nobundle\" is unstable"
172+
)
173+
.emit();
174174
}
175175
if lib.kind == cstore::NativeRawDylib &&
176176
!self.tcx.features().raw_dylib {
177-
feature_gate::emit_feature_err(&self.tcx.sess.parse_sess,
178-
sym::raw_dylib,
179-
span.unwrap_or_else(|| syntax_pos::DUMMY_SP),
180-
GateIssue::Language,
181-
"kind=\"raw-dylib\" is unstable");
177+
feature_err(
178+
&self.tcx.sess.parse_sess,
179+
sym::raw_dylib,
180+
span.unwrap_or_else(|| syntax_pos::DUMMY_SP),
181+
"kind=\"raw-dylib\" is unstable"
182+
)
183+
.emit();
182184
}
183185
self.libs.push(lib);
184186
}

src/librustc_mir/transform/check_consts/ops.rs

+24-24
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc::hir::def_id::DefId;
44
use rustc::mir::BorrowKind;
55
use rustc::session::config::nightly_options;
66
use rustc::ty::TyCtxt;
7-
use syntax::feature_gate::{emit_feature_err, GateIssue};
7+
use syntax::feature_gate::feature_err;
88
use syntax::symbol::sym;
99
use syntax_pos::{Span, Symbol};
1010

@@ -222,13 +222,13 @@ impl NonConstOp for Panic {
222222
}
223223

224224
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
225-
emit_feature_err(
225+
feature_err(
226226
&item.tcx.sess.parse_sess,
227227
sym::const_panic,
228228
span,
229-
GateIssue::Language,
230229
&format!("panicking in {}s is unstable", item.const_kind()),
231-
);
230+
)
231+
.emit();
232232
}
233233
}
234234

@@ -240,13 +240,13 @@ impl NonConstOp for RawPtrComparison {
240240
}
241241

242242
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
243-
emit_feature_err(
243+
feature_err(
244244
&item.tcx.sess.parse_sess,
245245
sym::const_compare_raw_pointers,
246246
span,
247-
GateIssue::Language,
248247
&format!("comparing raw pointers inside {}", item.const_kind()),
249-
);
248+
)
249+
.emit();
250250
}
251251
}
252252

@@ -258,14 +258,14 @@ impl NonConstOp for RawPtrDeref {
258258
}
259259

260260
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
261-
emit_feature_err(
262-
&item.tcx.sess.parse_sess, sym::const_raw_ptr_deref,
263-
span, GateIssue::Language,
261+
feature_err(
262+
&item.tcx.sess.parse_sess, sym::const_raw_ptr_deref, span,
264263
&format!(
265264
"dereferencing raw pointers in {}s is unstable",
266265
item.const_kind(),
267266
),
268-
);
267+
)
268+
.emit();
269269
}
270270
}
271271

@@ -277,14 +277,14 @@ impl NonConstOp for RawPtrToIntCast {
277277
}
278278

279279
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
280-
emit_feature_err(
281-
&item.tcx.sess.parse_sess, sym::const_raw_ptr_to_usize_cast,
282-
span, GateIssue::Language,
280+
feature_err(
281+
&item.tcx.sess.parse_sess, sym::const_raw_ptr_to_usize_cast, span,
283282
&format!(
284283
"casting pointers to integers in {}s is unstable",
285284
item.const_kind(),
286285
),
287-
);
286+
)
287+
.emit();
288288
}
289289
}
290290

@@ -334,11 +334,11 @@ impl NonConstOp for Transmute {
334334
}
335335

336336
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
337-
emit_feature_err(
338-
&item.tcx.sess.parse_sess, sym::const_transmute,
339-
span, GateIssue::Language,
340-
&format!("The use of std::mem::transmute() \
341-
is gated in {}s", item.const_kind()));
337+
feature_err(
338+
&item.tcx.sess.parse_sess, sym::const_transmute, span,
339+
&format!("The use of std::mem::transmute() is gated in {}s", item.const_kind())
340+
)
341+
.emit();
342342
}
343343
}
344344

@@ -355,10 +355,10 @@ impl NonConstOp for UnionAccess {
355355
}
356356

357357
fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
358-
emit_feature_err(
359-
&item.tcx.sess.parse_sess, sym::const_fn_union,
360-
span, GateIssue::Language,
358+
feature_err(
359+
&item.tcx.sess.parse_sess, sym::const_fn_union, span,
361360
"unions in const fn are unstable",
362-
);
361+
)
362+
.emit();
363363
}
364364
}

src/librustc_parse/config.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use crate::validate_attr;
1212
use rustc_feature::Features;
1313
use syntax::attr::HasAttrs;
14-
use syntax::feature_gate::{feature_err, get_features, GateIssue};
14+
use syntax::feature_gate::{feature_err, get_features};
1515
use syntax::attr;
1616
use syntax::ast;
1717
use syntax::edition::Edition;
@@ -212,7 +212,6 @@ impl<'a> StripUnconfigured<'a> {
212212
let mut err = feature_err(self.sess,
213213
sym::stmt_expr_attributes,
214214
attr.span,
215-
GateIssue::Language,
216215
"attributes on expressions are experimental");
217216

218217
if attr.is_doc_comment() {

src/librustc_passes/check_const.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc::ty::TyCtxt;
1515
use rustc::ty::query::Providers;
1616
use rustc_feature::Features;
1717
use syntax::ast::Mutability;
18-
use syntax::feature_gate::{emit_feature_err, GateIssue};
18+
use syntax::feature_gate::feature_err;
1919
use syntax::span_err;
2020
use syntax_pos::{sym, Span};
2121
use rustc_error_codes::*;
@@ -141,13 +141,7 @@ impl<'tcx> CheckConstVisitor<'tcx> {
141141
| NonConstExpr::Match(hir::MatchSource::Normal)
142142
| NonConstExpr::Match(hir::MatchSource::IfDesugar { .. })
143143
| NonConstExpr::Match(hir::MatchSource::IfLetDesugar { .. })
144-
=> emit_feature_err(
145-
&self.tcx.sess.parse_sess,
146-
sym::const_if_match,
147-
span,
148-
GateIssue::Language,
149-
&msg
150-
),
144+
=> feature_err(&self.tcx.sess.parse_sess, sym::const_if_match, span, &msg).emit(),
151145

152146
_ => span_err!(self.tcx.sess, span, E0744, "{}", msg),
153147
}

src/librustc_resolve/macros.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_feature::is_builtin_attr_name;
1616
use syntax::ast::{self, NodeId, Ident};
1717
use syntax::attr::{self, StabilityLevel};
1818
use syntax::edition::Edition;
19-
use syntax::feature_gate::{emit_feature_err, GateIssue};
19+
use syntax::feature_gate::feature_err;
2020
use syntax::print::pprust;
2121
use syntax_expand::base::{self, InvocationRes, Indeterminate};
2222
use syntax_expand::base::SyntaxExtension;
@@ -346,13 +346,8 @@ impl<'a> Resolver<'a> {
346346
segment.ident.as_str().starts_with("rustc") {
347347
let msg =
348348
"attributes starting with `rustc` are reserved for use by the `rustc` compiler";
349-
emit_feature_err(
350-
&self.session.parse_sess,
351-
sym::rustc_attrs,
352-
segment.ident.span,
353-
GateIssue::Language,
354-
msg,
355-
);
349+
feature_err(&self.session.parse_sess, sym::rustc_attrs, segment.ident.span, msg)
350+
.emit();
356351
}
357352
}
358353

src/librustc_typeck/astconv.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::require_c_abi_if_c_variadic;
2323
use smallvec::SmallVec;
2424
use syntax::ast;
2525
use syntax::errors::pluralize;
26-
use syntax::feature_gate::{GateIssue, emit_feature_err};
26+
use syntax::feature_gate::feature_err;
2727
use syntax::util::lev_distance::find_best_match_for_name;
2828
use syntax::symbol::sym;
2929
use syntax_pos::{DUMMY_SP, Span, MultiSpan};
@@ -914,8 +914,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
914914
} else {
915915
"parenthetical notation is only stable when used with `Fn`-family traits"
916916
};
917-
emit_feature_err(&self.tcx().sess.parse_sess, sym::unboxed_closures,
918-
span, GateIssue::Language, msg);
917+
feature_err(&self.tcx().sess.parse_sess, sym::unboxed_closures, span, msg).emit();
919918
}
920919

921920
self.create_substs_for_ast_path(span,

src/librustc_typeck/check/coercion.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -644,13 +644,13 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
644644
}
645645

646646
if has_unsized_tuple_coercion && !self.tcx.features().unsized_tuple_coercion {
647-
feature_gate::emit_feature_err(
647+
feature_gate::feature_err(
648648
&self.tcx.sess.parse_sess,
649649
sym::unsized_tuple_coercion,
650650
self.cause.span,
651-
feature_gate::GateIssue::Language,
652651
"unsized tuple coercion is not stable enough for use and is subject to change",
653-
);
652+
)
653+
.emit();
654654
}
655655

656656
Ok(coercion)

0 commit comments

Comments
 (0)