Skip to content

Commit deef866

Browse files
committed
Auto merge of rust-lang#88946 - cuviper:beta-next, r=Mark-Simulacrum
[beta] backports - rustdoc: Fix ICE with `doc(hidden)` on tuple variant fields rust-lang#88639 - Fix 2021 `dyn` suggestion that used code as label rust-lang#88657 - Workaround blink/chromium grid layout limitation of 1000 rows rust-lang#88776 - Change scope of temporaries in match guards rust-lang#88678 - Add a regression test for rust-lang#88649 rust-lang#88691 - Revert anon union parsing rust-lang#88775 - Disable validate_maintainers. rust-lang#88977 Also drop stage0 rustfmt, because that's only supposed to be used on master. r? `@Mark-Simulacrum`
2 parents f9a839e + ce1c9dc commit deef866

40 files changed

+201
-649
lines changed

compiler/rustc_ast/src/ast.rs

-4
Original file line numberDiff line numberDiff line change
@@ -1902,10 +1902,6 @@ pub enum TyKind {
19021902
Never,
19031903
/// A tuple (`(A, B, C, D,...)`).
19041904
Tup(Vec<P<Ty>>),
1905-
/// An anonymous struct type i.e. `struct { foo: Type }`
1906-
AnonymousStruct(Vec<FieldDef>, bool),
1907-
/// An anonymous union type i.e. `union { bar: Type }`
1908-
AnonymousUnion(Vec<FieldDef>, bool),
19091905
/// A path (`module::module::...::Type`), optionally
19101906
/// "qualified", e.g., `<Vec<T> as SomeTrait>::SomeType`.
19111907
///

compiler/rustc_ast/src/mut_visit.rs

-3
Original file line numberDiff line numberDiff line change
@@ -484,9 +484,6 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
484484
visit_vec(bounds, |bound| vis.visit_param_bound(bound));
485485
}
486486
TyKind::MacCall(mac) => vis.visit_mac_call(mac),
487-
TyKind::AnonymousStruct(fields, ..) | TyKind::AnonymousUnion(fields, ..) => {
488-
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
489-
}
490487
}
491488
vis.visit_span(span);
492489
visit_lazy_tts(tokens, vis);

compiler/rustc_ast/src/visit.rs

-3
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,6 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
407407
TyKind::Typeof(ref expression) => visitor.visit_anon_const(expression),
408408
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {}
409409
TyKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
410-
TyKind::AnonymousStruct(ref fields, ..) | TyKind::AnonymousUnion(ref fields, ..) => {
411-
walk_list!(visitor, visit_field_def, fields)
412-
}
413410
TyKind::Never | TyKind::CVarArgs => {}
414411
}
415412
}

compiler/rustc_ast_lowering/src/item.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -749,10 +749,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
749749
}
750750
}
751751

