summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_parse/src/parser/item.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
commitc23a457e72abe608715ac76f076f47dc42af07a5 (patch)
tree2772049aaf84b5c9d0ed12ec8d86812f7a7904b6 /compiler/rustc_parse/src/parser/item.rs
parentReleasing progress-linux version 1.73.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-c23a457e72abe608715ac76f076f47dc42af07a5.tar.xz
rustc-c23a457e72abe608715ac76f076f47dc42af07a5.zip
Merging upstream version 1.74.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_parse/src/parser/item.rs')
-rw-r--r--compiler/rustc_parse/src/parser/item.rs36
1 files changed, 16 insertions, 20 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs
index 24c65d061..aad4edaba 100644
--- a/compiler/rustc_parse/src/parser/item.rs
+++ b/compiler/rustc_parse/src/parser/item.rs
@@ -73,12 +73,16 @@ impl<'a> Parser<'a> {
if !self.maybe_consume_incorrect_semicolon(&items) {
let msg = format!("expected item, found {token_str}");
let mut err = self.struct_span_err(self.token.span, msg);
- let label = if self.is_kw_followed_by_ident(kw::Let) {
- "consider using `const` or `static` instead of `let` for global variables"
+ let span = self.token.span;
+ if self.is_kw_followed_by_ident(kw::Let) {
+ err.span_label(
+ span,
+ "consider using `const` or `static` instead of `let` for global variables",
+ );
} else {
- "expected item"
+ err.span_label(span, "expected item")
+ .note("for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>");
};
- err.span_label(self.token.span, label);
return Err(err);
}
}
@@ -1594,7 +1598,7 @@ impl<'a> Parser<'a> {
Ok((class_name, ItemKind::Union(vdata, generics)))
}
- fn parse_record_struct_body(
+ pub(crate) fn parse_record_struct_body(
&mut self,
adt_ty: &str,
ident_span: Span,
@@ -1851,25 +1855,15 @@ impl<'a> Parser<'a> {
attrs: AttrVec,
) -> PResult<'a, FieldDef> {
let name = self.parse_field_ident(adt_ty, lo)?;
- // Parse the macro invocation and recover
if self.token.kind == token::Not {
if let Err(mut err) = self.unexpected::<FieldDef>() {
- err.subdiagnostic(MacroExpandsToAdtField { adt_ty }).emit();
- self.bump();
- self.parse_delim_args()?;
- return Ok(FieldDef {
- span: DUMMY_SP,
- ident: None,
- vis,
- id: DUMMY_NODE_ID,
- ty: self.mk_ty(DUMMY_SP, TyKind::Err),
- attrs,
- is_placeholder: false,
- });
+ // Encounter the macro invocation
+ err.subdiagnostic(MacroExpandsToAdtField { adt_ty });
+ return Err(err);
}
}
self.expect_field_ty_separator()?;
- let ty = self.parse_ty()?;
+ let ty = self.parse_ty_for_field_def()?;
if self.token.kind == token::Colon && self.look_ahead(1, |tok| tok.kind != token::Colon) {
self.sess.emit_err(errors::SingleColonStructType { span: self.token.span });
}
@@ -1894,7 +1888,9 @@ impl<'a> Parser<'a> {
/// for better diagnostics and suggestions.
fn parse_field_ident(&mut self, adt_ty: &str, lo: Span) -> PResult<'a, Ident> {
let (ident, is_raw) = self.ident_or_err(true)?;
- if !is_raw && ident.is_reserved() {
+ if ident.name == kw::Underscore {
+ self.sess.gated_spans.gate(sym::unnamed_fields, lo);
+ } else if !is_raw && ident.is_reserved() {
let snapshot = self.create_snapshot_for_diagnostic();
let err = if self.check_fn_front_matter(false, Case::Sensitive) {
let inherited_vis = Visibility {