Skip to content

Rollup of 7 pull requests #128413

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/rustc_builtin_macros/src/pattern_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fn parse_pat_ty<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P
let mut parser = cx.new_parser_from_tts(stream);

let ty = parser.parse_ty()?;
parser.eat_keyword(sym::is);
parser.expect_keyword(sym::is)?;
let pat = parser.parse_pat_no_top_alt(None, None)?;

Ok((ty, pat))
Expand Down
5 changes: 3 additions & 2 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3153,7 +3153,8 @@ impl<'a> Parser<'a> {

if !require_comma {
arm_body = Some(expr);
this.eat(&token::Comma);
// Eat a comma if it exists, though.
let _ = this.eat(&token::Comma);
Ok(Recovered::No)
} else if let Some((span, guar)) =
this.parse_arm_body_missing_braces(&expr, arrow_span)
Expand Down Expand Up @@ -3654,7 +3655,7 @@ impl<'a> Parser<'a> {
fields.push(f);
}
self.recover_stmt_(SemiColonMode::Comma, BlockMode::Ignore);
self.eat(&token::Comma);
let _ = self.eat(&token::Comma);
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_parse/src/parser/generics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ impl<'a> Parser<'a> {
span: this.prev_token.span,
});

this.eat(&token::Comma);
// Eat a trailing comma, if it exists.
let _ = this.eat(&token::Comma);
}

