Skip to content

Commit d4e9952

Browse files
Rollup merge of rust-lang#95710 - fee1-dead-contrib:stabilize_arbitrary_enum_discriminant, r=joshtriplett
Stabilize arbitrary_enum_discriminant, take 2 Documentation has been updated in rust-lang/reference#1055. cc rust-lang#86860 for previous stabilization report. Not yet marks rust-lang#60553 as done: need documentation in the rust reference.
2 parents bed4ad6 + b614b0e commit d4e9952

27 files changed

+16
-227
lines changed

compiler/rustc_ast_passes/src/feature_gate.rs

+1-61
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_ast as ast;
22
use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
33
use rustc_ast::{AssocConstraint, AssocConstraintKind, NodeId};
4-
use rustc_ast::{PatKind, RangeEnd, VariantData};
4+
use rustc_ast::{PatKind, RangeEnd};
55
use rustc_errors::{struct_span_err, Applicability, StashKey};
66
use rustc_feature::{AttributeGate, BuiltinAttribute, Features, GateIssue, BUILTIN_ATTRIBUTE_MAP};
77
use rustc_session::parse::{feature_err, feature_err_issue, feature_warn};
@@ -116,46 +116,6 @@ impl<'a> PostExpansionVisitor<'a> {
116116
}
117117
}
118118

119-
fn maybe_report_invalid_custom_discriminants(&self, variants: &[ast::Variant]) {
120-
let has_fields = variants.iter().any(|variant| match variant.data {
121-
VariantData::Tuple(..) | VariantData::Struct(..) => true,
122-
VariantData::Unit(..) => false,
123-
});
124-
125-
let discriminant_spans = variants
126-
.iter()
127-
.filter(|variant| match variant.data {
128-
VariantData::Tuple(..) | VariantData::Struct(..) => false,
129-
VariantData::Unit(..) => true,
130-
})
131-
.filter_map(|variant| variant.disr_expr.as_ref().map(|c| c.value.span))
132-
.collect::<Vec<_>>();
133-
134-
if !discriminant_spans.is_empty() && has_fields {
135-
let mut err = feature_err(
136-
&self.sess.parse_sess,
137-
sym::arbitrary_enum_discriminant,
138-
discriminant_spans.clone(),
139-
"custom discriminant values are not allowed in enums with tuple or struct variants",
140-
);
141-
for sp in discriminant_spans {
142-
err.span_label(sp, "disallowed custom discriminant");
143-
}
144-
for variant in variants.iter() {
145-
match &variant.data {
146-
VariantData::Struct(..) => {
147-
err.span_label(variant.span, "struct variant defined here");
148-
}
149-
VariantData::Tuple(..) => {
150-
err.span_label(variant.span, "tuple variant defined here");
151-
}
152-
VariantData::Unit(..) => {}
153-
}
154-
}
155-
err.emit();
156-
}
157-
}
158-
159119
/// Feature gate `impl Trait` inside `type Alias = $type_expr;`.
160120
fn check_impl_trait(&self, ty: &ast::Ty) {
161121
struct ImplTraitVisitor<'a> {
@@ -273,26 +233,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
273233
}
274234
}
275235