752-
pub(super) fn lower_field_def(
753-
&mut self,
754-
(index, f): (usize, &FieldDef),
755-
) -> hir::FieldDef<'hir> {
752+
fn lower_field_def(&mut self, (index, f): (usize, &FieldDef)) -> hir::FieldDef<'hir> {
756753
let ty = if let TyKind::Path(ref qself, ref path) = f.ty.kind {
757754
let t = self.lower_path_ty(
758755
&f.ty,

compiler/rustc_ast_lowering/src/lib.rs

-9
Original file line numberDiff line numberDiff line change
@@ -1290,15 +1290,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12901290
let kind = match t.kind {
12911291
TyKind::Infer => hir::TyKind::Infer,
12921292
TyKind::Err => hir::TyKind::Err,
1293-
// FIXME(unnamed_fields): IMPLEMENTATION IN PROGRESS
1294-
TyKind::AnonymousStruct(ref _fields, _recovered) => {
1295-
self.sess.struct_span_err(t.span, "anonymous structs are unimplemented").emit();
1296-
hir::TyKind::Err
1297-
}
1298-
TyKind::AnonymousUnion(ref _fields, _recovered) => {
1299-
self.sess.struct_span_err(t.span, "anonymous unions are unimplemented").emit();
1300-
hir::TyKind::Err
1301-
}
13021293
TyKind::Slice(ref ty) => hir::TyKind::Slice(self.lower_ty(ty, itctx)),
13031294
TyKind::Ptr(ref mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
13041295
TyKind::Rptr(ref region, ref mt) => {

compiler/rustc_ast_passes/src/ast_validation.rs

-68
Original file line numberDiff line numberDiff line change
@@ -193,19 +193,13 @@ impl<'a> AstValidator<'a> {
193193
}
194194
}
195195
}
196-
TyKind::AnonymousStruct(ref fields, ..) | TyKind::AnonymousUnion(ref fields, ..) => {
197-
self.with_banned_assoc_ty_bound(|this| {
198-
walk_list!(this, visit_struct_field_def, fields)
199-
});
200-
}
201196
_ => visit::walk_ty(self, t),
202197
}
203198
}
204199

205200
fn visit_struct_field_def(&mut self, field: &'a FieldDef) {
206201
if let Some(ident) = field.ident {
207202
if ident.name == kw::Underscore {
208-
self.check_anonymous_field(field);
209203
self.visit_vis(&field.vis);
210204
self.visit_ident(ident);
211205
self.visit_ty_common(&field.ty);
@@ -251,66 +245,6 @@ impl<'a> AstValidator<'a> {
251245
err.emit();
252246
}
253247

254-
fn check_anonymous_field(&self, field: &FieldDef) {
255-
let FieldDef { ty, .. } = field;
256-
match &ty.kind {
257-
TyKind::AnonymousStruct(..) | TyKind::AnonymousUnion(..) => {
258-
// We already checked for `kw::Underscore` before calling this function,
259-
// so skip the check
260-
}
261-
TyKind::Path(..) => {
262-
// If the anonymous field contains a Path as type, we can't determine
263-
// if the path is a valid struct or union, so skip the check
264-
}
265-
_ => {
266-
let msg = "unnamed fields can only have struct or union types";
267-
let label = "not a struct or union";
268-
self.err_handler()
269-
.struct_span_err(field.span, msg)
270-
.span_label(ty.span, label)
271-
.emit();
272-
}
273-
}
274-
}
275-
276-
fn deny_anonymous_struct(&self, ty: &Ty) {
277-
match &ty.kind {
278-
TyKind::AnonymousStruct(..) => {
279-
self.err_handler()
280-
.struct_span_err(
281-
ty.span,
282-
"anonymous structs are not allowed outside of unnamed struct or union fields",
283-
)
284-
.span_label(ty.span, "anonymous struct declared here")
285-
.emit();
286-
}
287-
TyKind::AnonymousUnion(..) => {
288-
self.err_handler()
289-
.struct_span_err(
290-
ty.span,
291-
"anonymous unions are not allowed outside of unnamed struct or union fields",
292-
)
293-
.span_label(ty.span, "anonymous union declared here")
294-
.emit();
295-
}
296-
_ => {}
297-
}
298-
}
299-
300-
fn deny_anonymous_field(&self, field: &FieldDef) {
301-
if let Some(ident) = field.ident {
302-
if ident.name == kw::Underscore {
303-
self.err_handler()
304-
.struct_span_err(
305-
field.span,
306-
"anonymous fields are not allowed outside of structs or unions",
307-
)
308-
.span_label(ident.span, "anonymous field declared here")
309-
.emit()
310-
}
311-
}
312-
}
313-
314248
fn check_decl_no_pat(decl: &FnDecl, mut report_err: impl FnMut(Span, Option<Ident>, bool)) {
315249
for Param { pat, .. } in &decl.inputs {
316250
match pat.kind {
@@ -1067,7 +1001,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10671001

10681002
fn visit_ty(&mut self, ty: &'a Ty) {
10691003
self.visit_ty_common(ty);
1070-
self.deny_anonymous_struct(ty);
10711004
self.walk_ty(ty)
10721005
}
10731006

@@ -1082,7 +1015,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10821015
}
10831016

10841017
fn visit_field_def(&mut self, s: &'a FieldDef) {
1085-
self.deny_anonymous_field(s);
10861018
visit::walk_field_def(self, s)
10871019
}
10881020

compiler/rustc_ast_passes/src/feature_gate.rs

-1
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
668668
// involved, so we only emit errors where there are no other parsing errors.
669669
gate_all!(destructuring_assignment, "destructuring assignments are unstable");
670670
}
671-
gate_all!(unnamed_fields, "unnamed fields are not yet fully implemented");
672671

673672
// All uses of `gate_all!` below this point were added in #65742,
674673
// and subsequently disabled (with the non-early gating readded).

compiler/rustc_ast_pretty/src/pprust/state.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -985,14 +985,6 @@ impl<'a> State<'a> {
985985
}
986986
self.pclose();
987987
}
988-
ast::TyKind::AnonymousStruct(ref fields, ..) => {
989-
self.head("struct");
990-
self.print_record_struct_body(&fields, ty.span);
991-
}
992-
ast::TyKind::AnonymousUnion(ref fields, ..) => {
993-
self.head("union");
994-
self.print_record_struct_body(&fields, ty.span);
995-
}
996988
ast::TyKind::Paren(ref typ) => {
997989
self.popen();
998990
self.print_type(typ);
@@ -1413,7 +1405,12 @@ impl<'a> State<'a> {
14131405
}
14141406
}
14151407

1416-
crate fn print_record_struct_body(&mut self, fields: &[ast::FieldDef], span: rustc_span::Span) {
1408+
crate fn print_record_struct_body(
1409+
&mut self,
1410+
fields: &Vec<ast::FieldDef>,
1411+
span: rustc_span::Span,
1412+
) {
1413+
self.nbsp();
14171414
self.bopen();
14181415
self.hardbreak_if_not_bol();
14191416

@@ -1462,7 +1459,6 @@ impl<'a> State<'a> {
14621459
}
14631460
ast::VariantData::Struct(ref fields, ..) => {
14641461
self.print_where_clause(&generics.where_clause);
1465-
self.nbsp();
14661462
self.print_record_struct_body(fields, span);
14671463
}
14681464
}

compiler/rustc_feature/src/active.rs

-3
Original file line numberDiff line numberDiff line change
@@ -639,9 +639,6 @@ declare_features! (
639639
/// Allows specifying the as-needed link modifier
640640
(active, native_link_modifiers_as_needed, "1.53.0", Some(81490), None),
641641

642-
/// Allows unnamed fields of struct and union type
643-
(incomplete, unnamed_fields, "1.53.0", Some(49804), None),
644-
645642
/// Allows qualified paths in struct expressions, struct patterns and tuple struct patterns.
646643
(active, more_qualified_paths, "1.54.0", Some(86935), None),
647644

compiler/rustc_mir_build/src/build/expr/into.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
6868
let then_blk = unpack!(this.then_else_break(
6969
block,
7070
&this.thir[cond],
71-
condition_scope,
71+
Some(condition_scope),
7272
condition_scope,
7373
then_expr.span,
7474
));

compiler/rustc_mir_build/src/build/matches/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
3939
&mut self,
4040
mut block: BasicBlock,
4141
expr: &Expr<'tcx>,
42-
temp_scope: region::Scope,
42+
temp_scope_override: Option<region::Scope>,
4343
break_scope: region::Scope,
4444
variable_scope_span: Span,
4545
) -> BlockAnd<()> {
@@ -53,7 +53,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
5353
this.then_else_break(
5454
block,
5555
&this.thir[value],
56-
temp_scope,
56+
temp_scope_override,
5757
break_scope,
5858
variable_scope_span,
5959
)
@@ -63,6 +63,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
6363
this.lower_let_expr(block, &this.thir[expr], pat, break_scope, variable_scope_span)
6464
}
6565
_ => {
66+
let temp_scope = temp_scope_override.unwrap_or_else(|| this.local_scope());
6667
let mutability = Mutability::Mut;
6768
let place =
6869
unpack!(block = this.as_temp(block, Some(temp_scope), expr, mutability));
@@ -1948,7 +1949,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
19481949
}
19491950

19501951
let arm_span = arm_span.unwrap();
1951-
let arm_scope = self.local_scope();
19521952
let match_scope = match_scope.unwrap();
19531953
let mut guard_span = rustc_span::DUMMY_SP;
19541954

@@ -1957,7 +1957,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
19571957
Guard::If(e) => {
19581958
let e = &this.thir[e];
19591959
guard_span = e.span;
1960-
this.then_else_break(block, e, arm_scope, match_scope, arm_span)
1960+
this.then_else_break(block, e, None, match_scope, arm_span)
19611961
}
19621962
Guard::IfLet(ref pat, scrutinee) => {
19631963
let s = &this.thir[scrutinee];

compiler/rustc_parse/src/parser/item.rs

+16-22
Original file line numberDiff line numberDiff line change
@@ -1234,7 +1234,7 @@ impl<'a> Parser<'a> {
12341234
Ok((class_name, ItemKind::Union(vdata, generics)))
12351235
}
12361236

1237-
pub(super) fn parse_record_struct_body(
1237+
fn parse_record_struct_body(
12381238
&mut self,
12391239
adt_ty: &str,
12401240
) -> PResult<'a, (Vec<FieldDef>, /* recovered */ bool)> {
@@ -1468,28 +1468,22 @@ impl<'a> Parser<'a> {
14681468
fn parse_field_ident(&mut self, adt_ty: &str, lo: Span) -> PResult<'a, Ident> {
14691469
let (ident, is_raw) = self.ident_or_err()?;
14701470
if !is_raw && ident.is_reserved() {
1471-
if ident.name == kw::Underscore {
1472-
self.sess.gated_spans.gate(sym::unnamed_fields, lo);
1471+
let err = if self.check_fn_front_matter(false) {
1472+
// We use `parse_fn` to get a span for the function
1473+
if let Err(mut db) = self.parse_fn(&mut Vec::new(), |_| true, lo) {
1474+
db.delay_as_bug();
1475+
}
1476+
let mut err = self.struct_span_err(
1477+
lo.to(self.prev_token.span),
1478+
&format!("functions are not allowed in {} definitions", adt_ty),
1479+
);
1480+
err.help("unlike in C++, Java, and C#, functions are declared in `impl` blocks");
1481+
err.help("see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information");
1482+
err
14731483
} else {
1474-
let err = if self.check_fn_front_matter(false) {
1475-
// We use `parse_fn` to get a span for the function
1476-
if let Err(mut db) = self.parse_fn(&mut Vec::new(), |_| true, lo) {
1477-
db.delay_as_bug();
1478-
}
1479-
let mut err = self.struct_span_err(
1480-
lo.to(self.prev_token.span),
1481-
&format!("functions are not allowed in {} definitions", adt_ty),
1482-
);
1483-
err.help(
1484-
"unlike in C++, Java, and C#, functions are declared in `impl` blocks",
1485-
);
1486-
err.help("see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information");
1487-
err
1488-
} else {
1489-
self.expected_ident_found()
1490-
};
1491-
return Err(err);
1492-
}
1484+
self.expected_ident_found()
1485+
};
1486+
return Err(err);
14931487
}
14941488
self.bump();
14951489
Ok(ident)

compiler/rustc_parse/src/parser/ty.rs

-13
Original file line numberDiff line numberDiff line change
@@ -226,19 +226,6 @@ impl<'a> Parser<'a> {
226226
}
227227
} else if self.eat_keyword(kw::Impl) {
228228
self.parse_impl_ty(&mut impl_dyn_multi)?
229-
} else if self.token.is_keyword(kw::Union)
230-
&& self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace))
231-
{
232-
self.bump();
233-
let (fields, recovered) = self.parse_record_struct_body("union")?;
234-
let span = lo.to(self.prev_token.span);
235-
self.sess.gated_spans.gate(sym::unnamed_fields, span);
236-
TyKind::AnonymousUnion(fields, recovered)
237-
} else if self.eat_keyword(kw::Struct) {
238-
let (fields, recovered) = self.parse_record_struct_body("struct")?;
239-
let span = lo.to(self.prev_token.span);
240-
self.sess.gated_spans.gate(sym::unnamed_fields, span);
241-
TyKind::AnonymousStruct(fields, recovered)
242229
} else if self.is_explicit_dyn_type() {
243230
self.parse_dyn_ty(&mut impl_dyn_multi)?
244231
} else if self.eat_lt() {

compiler/rustc_span/src/symbol.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1358,7 +1358,6 @@ symbols! {
13581358
unix,
13591359
unlikely,
13601360
unmarked_api,
1361-
unnamed_fields,
13621361
unpin,
13631362
unreachable,
13641363
unreachable_code,

compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
945945
Ok(s) if s.starts_with('<') => sugg,
946946
_ => format!("<{}>", sugg),
947947
};
948-
let replace = String::from("use `dyn`");
948+
let sugg_label = "use `dyn`";
949949
if self.sess().edition() >= Edition::Edition2021 {
950950
let mut err = rustc_errors::struct_span_err!(
951951
self.sess(),
@@ -956,8 +956,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
956956
);
957957
err.span_suggestion(
958958
self_ty.span,
959-
&sugg,
960-
replace,
959+
sugg_label,
960+
sugg,
961961
Applicability::MachineApplicable,
962962
)
963963
.emit();
@@ -968,7 +968,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
968968
self_ty.span,
969969
|lint| {
970970
let mut db = lint.build(msg);
971-
db.span_suggestion(self_ty.span, &replace, sugg, app);
971+
db.span_suggestion(self_ty.span, sugg_label, sugg, app);
972972
db.emit()
973973
},
974974
);

0 commit comments

Comments
 (0)