Skip to content
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

Rollup of 4 pull requests #132336

Closed
wants to merge 9 commits into from
25 changes: 18 additions & 7 deletions compiler/rustc_mir_build/src/thir/pattern/check_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ enum LetSource {
IfLetGuard,
LetElse,
WhileLet,
Else,
ElseIfLet,
}

struct MatchVisitor<'p, 'tcx> {
Expand Down Expand Up @@ -129,15 +131,20 @@ impl<'p, 'tcx> Visitor<'p, 'tcx> for MatchVisitor<'p, 'tcx> {
// Give a specific `let_source` for the condition.
let let_source = match ex.span.desugaring_kind() {
Some(DesugaringKind::WhileLoop) => LetSource::WhileLet,
_ => LetSource::IfLet,
_ => match self.let_source {
LetSource::Else => LetSource::ElseIfLet,
_ => LetSource::IfLet,
},
};
self.with_let_source(let_source, |this| this.visit_expr(&self.thir[cond]));
self.with_let_source(LetSource::None, |this| {
this.visit_expr(&this.thir[then]);
if let Some(else_) = else_opt {
this.visit_expr(&this.thir[else_]);
}
});
if let Some(else_) = else_opt {
self.with_let_source(LetSource::Else, |this| {
this.visit_expr(&this.thir[else_])
});
}
return;
}
ExprKind::Match { scrutinee, scrutinee_hir_id: _, box ref arms, match_source } => {
Expand Down Expand Up @@ -573,9 +580,13 @@ impl<'p, 'tcx> MatchVisitor<'p, 'tcx> {
// and we shouldn't lint.
// For let guards inside a match, prefixes might use bindings of the match pattern,
// so can't always be moved out.
// For `else if let`, an extra indentation level would be required to move the bindings.
// FIXME: Add checking whether the bindings are actually used in the prefix,
// and lint if they are not.
if !matches!(self.let_source, LetSource::WhileLet | LetSource::IfLetGuard) {
if !matches!(
self.let_source,
LetSource::WhileLet | LetSource::IfLetGuard | LetSource::ElseIfLet
) {
// Emit the lint
let prefix = &chain_refutabilities[..until];
let span_start = prefix[0].unwrap().0;
Expand Down Expand Up @@ -906,8 +917,8 @@ fn report_irrefutable_let_patterns(
}

match source {
LetSource::None | LetSource::PlainLet => bug!(),
LetSource::IfLet => emit_diag!(IrrefutableLetPatternsIfLet),
LetSource::None | LetSource::PlainLet | LetSource::Else => bug!(),
LetSource::IfLet | LetSource::ElseIfLet => emit_diag!(IrrefutableLetPatternsIfLet),
LetSource::IfLetGuard => emit_diag!(IrrefutableLetPatternsIfLetGuard),
LetSource::LetElse => emit_diag!(IrrefutableLetPatternsLetElse),
LetSource::WhileLet => emit_diag!(IrrefutableLetPatternsWhileLet),
Expand Down
4 changes: 2 additions & 2 deletions src/doc/rustc/src/platform-support/aix.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ Rust for AIX operating system, currently only 64-bit PowerPC is supported.

## Target maintainers

- QIU Chaofan `qiucofan@cn.ibm.com`, /~https://github.com/ecnelises
- Kai LUO, `lkail@cn.ibm.com`, /~https://github.com/bzEq
- David Tenty `daltenty@ibm.com`, /~https://github.com/daltenty
- Chris Cambly, `ccambly@ca.ibm.com`, /~https://github.com/gilamn5tr

## Requirements

Expand Down
12 changes: 2 additions & 10 deletions src/doc/rustc/src/platform-support/fuchsia.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,9 @@ updatable, and performant.

## Target maintainers

The [Fuchsia team]:
See [`fuchsia.toml`] in the `team` repository for current target maintainers.

- Tyler Mandry ([@tmandry](/~https://github.com/tmandry))
- David Koloski ([@djkoloski](/~https://github.com/djkoloski))
- Julia Ryan ([@P1n3appl3](/~https://github.com/P1n3appl3))
- Erick Tryzelaar ([@erickt](/~https://github.com/erickt))

As the team evolves over time, the specific members listed here may differ from
the members reported by the API. The API should be considered to be
authoritative if this occurs. Instead of pinging individual members, use
`@rustbot ping fuchsia` to contact the team on GitHub.
[`fuchsia.toml`]: /~https://github.com/rust-lang/team/blob/master/teams/fuchsia.toml

## Table of contents

Expand Down
4 changes: 0 additions & 4 deletions src/librustdoc/doctest/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,6 @@ fn generate_mergeable_doctest(
} else {
writeln!(output, "mod {test_id} {{\n{}{}", doctest.crates, doctest.maybe_crate_attrs)
.unwrap();
if scraped_test.langstr.no_run {
// To prevent having warnings about unused items since they're not called.
writeln!(output, "#![allow(unused)]").unwrap();
}
if doctest.has_main_fn {
output.push_str(&doctest.everything_else);
} else {
Expand Down
15 changes: 15 additions & 0 deletions tests/rustdoc-ui/doctest/dead-code-2024.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// This test ensures that the 2024 edition merged doctest will not use `#[allow(unused)]`.

//@ compile-flags:--test -Zunstable-options --edition 2024
//@ normalize-stdout-test: "tests/rustdoc-ui/doctest" -> "$$DIR"
//@ normalize-stdout-test: "finished in \d+\.\d+s" -> "finished in $$TIME"
//@ failure-status: 101

#![doc(test(attr(allow(unused_variables), deny(warnings))))]

/// Example
///
/// ```rust,no_run
/// trait T { fn f(); }
/// ```
pub fn f() {}
29 changes: 29 additions & 0 deletions tests/rustdoc-ui/doctest/dead-code-2024.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

running 1 test
test $DIR/dead-code-2024.rs - f (line 12) - compile ... FAILED

failures:

---- $DIR/dead-code-2024.rs - f (line 12) stdout ----
error: trait `T` is never used
--> $DIR/dead-code-2024.rs:13:7
|
LL | trait T { fn f(); }
| ^
|
note: the lint level is defined here
--> $DIR/dead-code-2024.rs:11:9
|
LL | #![deny(warnings)]
| ^^^^^^^^
= note: `#[deny(dead_code)]` implied by `#[deny(warnings)]`

error: aborting due to 1 previous error

Couldn't compile the test.

failures:
$DIR/dead-code-2024.rs - f (line 12)

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME

15 changes: 15 additions & 0 deletions tests/rustdoc-ui/doctest/dead-code.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// This test ensures that the doctest will not use `#[allow(unused)]`.

//@ compile-flags:--test
//@ normalize-stdout-test: "tests/rustdoc-ui/doctest" -> "$$DIR"
//@ normalize-stdout-test: "finished in \d+\.\d+s" -> "finished in $$TIME"
//@ failure-status: 101

#![doc(test(attr(allow(unused_variables), deny(warnings))))]

/// Example
///
/// ```rust,no_run
/// trait T { fn f(); }
/// ```
pub fn f() {}
29 changes: 29 additions & 0 deletions tests/rustdoc-ui/doctest/dead-code.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@

running 1 test
test $DIR/dead-code.rs - f (line 12) - compile ... FAILED

failures:

---- $DIR/dead-code.rs - f (line 12) stdout ----
error: trait `T` is never used
--> $DIR/dead-code.rs:13:7
|
LL | trait T { fn f(); }
| ^
|
note: the lint level is defined here
--> $DIR/dead-code.rs:11:9
|
LL | #![deny(warnings)]
| ^^^^^^^^
= note: `#[deny(dead_code)]` implied by `#[deny(warnings)]`

error: aborting due to 1 previous error

Couldn't compile the test.

failures:
$DIR/dead-code.rs - f (line 12)

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME

Original file line number Diff line number Diff line change
Expand Up @@ -111,5 +111,23 @@ LL | while let Some(ref first) = opt && let second = first && let _third = s
= note: these patterns will always match
= help: consider moving them into the body

error: aborting due to 12 previous errors
error: trailing irrefutable pattern in let chain
--> $DIR/irrefutable-lets.rs:87:12
|
LL | && let x = &opt
| ^^^^^^^^^^^^
|
= note: this pattern will always match
= help: consider moving it into the body

error: leading irrefutable pattern in let chain
--> $DIR/irrefutable-lets.rs:93:12
|
LL | if let x = opt.clone().map(|_| 1)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this pattern will always match
= help: consider moving it outside of the construct

error: aborting due to 14 previous errors

20 changes: 20 additions & 0 deletions tests/ui/rfcs/rfc-2497-if-let-chains/irrefutable-lets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,24 @@ fn main() {
&& let Range { start: local_start, end: _ } = first
&& let None = local_start {
}

// No error. An extra nesting level would be required for the `else if`.
if opt == Some(None..None) {
} else if let x = opt.clone().map(|_| 1)
&& x == Some(1)
{}

if opt == Some(None..None) {
} else if opt.is_some()
&& let x = &opt
//[disallowed]~^ ERROR trailing irrefutable pattern in let chain
{}

if opt == Some(None..None) {
} else {
if let x = opt.clone().map(|_| 1)
//[disallowed]~^ ERROR leading irrefutable pattern in let chain
&& x == Some(1)
{}
}
}
Loading