Auto merge of #143958 - samueltardieu:rollup-lh1s143, r=samueltardieu
Rollup of 13 pull requests Successful merges: - rust-lang/rust#142301 (tests: Fix duplicated-path-in-error fail with musl) - rust-lang/rust#143630 (Drop `./x suggest`) - rust-lang/rust#143736 (Give all bytes of TypeId provenance) - rust-lang/rust#143752 (Don't panic if WASI_SDK_PATH not set when detecting compiler) - rust-lang/rust#143837 (Adjust `run_make_support::symbols` helpers) - rust-lang/rust#143878 (Port `#[pointee]` to the new attribute parsing infrastructure) - rust-lang/rust#143905 (Recover and suggest to use `;` to construct array type) - rust-lang/rust#143907 (core: make `str::split_at_unchecked()` inline) - rust-lang/rust#143910 (Add experimental `backtrace-trace-only` std feature) - rust-lang/rust#143927 (Preserve constness in trait objects up to hir ty lowering) - rust-lang/rust#143935 (rustc_type_ir/walk: move docstring to `TypeWalker` itself) - rust-lang/rust#143938 (Update books) - rust-lang/rust#143941 (update `cfg_select!` documentation) Failed merges: - rust-lang/rust#143926 (Remove deprecated fields in bootstrap) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
@@ -7,7 +7,7 @@ use rustc_span::Span;
|
||||
use crate::exp;
|
||||
use crate::parser::Parser;
|
||||
|
||||
pub enum CfgSelectRule {
|
||||
pub enum CfgSelectPredicate {
|
||||
Cfg(MetaItemInner),
|
||||
Wildcard(Token),
|
||||
}
|
||||
@@ -20,7 +20,7 @@ pub struct CfgSelectBranches {
|
||||
pub wildcard: Option<(Token, TokenStream, Span)>,
|
||||
/// All branches after the first wildcard, including further wildcards.
|
||||
/// These branches are kept for formatting.
|
||||
pub unreachable: Vec<(CfgSelectRule, TokenStream, Span)>,
|
||||
pub unreachable: Vec<(CfgSelectPredicate, TokenStream, Span)>,
|
||||
}
|
||||
|
||||
/// Parses a `TokenTree` that must be of the form `{ /* ... */ }`, and returns a `TokenStream` where
|
||||
@@ -52,7 +52,7 @@ pub fn parse_cfg_select<'a>(p: &mut Parser<'a>) -> PResult<'a, CfgSelectBranches
|
||||
match branches.wildcard {
|
||||
None => branches.wildcard = Some((underscore, tts, span)),
|
||||
Some(_) => {
|
||||
branches.unreachable.push((CfgSelectRule::Wildcard(underscore), tts, span))
|
||||
branches.unreachable.push((CfgSelectPredicate::Wildcard(underscore), tts, span))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -64,7 +64,9 @@ pub fn parse_cfg_select<'a>(p: &mut Parser<'a>) -> PResult<'a, CfgSelectBranches
|
||||
|
||||
match branches.wildcard {
|
||||
None => branches.reachable.push((meta_item, tts, span)),
|
||||
Some(_) => branches.unreachable.push((CfgSelectRule::Cfg(meta_item), tts, span)),
|
||||
Some(_) => {
|
||||
branches.unreachable.push((CfgSelectPredicate::Cfg(meta_item), tts, span))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -575,14 +575,69 @@ impl<'a> Parser<'a> {
|
||||
self.expect(exp!(CloseBracket))?;
|
||||
}
|
||||
TyKind::Array(elt_ty, length)
|
||||
} else {
|
||||
self.expect(exp!(CloseBracket))?;
|
||||
} else if self.eat(exp!(CloseBracket)) {
|
||||
TyKind::Slice(elt_ty)
|
||||
} else {
|
||||
self.maybe_recover_array_ty_without_semi(elt_ty)?
|
||||
};
|
||||
|
||||
Ok(ty)
|
||||
}
|
||||
|
||||
/// Recover from malformed array type syntax.
|
||||
///
|
||||
/// This method attempts to recover from cases like:
|
||||
/// - `[u8, 5]` → suggests using `;`, return a Array type
|
||||
/// - `[u8 5]` → suggests using `;`, return a Array type
|
||||
/// Consider to add more cases in the future.
|
||||
fn maybe_recover_array_ty_without_semi(&mut self, elt_ty: P<Ty>) -> PResult<'a, TyKind> {
|
||||
let span = self.token.span;
|
||||
let token_descr = super::token_descr(&self.token);
|
||||
let mut err =
|
||||
self.dcx().struct_span_err(span, format!("expected `;` or `]`, found {}", token_descr));
|
||||
err.span_label(span, "expected `;` or `]`");
|
||||
err.note("you might have meant to write a slice or array type");
|
||||
|
||||
// If we cannot recover, return the error immediately.
|
||||
if !self.may_recover() {
|
||||
return Err(err);
|
||||
}
|
||||
|
||||
let snapshot = self.create_snapshot_for_diagnostic();
|
||||
|
||||
let suggestion_span = if self.eat(exp!(Comma)) || self.eat(exp!(Star)) {
|
||||
// Consume common erroneous separators.
|
||||
self.prev_token.span
|
||||
} else {
|
||||
self.token.span.shrink_to_lo()
|
||||
};
|
||||
|
||||
// we first try to parse pattern like `[u8 5]`
|
||||
let length = match self.parse_expr_anon_const() {
|
||||
Ok(length) => length,
|
||||
Err(e) => {
|
||||
e.cancel();
|
||||
self.restore_snapshot(snapshot);
|
||||
return Err(err);
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(e) = self.expect(exp!(CloseBracket)) {
|
||||
e.cancel();
|
||||
self.restore_snapshot(snapshot);
|
||||
return Err(err);
|
||||
}
|
||||
|
||||
err.span_suggestion_verbose(
|
||||
suggestion_span,
|
||||
"you might have meant to use `;` as the separator",
|
||||
";",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
err.emit();
|
||||
Ok(TyKind::Array(elt_ty, length))
|
||||
}
|
||||
|
||||
fn parse_borrowed_pointee(&mut self) -> PResult<'a, TyKind> {
|
||||
let and_span = self.prev_token.span;
|
||||
let mut opt_lifetime = self.check_lifetime().then(|| self.expect_lifetime());
|
||||
|
||||
@@ -297,6 +297,7 @@ pub fn check_builtin_meta_item(
|
||||
| sym::align
|
||||
| sym::deprecated
|
||||
| sym::optimize
|
||||
| sym::pointee
|
||||
| sym::cold
|
||||
| sym::target_feature
|
||||
| sym::rustc_allow_const_fn_unstable
|
||||
|
||||
Reference in New Issue
Block a user