let param = if this.check_lifetime() {
Expand Down
7 changes: 4 additions & 3 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1192,13 +1192,14 @@ impl<'a> Parser<'a> {
mut safety: Safety,
) -> PResult<'a, ItemInfo> {
let abi = self.parse_abi(); // ABI?
// FIXME: This recovery should be tested better.
if safety == Safety::Default
&& self.token.is_keyword(kw::Unsafe)
&& self.look_ahead(1, |t| t.kind == token::OpenDelim(Delimiter::Brace))
{
self.expect(&token::OpenDelim(Delimiter::Brace)).unwrap_err().emit();
safety = Safety::Unsafe(self.token.span);
self.eat_keyword(kw::Unsafe);
let _ = self.eat_keyword(kw::Unsafe);
}
let module = ast::ForeignMod {
safety,
Expand Down Expand Up @@ -1759,7 +1760,7 @@ impl<'a> Parser<'a> {
}
}
}
self.eat(&token::CloseDelim(Delimiter::Brace));
self.expect(&token::CloseDelim(Delimiter::Brace))?;
} else {
let token_str = super::token_descr(&self.token);
let where_str = if parsed_where { "" } else { "`where`, or " };
Expand Down Expand Up @@ -1902,7 +1903,7 @@ impl<'a> Parser<'a> {
if let Some(_guar) = guar {
// Handle a case like `Vec<u8>>,` where we can continue parsing fields
// after the comma
self.eat(&token::Comma);
let _ = self.eat(&token::Comma);

// `check_trailing_angle_brackets` already emitted a nicer error, as
// proven by the presence of `_guar`. We can continue parsing.
Expand Down
19 changes: 15 additions & 4 deletions compiler/rustc_parse/src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ impl<'a> Parser<'a> {
}

#[inline]
#[must_use]
fn check_noexpect(&self, tok: &TokenKind) -> bool {
self.token == *tok
}
Expand All @@ -556,6 +557,7 @@ impl<'a> Parser<'a> {
/// the main purpose of this function is to reduce the cluttering of the suggestions list
/// which using the normal eat method could introduce in some cases.
#[inline]
#[must_use]
fn eat_noexpect(&mut self, tok: &TokenKind) -> bool {
let is_present = self.check_noexpect(tok);
if is_present {
Expand All @@ -566,6 +568,7 @@ impl<'a> Parser<'a> {

/// Consumes a token 'tok' if it exists. Returns whether the given token was present.
#[inline]
#[must_use]
pub fn eat(&mut self, tok: &TokenKind) -> bool {
let is_present = self.check(tok);
if is_present {
Expand All @@ -577,12 +580,14 @@ impl<'a> Parser<'a> {
/// If the next token is the given keyword, returns `true` without eating it.
/// An expectation is also added for diagnostics purposes.
#[inline]
#[must_use]
fn check_keyword(&mut self, kw: Symbol) -> bool {
self.expected_tokens.push(TokenType::Keyword(kw));
self.token.is_keyword(kw)
}

#[inline]
#[must_use]
fn check_keyword_case(&mut self, kw: Symbol, case: Case) -> bool {
if self.check_keyword(kw) {
return true;
Expand All @@ -602,6 +607,7 @@ impl<'a> Parser<'a> {
/// Otherwise, returns `false`. An expectation is also added for diagnostics purposes.
// Public for rustc_builtin_macros and rustfmt usage.
#[inline]
#[must_use]
pub fn eat_keyword(&mut self, kw: Symbol) -> bool {
if self.check_keyword(kw) {
self.bump();
Expand All @@ -615,6 +621,7 @@ impl<'a> Parser<'a> {
/// If the case differs (and is ignored) an error is issued.
/// This is useful for recovery.
#[inline]
#[must_use]
fn eat_keyword_case(&mut self, kw: Symbol, case: Case) -> bool {
if self.eat_keyword(kw) {
return true;
Expand All @@ -636,6 +643,7 @@ impl<'a> Parser<'a> {
/// Otherwise, returns `false`. No expectation is added.
// Public for rustc_builtin_macros usage.
#[inline]
#[must_use]
pub fn eat_keyword_noexpect(&mut self, kw: Symbol) -> bool {
if self.token.is_keyword(kw) {
self.bump();
Expand All @@ -648,7 +656,7 @@ impl<'a> Parser<'a> {
/// If the given word is not a keyword, signals an error.
/// If the next token is not the given word, signals an error.
/// Otherwise, eats it.
fn expect_keyword(&mut self, kw: Symbol) -> PResult<'a, ()> {
pub fn expect_keyword(&mut self, kw: Symbol) -> PResult<'a, ()> {
if !self.eat_keyword(kw) { self.unexpected() } else { Ok(()) }
}

Expand Down Expand Up @@ -1025,8 +1033,11 @@ impl<'a> Parser<'a> {
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
) -> PResult<'a, (ThinVec<T>, Trailing)> {
let (val, trailing, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
if matches!(recovered, Recovered::No) {
self.eat(ket);
if matches!(recovered, Recovered::No) && !self.eat(ket) {
self.dcx().span_delayed_bug(
self.token.span,
"recovered but `parse_seq_to_before_end` did not give us the ket token",
);
}
Ok((val, trailing))
}
Expand Down Expand Up @@ -1250,7 +1261,7 @@ impl<'a> Parser<'a> {
if pat {
self.psess.gated_spans.gate(sym::inline_const_pat, span);
}
self.eat_keyword(kw::Const);
self.expect_keyword(kw::Const)?;
let (attrs, blk) = self.parse_inner_attrs_and_block()?;
let anon_const = AnonConst {
id: DUMMY_NODE_ID,
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_parse/src/parser/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,8 @@ impl<'a> Parser<'a> {
}

// Generic arguments are found - `<`, `(`, `::<` or `::(`.
self.eat(&token::PathSep);
// First, eat `::` if it exists.
let _ = self.eat(&token::PathSep);
let lo = self.token.span;
let args = if self.eat_lt() {
// `<'a, T, A = U>`
Expand Down
6 changes: 6 additions & 0 deletions compiler/rustc_passes/src/check_attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,12 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
Target::Fn
| Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent) => {
for other_attr in attrs {
// this covers "sugared doc comments" of the form `/// ...`
// it does not cover `#[doc = "..."]`, which is handled below
if other_attr.is_doc_comment() {
continue;
}

if !ALLOW_LIST.iter().any(|name| other_attr.has_name(*name)) {
self.dcx().emit_err(errors::NakedFunctionIncompatibleAttribute {
span: other_attr.span,
Expand Down
20 changes: 10 additions & 10 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2671,17 +2671,17 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
// Store all seen lifetimes names from outer scopes.
let mut seen_lifetimes = FxHashSet::default();

// We also can't shadow bindings from the parent item
if let RibKind::AssocItem = kind {
let mut add_bindings_for_ns = |ns| {
let parent_rib = self.ribs[ns]
.iter()
.rfind(|r| matches!(r.kind, RibKind::Item(..)))
.expect("associated item outside of an item");
// We also can't shadow bindings from associated parent items.
for ns in [ValueNS, TypeNS] {
for parent_rib in self.ribs[ns].iter().rev() {
seen_bindings.extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span)));
};
add_bindings_for_ns(ValueNS);
add_bindings_for_ns(TypeNS);

// Break at mod level, to account for nested items which are
// allowed to shadow generic param names.
if matches!(parent_rib.kind, RibKind::Module(..)) {
break;
}
}
}

// Forbid shadowing lifetime bindings
Expand Down
6 changes: 5 additions & 1 deletion src/ci/docker/scripts/rfl-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,8 @@ make -C linux LLVM=1 -j$(($(nproc) + 1)) \
make -C linux LLVM=1 -j$(($(nproc) + 1)) \
samples/rust/rust_minimal.o \
samples/rust/rust_print.o \
drivers/net/phy/ax88796b_rust.o
drivers/net/phy/ax88796b_rust.o \
rust/doctests_kernel_generated.o

make -C linux LLVM=1 -j$(($(nproc) + 1)) \
rustdoc
5 changes: 4 additions & 1 deletion src/tools/miri/cargo-miri/src/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,10 @@ pub fn setup(
// for target crates.
let cargo_miri_path = std::env::current_exe().expect("current executable path invalid");
if env::var_os("RUSTC_STAGE").is_some() {
assert!(env::var_os("RUSTC").is_some());
assert!(
env::var_os("RUSTC").is_some() && env::var_os("RUSTC_WRAPPER").is_some(),
"cargo-miri setup is running inside rustc bootstrap but RUSTC or RUST_WRAPPER is not set"
);
command.env("RUSTC_REAL", &cargo_miri_path);
} else {
command.env("RUSTC", &cargo_miri_path);
Expand Down
12 changes: 7 additions & 5 deletions src/tools/rustfmt/src/parse/macros/lazy_static.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,17 @@ pub(crate) fn parse_lazy_static(
}
while parser.token.kind != TokenKind::Eof {
// Parse a `lazy_static!` item.
// FIXME: These `eat_*` calls should be converted to `parse_or` to avoid
// silently formatting malformed lazy-statics.
let vis = parse_or!(parse_visibility, rustc_parse::parser::FollowedByType::No);
parser.eat_keyword(kw::Static);
parser.eat_keyword(kw::Ref);
let _ = parser.eat_keyword(kw::Static);
let _ = parser.eat_keyword(kw::Ref);
let id = parse_or!(parse_ident);
parser.eat(&TokenKind::Colon);
let _ = parser.eat(&TokenKind::Colon);
let ty = parse_or!(parse_ty);
parser.eat(&TokenKind::Eq);
let _ = parser.eat(&TokenKind::Eq);
let expr = parse_or!(parse_expr);
parser.eat(&TokenKind::Semi);
let _ = parser.eat(&TokenKind::Semi);
result.push((vis, id, ty, expr));
}

Expand Down
2 changes: 1 addition & 1 deletion src/tools/tidy/src/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ fn check_error_codes_tests(
if !found_code {
verbose_print!(
verbose,
"warning: Error code {code}`` has a UI test file, but doesn't contain its own error code!"
"warning: Error code `{code}` has a UI test file, but doesn't contain its own error code!"
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion tests/crashes/119716-2.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//@ known-bug: #119716
#![feature(non_lifetime_binders)]
trait Trait<T> {}
fn f<T>() -> impl for<T> Trait<impl Trait<T>> {}
fn f() -> impl for<T> Trait<impl Trait<T>> {}
2 changes: 1 addition & 1 deletion tests/crashes/123809.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//@ known-bug: #123809
type Positive = std::pat::pattern_type!(std::pat:: is 0..);
type Positive = std::pat::pattern_type!(std::pat is 0..);

pub fn main() {}
3 changes: 3 additions & 0 deletions tests/ui/asm/naked-functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,9 @@ pub unsafe extern "C" fn compatible_target_feature() {
}

#[doc = "foo bar baz"]
/// a doc comment
// a normal comment
#[doc(alias = "ADocAlias")]
#[naked]
pub unsafe extern "C" fn compatible_doc_attributes() {
asm!("", options(noreturn, raw));
Expand Down
1 change: 1 addition & 0 deletions tests/ui/backtrace/synchronized-panic-handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
//@ edition:2021
//@ exec-env:RUST_BACKTRACE=0
//@ needs-threads
//@ needs-unwind
use std::thread;
const PANIC_MESSAGE: &str = "oops oh no woe is me";

Expand Down
4 changes: 2 additions & 2 deletions tests/ui/backtrace/synchronized-panic-handler.run.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
thread '<unnamed>' panicked at $DIR/synchronized-panic-handler.rs:10:5:
thread '<unnamed>' panicked at $DIR/synchronized-panic-handler.rs:11:5:
oops oh no woe is me
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread '<unnamed>' panicked at $DIR/synchronized-panic-handler.rs:10:5:
thread '<unnamed>' panicked at $DIR/synchronized-panic-handler.rs:11:5:
oops oh no woe is me
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ fn bug<const N: Nat>(&self)
where
for<const N: usize = 3, T = u32> [(); COT::BYTES]:,
//~^ ERROR only lifetime parameters can be used in this context
//~^^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
//~^^^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
//~^^^^ ERROR failed to resolve: use of undeclared type `COT`
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
//~| ERROR failed to resolve: use of undeclared type `COT`
//~| ERROR the name `N` is already used for a generic parameter in this item's generic parameters
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ LL | fn bug<const N: Nat>(&self)
|
= note: associated functions are those in `impl` or `trait` definitions

error[E0403]: the name `N` is already used for a generic parameter in this item's generic parameters
--> $DIR/ice-predicates-of-no-entry-found-for-key-119275.rs:10:15
|
LL | fn bug<const N: Nat>(&self)
| - first use of `N`
...
LL | for<const N: usize = 3, T = u32> [(); COT::BYTES]:,
| ^ already used

error[E0412]: cannot find type `Nat` in this scope
--> $DIR/ice-predicates-of-no-entry-found-for-key-119275.rs:6:17
|
Expand Down Expand Up @@ -40,7 +49,7 @@ error[E0433]: failed to resolve: use of undeclared type `COT`
LL | for<const N: usize = 3, T = u32> [(); COT::BYTES]:,
| ^^^ use of undeclared type `COT`

error: aborting due to 6 previous errors
error: aborting due to 7 previous errors

Some errors have detailed explanations: E0412, E0433, E0658.
For more information about an error, try `rustc --explain E0412`.
Some errors have detailed explanations: E0403, E0412, E0433, E0658.
For more information about an error, try `rustc --explain E0403`.
18 changes: 18 additions & 0 deletions tests/ui/traits/non_lifetime_binders/shadowed.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#![feature(non_lifetime_binders)]
//~^ WARN the feature `non_lifetime_binders` is incomplete

fn function<T>() where for<T> (): Sized {}
//~^ ERROR the name `T` is already used for a generic parameter

struct Struct<T>(T) where for<T> (): Sized;
//~^ ERROR the name `T` is already used for a generic parameter

impl<T> Struct<T> {
fn method() where for<T> (): Sized {}
//~^ ERROR the name `T` is already used for a generic parameter
}

fn repeated() where for<T, T> (): Sized {}
//~^ ERROR the name `T` is already used for a generic parameter

fn main() {}
Loading
Loading