276-
ast::ItemKind::Enum(ast::EnumDef { ref variants, .. }, ..) => {
277-
for variant in variants {
278-
match (&variant.data, &variant.disr_expr) {
279-
(ast::VariantData::Unit(..), _) => {}
280-
(_, Some(disr_expr)) => gate_feature_post!(
281-
&self,
282-
arbitrary_enum_discriminant,
283-
disr_expr.value.span,
284-
"discriminants on non-unit variants are experimental"
285-
),
286-
_ => {}
287-
}
288-
}
289-
290-
let has_feature = self.features.arbitrary_enum_discriminant;
291-
if !has_feature && !i.span.allows_unstable(sym::arbitrary_enum_discriminant) {
292-
self.maybe_report_invalid_custom_discriminants(&variants);
293-
}
294-
}
295-
296236
ast::ItemKind::Impl(box ast::Impl { polarity, defaultness, ref of_trait, .. }) => {
297237
if let ast::ImplPolarity::Negative(span) = polarity {
298238
gate_feature_post!(

compiler/rustc_error_codes/src/error_codes/E0732.md

-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ An `enum` with a discriminant must specify a `#[repr(inttype)]`.
33
Erroneous code example:
44

55
```compile_fail,E0732
6-
#![feature(arbitrary_enum_discriminant)]
7-
86
enum Enum { // error!
97
Unit = 1,
108
Tuple() = 2,
@@ -20,8 +18,6 @@ is a well-defined way to extract a variant's discriminant from a value;
2018
for instance:
2119

2220
```
23-
#![feature(arbitrary_enum_discriminant)]
24-
2521
#[repr(u8)]
2622
enum Enum {
2723
Unit = 3,

compiler/rustc_feature/src/accepted.rs

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ declare_features! (
5353
(accepted, abi_sysv64, "1.24.0", Some(36167), None),
5454
/// Allows using ADX intrinsics from `core::arch::{x86, x86_64}`.
5555
(accepted, adx_target_feature, "1.61.0", Some(44839), None),
56+
/// Allows explicit discriminants on non-unit enum variants.
57+
(accepted, arbitrary_enum_discriminant, "CURRENT_RUSTC_VERSION", Some(60553), None),
5658
/// Allows using `sym` operands in inline assembly.
5759
(accepted, asm_sym, "CURRENT_RUSTC_VERSION", Some(93333), None),
5860
/// Allows the definition of associated constants in `trait` or `impl` blocks.

compiler/rustc_feature/src/active.rs

-2
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,6 @@ declare_features! (
292292
(incomplete, adt_const_params, "1.56.0", Some(95174), None),
293293
/// Allows defining an `#[alloc_error_handler]`.
294294
(active, alloc_error_handler, "1.29.0", Some(51540), None),
295-
/// Allows explicit discriminants on non-unit enum variants.
296-
(active, arbitrary_enum_discriminant, "1.37.0", Some(60553), None),
297295
/// Allows trait methods with arbitrary self types.
298296
(active, arbitrary_self_types, "1.23.0", Some(44874), None),
299297
/// Allows using `const` operands in inline assembly.

compiler/rustc_hir_analysis/src/check/check.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1180,7 +1180,7 @@ fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, vs: &'tcx [hir::Variant<'tcx>], def_id: L
11801180
}
11811181
}
11821182

1183-
if tcx.adt_def(def_id).repr().int.is_none() && tcx.features().arbitrary_enum_discriminant {
1183+
if tcx.adt_def(def_id).repr().int.is_none() {
11841184
let is_unit = |var: &hir::Variant<'_>| matches!(var.data, hir::VariantData::Unit(..));
11851185

11861186
let has_disr = |var: &hir::Variant<'_>| var.disr_expr.is_some();

src/doc/unstable-book/src/language-features/arbitrary-enum-discriminant.md

-37
This file was deleted.

src/test/ui/cast/issue-88621.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![feature(arbitrary_enum_discriminant)]
2-
31
#[repr(u8)]
42
enum Kind2 {
53
Foo() = 1,

src/test/ui/cast/issue-88621.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0605]: non-primitive cast: `Kind2` as `u8`
2-
--> $DIR/issue-88621.rs:11:13
2+
--> $DIR/issue-88621.rs:9:13
33
|
44
LL | let _ = Kind2::Foo() as u8;
55
| ^^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object

src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#![crate_type="lib"]
2-
#![feature(arbitrary_enum_discriminant)]
32

43
enum Enum {
54
//~^ ERROR `#[repr(inttype)]` must be specified

src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0732]: `#[repr(inttype)]` must be specified
2-
--> $DIR/arbitrary_enum_discriminant-no-repr.rs:4:1
2+
--> $DIR/arbitrary_enum_discriminant-no-repr.rs:3:1
33
|
44
LL | enum Enum {
55
| ^^^^^^^^^

src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// run-pass
2-
#![feature(arbitrary_enum_discriminant, test)]
2+
#![feature(test)]
33

44
extern crate test;
55

src/test/ui/enum-discriminant/discriminant_value.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// run-pass
22
#![allow(stable_features)]
3-
#![feature(arbitrary_enum_discriminant, core, core_intrinsics)]
3+
#![feature(core, core_intrinsics)]
44

55
extern crate core;
66
use core::intrinsics::discriminant_value;

src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.rs

-10
This file was deleted.

src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.stderr

-36
This file was deleted.

src/test/ui/enum-discriminant/issue-70453-generics-in-discr-ice-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![feature(arbitrary_enum_discriminant, core_intrinsics)]
1+
#![feature(core_intrinsics)]
22

33
extern crate core;
44
use core::intrinsics::discriminant_value;

src/test/ui/enum-discriminant/issue-70453-polymorphic-ctfe.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![feature(arbitrary_enum_discriminant, core_intrinsics)]
1+
#![feature(core_intrinsics)]
22

33
extern crate core;
44
use core::intrinsics::discriminant_value;

src/test/ui/enum-discriminant/issue-70509-partial_eq.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// run-pass
2-
#![feature(repr128, arbitrary_enum_discriminant)]
2+
#![feature(repr128)]
33
//~^ WARN the feature `repr128` is incomplete
44

55
#[derive(PartialEq, Debug)]

src/test/ui/enum-discriminant/issue-70509-partial_eq.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
warning: the feature `repr128` is incomplete and may not be safe to use and/or cause compiler crashes
22
--> $DIR/issue-70509-partial_eq.rs:2:12
33
|
4-
LL | #![feature(repr128, arbitrary_enum_discriminant)]
4+
LL | #![feature(repr128)]
55
| ^^^^^^^
66
|
77
= note: see issue #56071 <https://github.com/rust-lang/rust/issues/56071> for more information

src/test/ui/intrinsics/panic-uninitialized-zeroed.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// This test checks panic emitted from `mem::{uninitialized,zeroed}`.
99

10-
#![feature(never_type, arbitrary_enum_discriminant)]
10+
#![feature(never_type)]
1111
#![allow(deprecated, invalid_value)]
1212

1313
use std::{

src/test/ui/macros/macros-nonfatal-errors.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// immediately, so that we get more errors listed at a time.
55

66
#![feature(trace_macros, concat_idents)]
7-
#![feature(stmt_expr_attributes, arbitrary_enum_discriminant)]
7+
#![feature(stmt_expr_attributes)]
88

99
use std::arch::asm;
1010

src/test/ui/parser/issues/issue-17383.rs

-7
This file was deleted.

src/test/ui/parser/issues/issue-17383.stderr

-15
This file was deleted.

src/test/ui/parser/tag-variant-disr-non-nullary.rs

-12
This file was deleted.

src/test/ui/parser/tag-variant-disr-non-nullary.stderr

-25
This file was deleted.

src/test/ui/transmutability/enums/should_order_correctly.rs

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
//! The payloads of an enum variant should be ordered after its tag.
33
44
#![crate_type = "lib"]
5-
#![feature(arbitrary_enum_discriminant)]
65
#![feature(transmutability)]
76
#![allow(dead_code)]
87

src/test/ui/transmutability/enums/should_respect_endianness.rs

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
//! an enum with a multi-byte tag.
33
44
#![crate_type = "lib"]
5-
#![feature(arbitrary_enum_discriminant)]
65
#![feature(transmutability)]
76
#![allow(dead_code)]
87

src/test/ui/transmutability/enums/should_respect_endianness.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
error[E0277]: `Src` cannot be safely transmuted into `Unexpected` in the defining scope of `assert::Context`.
2-
--> $DIR/should_respect_endianness.rs:37:36
2+
--> $DIR/should_respect_endianness.rs:36:36
33
|
44
LL | assert::is_transmutable::<Src, Unexpected>();
55
| ^^^^^^^^^^ `Src` cannot be safely transmuted into `Unexpected` in the defining scope of `assert::Context`.
66
|
77
= help: the trait `BikeshedIntrinsicFrom<Src, assert::Context, Assume { alignment: true, lifetimes: true, safety: true, validity: true }>` is not implemented for `Unexpected`
88
note: required by a bound in `is_transmutable`
9-
--> $DIR/should_respect_endianness.rs:15:14
9+
--> $DIR/should_respect_endianness.rs:14:14
1010
|
1111
LL | pub fn is_transmutable<Src, Dst>()
1212
| --------------- required by a bound in this

0 commit comments

Comments
 (0)