Skip to content

Commit c29fe81

Browse files
committed
move maybe_report_invalid_custom_discriminants to feature_gate
1 parent e369d87 commit c29fe81

File tree

2 files changed

+50
-55
lines changed

2 files changed

+50
-55
lines changed

src/libsyntax/feature_gate/check.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ use super::builtin_attrs::{AttributeGate, BUILTIN_ATTRIBUTE_MAP};
55

66
use crate::ast::{
77
self, AssocTyConstraint, AssocTyConstraintKind, NodeId, GenericParam, GenericParamKind,
8-
PatKind, RangeEnd,
8+
PatKind, RangeEnd, VariantData,
99
};
1010
use crate::attr::{self, check_builtin_attribute};
1111
use crate::source_map::Spanned;
1212
use crate::edition::{ALL_EDITIONS, Edition};
1313
use crate::visit::{self, FnKind, Visitor};
1414
use crate::parse::{token, ParseSess};
15-
use crate::parse::parser::Parser;
1615
use crate::symbol::{Symbol, sym};
1716
use crate::tokenstream::TokenTree;
1817

@@ -246,6 +245,51 @@ impl<'a> PostExpansionVisitor<'a> {
246245
Abi::System => {}
247246
}
248247
}
248+
249+
fn maybe_report_invalid_custom_discriminants(&self, variants: &[ast::Variant]) {
250+
let has_fields = variants.iter().any(|variant| match variant.data {
251+
VariantData::Tuple(..) | VariantData::Struct(..) => true,
252+
VariantData::Unit(..) => false,
253+
});
254+
255+
let discriminant_spans = variants.iter().filter(|variant| match variant.data {
256+
VariantData::Tuple(..) | VariantData::Struct(..) => false,
257+
VariantData::Unit(..) => true,
258+
})
259+
.filter_map(|variant| variant.disr_expr.as_ref().map(|c| c.value.span))
260+
.collect::<Vec<_>>();
261+
262+
if !discriminant_spans.is_empty() && has_fields {
263+
let mut err = feature_err(
264+
self.parse_sess,
265+
sym::arbitrary_enum_discriminant,
266+
discriminant_spans.clone(),
267+
crate::feature_gate::GateIssue::Language,
268+
"custom discriminant values are not allowed in enums with tuple or struct variants",
269+
);
270+
for sp in discriminant_spans {
271+
err.span_label(sp, "disallowed custom discriminant");
272+
}
273+
for variant in variants.iter() {
274+
match &variant.data {
275+
VariantData::Struct(..) => {
276+
err.span_label(
277+
variant.span,
278+
"struct variant defined here",
279+
);
280+
}
281+
VariantData::Tuple(..) => {
282+
err.span_label(
283+
variant.span,
284+
"tuple variant defined here",
285+
);
286+
}
287+
VariantData::Unit(..) => {}
288+
}
289+
}
290+
err.emit();
291+
}
292+
}
249293
}
250294

251295
impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
@@ -353,7 +397,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
353397

354398
let has_feature = self.features.arbitrary_enum_discriminant;
355399
if !has_feature && !i.span.allows_unstable(sym::arbitrary_enum_discriminant) {
356-
Parser::maybe_report_invalid_custom_discriminants(self.parse_sess, &variants);
400+
self.maybe_report_invalid_custom_discriminants(&variants);
357401
}
358402
}
359403

src/libsyntax/parse/diagnostics.rs

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use crate::ast::{
22
self, Param, BinOpKind, BindingMode, BlockCheckMode, Expr, ExprKind, Ident, Item, ItemKind,
3-
Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind, VariantData,
3+
Mutability, Pat, PatKind, PathSegment, QSelf, Ty, TyKind,
44
};
5-
use crate::feature_gate::feature_err;
6-
use crate::parse::{SeqSep, PResult, Parser, ParseSess};
5+
use crate::parse::{SeqSep, PResult, Parser};
76
use crate::parse::parser::{BlockMode, PathStyle, SemiColonMode, TokenType, TokenExpectType};
87
use crate::parse::token::{self, TokenKind};
98
use crate::print::pprust;
@@ -715,55 +714,7 @@ impl<'a> Parser<'a> {
715714
}
716715
}
717716

718-
crate fn maybe_report_invalid_custom_discriminants(
719-
sess: &ParseSess,
720-
variants: &[ast::Variant],
721-
) {
722-
let has_fields = variants.iter().any(|variant| match variant.data {
723-
VariantData::Tuple(..) | VariantData::Struct(..) => true,
724-
VariantData::Unit(..) => false,
725-
});
726-
727-
let discriminant_spans = variants.iter().filter(|variant| match variant.data {
728-
VariantData::Tuple(..) | VariantData::Struct(..) => false,
729-
VariantData::Unit(..) => true,
730-
})
731-
.filter_map(|variant| variant.disr_expr.as_ref().map(|c| c.value.span))
732-
.collect::<Vec<_>>();
733-
734-
if !discriminant_spans.is_empty() && has_fields {
735-
let mut err = feature_err(
736-
sess,
737-
sym::arbitrary_enum_discriminant,
738-
discriminant_spans.clone(),
739-
crate::feature_gate::GateIssue::Language,
740-
"custom discriminant values are not allowed in enums with tuple or struct variants",
741-
);
742-
for sp in discriminant_spans {
743-
err.span_label(sp, "disallowed custom discriminant");
744-
}
745-
for variant in variants.iter() {
746-
match &variant.data {
747-
VariantData::Struct(..) => {
748-
err.span_label(
749-
variant.span,
750-
"struct variant defined here",
751-
);
752-
}
753-
VariantData::Tuple(..) => {
754-
err.span_label(
755-
variant.span,
756-
"tuple variant defined here",
757-
);
758-
}
759-
VariantData::Unit(..) => {}
760-
}
761-
}
762-
err.emit();
763-
}
764-
}
765-
766-
crate fn maybe_recover_from_bad_type_plus(
717+
pub(super) fn maybe_recover_from_bad_type_plus(
767718
&mut self,
768719
allow_plus: bool,
769720
ty: &Ty,

0 commit comments

Comments
 (0)