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 7 pull requests #101910

Closed
wants to merge 22 commits into from

Commits on Jul 22, 2022

  1. Configuration menu
    Copy the full SHA
    e2866c0 View commit details
    Browse the repository at this point in the history

Commits on Aug 4, 2022

  1. Configuration menu
    Copy the full SHA
    d00928a View commit details
    Browse the repository at this point in the history

Commits on Aug 27, 2022

  1. Configuration menu
    Copy the full SHA
    3f2ce06 View commit details
    Browse the repository at this point in the history

Commits on Sep 14, 2022

  1. Configuration menu
    Copy the full SHA
    d7b9221 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    d657d1f View commit details
    Browse the repository at this point in the history

Commits on Sep 15, 2022

  1. Stabilize the let_else feature

    est31 committed Sep 15, 2022
    Configuration menu
    Copy the full SHA
    bca3cf7 View commit details
    Browse the repository at this point in the history
  2. Remove feature gate from let else suggestion

    The let else suggestion added by 0d92752
    does not need a feature gate any more.
    est31 committed Sep 15, 2022
    Configuration menu
    Copy the full SHA
    5633e86 View commit details
    Browse the repository at this point in the history
  3. Only enable the let_else feature on bootstrap

    On later stages, the feature is already stable.
    
    Result of running:
    
    rg -l "feature.let_else" compiler/ src/librustdoc/ library/ | xargs sed -s -i "s#\\[feature.let_else#\\[cfg_attr\\(bootstrap, feature\\(let_else\\)#"
    est31 committed Sep 15, 2022
    Configuration menu
    Copy the full SHA
    173eb6f View commit details
    Browse the repository at this point in the history
  4. Remove the let_else feature gate from the testsuite

    Result of running:
    
    rg -l "feature.let_else" src/test/  | xargs sed -s -i "s#^...feature.let_else..\$##"
    
    Plus manual tidy fixes.
    est31 committed Sep 15, 2022
    Configuration menu
    Copy the full SHA
    9c7ae38 View commit details
    Browse the repository at this point in the history
  5. Fix clippy

    est31 committed Sep 15, 2022
    Configuration menu
    Copy the full SHA
    37dde3f View commit details
    Browse the repository at this point in the history

Commits on Sep 16, 2022

  1. Add a new component, rust-json-docs, to distribute the JSON-formatt…

    …ed documentation for std crates in nightly toolchains.
    
    We also add a new flag to `x doc`, `--json`, to render the JSON-formatted version alongside the HTML-formatted one.
    Luca Palmieri committed Sep 16, 2022
    Configuration menu
    Copy the full SHA
    ccd4383 View commit details
    Browse the repository at this point in the history
  2. more simple formatting

    Rageking8 committed Sep 16, 2022
    Configuration menu
    Copy the full SHA
    d433efa View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    99c0071 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    7cf67bf View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    28956d1 View commit details
    Browse the repository at this point in the history
  6. Rollup merge of rust-lang#93628 - est31:stabilize_let_else, r=joshtri…

    …plett
    
    Stabilize `let else`
    
    :tada:  **Stabilizes the `let else` feature, added by [RFC 3137](rust-lang/rfcs#3137 🎉
    
    Reference PR: rust-lang/reference#1156
    
    closes rust-lang#87335 (`let else` tracking issue)
    
    FCP: rust-lang#93628 (comment)
    
    ----------
    
    ## Stabilization report
    
    ### Summary
    
    The feature allows refutable patterns in `let` statements if the expression is
    followed by a diverging `else`:
    
    ```Rust
    fn get_count_item(s: &str) -> (u64, &str) {
        let mut it = s.split(' ');
        let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
            panic!("Can't segment count item pair: '{s}'");
        };
        let Ok(count) = u64::from_str(count_str) else {
            panic!("Can't parse integer: '{count_str}'");
        };
        (count, item)
    }
    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
    ```
    
    ### Differences from the RFC / Desugaring
    
    Outside of desugaring I'm not aware of any differences between the implementation and the RFC. The chosen desugaring has been changed from the RFC's [original](https://rust-lang.github.io/rfcs/3137-let-else.html#reference-level-explanations). You can read a detailed discussion of the implementation history of it in `@cormacrelf` 's [summary](rust-lang#93628 (comment)) in this thread, as well as the [followup](rust-lang#93628 (comment)). Since that followup, further changes have happened to the desugaring, in rust-lang#98574, rust-lang#99518, rust-lang#99954. The later changes were mostly about the drop order: On match, temporaries drop in the same order as they would for a `let` declaration. On mismatch, temporaries drop before the `else` block.
    
    ### Test cases
    
    In chronological order as they were merged.
    
    Added by df9a2e0 (rust-lang#87688):
    
    * [`ui/pattern/usefulness/top-level-alternation.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/pattern/usefulness/top-level-alternation.rs) to ensure the unreachable pattern lint visits patterns inside `let else`.
    
    Added by 5b95df4 (rust-lang#87688):
    
    * [`ui/let-else/let-else-bool-binop-init.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-bool-binop-init.rs) to ensure that no lazy boolean expressions (using `&&` or `||`) are allowed in the expression, as the RFC mandates.
    * [`ui/let-else/let-else-brace-before-else.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-brace-before-else.rs) to ensure that no `}` directly preceding the `else` is allowed in the expression, as the RFC mandates.
    * [`ui/let-else/let-else-check.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-check.rs) to ensure that `#[allow(...)]` attributes added to the entire `let` statement apply for the `else` block.
    * [`ui/let-else/let-else-irrefutable.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-irrefutable.rs) to ensure that the `irrefutable_let_patterns` lint fires.
    * [`ui/let-else/let-else-missing-semicolon.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-missing-semicolon.rs) to ensure the presence of semicolons at the end of the `let` statement.
    * [`ui/let-else/let-else-non-diverging.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-non-diverging.rs) to ensure the `else` block diverges.
    * [`ui/let-else/let-else-run-pass.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-run-pass.rs) to ensure the feature works in some simple test case settings.
    * [`ui/let-else/let-else-scope.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-scope.rs) to ensure the bindings created by the outer `let` expression are not available in the `else` block of it.
    
    Added by bf7c32a (rust-lang#89965):
    
    * [`ui/let-else/issue-89960.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/issue-89960.rs) as a regression test for the ICE-on-error bug rust-lang#89960 . Later in 102b912 this got removed in favour of more comprehensive tests.
    
    Added by 8565419 (rust-lang#89974):
    
    * [`ui/let-else/let-else-if.rs`](https://github.com/rust-lang/rust/blob/1.58.1/src/test/ui/let-else/let-else-if.rs) to test for the improved error message that points out that `let else if` is not possible.
    
    Added by 9b45713:
    
    * [`ui/let-else/let-else-allow-unused.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-allow-unused.rs) as a regression test for rust-lang#89807, to ensure that `#[allow(...)]` attributes added to the entire `let` statement apply for bindings created by the `let else` pattern.
    
    Added by 61bcd8d (rust-lang#89841):
    
    * [`ui/let-else/let-else-non-copy.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-non-copy.rs) to ensure that a copy is performed out of non-copy wrapper types. This mirrors `if let` behaviour. The test case bases on rustc internal changes originally meant for rust-lang#89933 but then removed from the PR due to the error prior to the improvements of rust-lang#89841.
    * [`ui/let-else/let-else-source-expr-nomove-pass.rs `](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-source-expr-nomove-pass.rs) to ensure that while there is a move of the binding in the successful case, the `else` case can still access the non-matching value. This mirrors `if let` behaviour.
    
    Added by 102b912 (rust-lang#89841):
    
    * [`ui/let-else/let-else-ref-bindings.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-ref-bindings.rs) and [`ui/let-else/let-else-ref-bindings-pass.rs `](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-ref-bindings-pass.rs) to check `ref` and `ref mut` keywords in the pattern work correctly and error when needed.
    
    Added by 2715c5f (rust-lang#89841):
    
    * Match ergonomic tests adapted from the `rfc2005` test suite.
    
    Added by fec8a50 (rust-lang#89841):
    
    * [`ui/let-else/let-else-deref-coercion-annotated.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-deref-coercion-annotated.rs) and [`ui/let-else/let-else-deref-coercion.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-deref-coercion.rs) to check deref coercions.
    
    #### Added since this stabilization report was originally written (2022-02-09)
    
    Added by 76ea566 (rust-lang#94211):
    
    * [`ui/let-else/let-else-destructuring.rs`](https://github.com/rust-lang/rust/blob/1.63.0/src/test/ui/let-else/let-else-destructuring.rs) to give a nice error message if an user tries to do an assignment with a (possibly refutable) pattern and an `else` block, like asked for in rust-lang#93995.
    
    Added by e7730dc (rust-lang#94208):
    
    * [`ui/let-else/let-else-allow-in-expr.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-allow-in-expr.rs) to test whether `#[allow(unused_variables)]` works in the expr, as well as its non presence, as well as putting it on the entire `let else` *affects* the expr, too. This was adding a missing test as pointed out by the stabilization report.
    * Expansion of `ui/let-else/let-else-allow-unused.rs` and `ui/let-else/let-else-check.rs` to ensure that non-presence of `#[allow(unused)]` does issue the unused lint. This was adding a missing test case as pointed out by the stabilization report.
    
    Added by 5bd7106 (rust-lang#94208):
    
    * [`ui/let-else/let-else-slicing-error.rs`](https://github.com/rust-lang/rust/blob/1.61.0/src/test/ui/let-else/let-else-slicing-error.rs), a regression test for rust-lang#92069, which got fixed without addition of a regression test. This resolves a missing test as pointed out by the stabilization report.
    
    Added by 5374688 (rust-lang#98574):
    
    * [`src/test/ui/async-await/async-await-let-else.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/async-await/async-await-let-else.rs) to test the interaction of async/await with `let else`
    
    Added by 6c529de (rust-lang#98574):
    
    * [`src/test/ui/let-else/let-else-temporary-lifetime.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/let-else-temporary-lifetime.rs) as a (partial) regression test for rust-lang#98672
    
    Added by 9b56640 (rust-lang#99518):
    
    * [`src/test/ui/let-else/let-else-temp-borrowck.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/let-else-temporary-lifetime.rs) as a regression test for rust-lang#93951
    * Extension of `src/test/ui/let-else/let-else-temporary-lifetime.rs` to include a partial regression test for rust-lang#98672 (especially regarding `else` drop order)
    
    Added by baf9a7c (rust-lang#99518):
    
    * Extension of `src/test/ui/let-else/let-else-temporary-lifetime.rs` to include a partial regression test for rust-lang#93951, similar to `let-else-temp-borrowck.rs`
    
    Added by 60be2de (rust-lang#99518):
    
    * Extension of `src/test/ui/let-else/let-else-temporary-lifetime.rs` to include a program that can now be compiled thanks to borrow checker implications of rust-lang#99518
    
    Added by 47a7a91 (rust-lang#100132):
    
    * [`src/test/ui/let-else/issue-100103.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/issue-100103.rs), as a regression test for rust-lang#100103, to ensure that there is no ICE when doing `Err(...)?` inside else blocks.
    
    Added by e3c5bd6 (rust-lang#100443):
    
    * [`src/test/ui/let-else/let-else-then-diverge.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/let-else-then-diverge.rs), to verify that there is no unreachable code error with the current desugaring.
    
    Added by 9818526 (rust-lang#100443):
    
    * [`src/test/ui/let-else/issue-94176.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/issue-94176.rs), to make sure that a correct span is emitted for a missing trailing expression error. Regression test for rust-lang#94176.
    
    Added by e182d12 (rust-lang#100434):
    
    * [src/test/ui/unpretty/pretty-let-else.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/unpretty/pretty-let-else.rs), as a regression test to ensure pretty printing works for `let else` (this bug surfaced in many different ways)
    
    Added by e262856 (rust-lang#99954):
    
    * [`src/test/ui/let-else/let-else-temporary-lifetime.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/let-else-temporary-lifetime.rs) extended to contain & borrows as well, as this was identified as an earlier issue with the desugaring: rust-lang#98672 (comment)
    
    Added by 2d8460e (rust-lang#99291):
    
    * [`src/test/ui/let-else/let-else-drop-order.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/let-else-drop-order.rs) a matrix based test for various drop order behaviour of `let else`. Especially, it verifies equality of `let` and `let else` drop orders, [resolving](rust-lang#93628 (comment)) a [stabilization blocker](rust-lang#93628 (comment)).
    
    Added by 1b87ce0 (rust-lang#101410):
    
    * Edit to `src/test/ui/let-else/let-else-temporary-lifetime.rs` to add the `-Zvalidate-mir` flag, as a regression test for rust-lang#99228
    
    Added by af591eb (rust-lang#101410):
    
    * [`src/test/ui/let-else/issue-99975.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui/let-else/issue-99975.rs) as a regression test for the ICE rust-lang#99975.
    
    Added by this PR:
    
    * `ui/let-else/let-else.rs`, a simple run-pass check, similar to `ui/let-else/let-else-run-pass.rs`.
    
    ### Things not currently tested
    
    * ~~The `#[allow(...)]` tests check whether allow works, but they don't check whether the non-presence of allow causes a lint to fire.~~ → *test added by e7730dc*
    * ~~There is no `#[allow(...)]` test for the expression, as there are tests for the pattern and the else block.~~ → *test added by e7730dc*
    * ~~`let-else-brace-before-else.rs` forbids the `let ... = {} else {}` pattern and there is a rustfix to obtain `let ... = ({}) else {}`. I'm not sure whether the `.fixed` files are checked by the tooling that they compile. But if there is no such check, it would be neat to make sure that `let ... = ({}) else {}` compiles.~~ → *test added by e7730dc*
    * ~~rust-lang#92069 got closed as fixed, but no regression test was added. Not sure it's worth to add one.~~ → *test added by 5bd7106*
    * ~~consistency between `let else` and `if let` regarding lifetimes and drop order: rust-lang#93628 (comment) → *test added by 2d8460e*
    
    Edit: they are all tested now.
    
    ### Possible future work / Refutable destructuring assignments
    
    [RFC 2909](https://rust-lang.github.io/rfcs/2909-destructuring-assignment.html) specifies destructuring assignment, allowing statements like `FooBar { a, b, c } = foo();`.
    As it was stabilized, destructuring assignment only allows *irrefutable* patterns, which before the advent of `let else` were the only patterns that `let` supported.
    So the combination of `let else` and destructuring assignments gives reason to think about extensions of the destructuring assignments feature that allow refutable patterns, discussed in rust-lang#93995.
    
    A naive mapping of `let else` to destructuring assignments in the form of `Some(v) = foo() else { ... };` might not be the ideal way. `let else` needs a diverging `else` clause as it introduces new bindings, while assignments have a default behaviour to fall back to if the pattern does not match, in the form of not performing the assignment. Thus, there is no good case to require divergence, or even an `else` clause at all, beyond the need for having *some* introducer syntax so that it is clear to readers that the assignment is not a given (enums and structs look similar). There are better candidates for introducer syntax however than an empty `else {}` clause, like `maybe` which could be added as a keyword on an edition boundary:
    
    ```Rust
    let mut v = 0;
    maybe Some(v) = foo(&v);
    maybe Some(v) = foo(&v) else { bar() };
    ```
    
    Further design discussion is left to an RFC, or the linked issue.
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    d5fadc4 View commit details
    Browse the repository at this point in the history
  7. Rollup merge of rust-lang#98441 - calebzulawski:simd_as, r=oli-obk

    Implement simd_as for pointers
    
    Expands `simd_as` (and `simd_cast`) to handle pointer-to-pointer, pointer-to-integer, and integer-to-pointer conversions.
    
    cc `@programmerjake` `@thomcc`
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    87ecd2d View commit details
    Browse the repository at this point in the history
  8. Rollup merge of rust-lang#101713 - Bryanskiy:AccessLevels, r=petroche…

    …nkov
    
    change AccessLevels representation
    
    Part of RFC (rust-lang#48054). This patch implements effective visibility table with basic methods and change AccessLevels table representation according to it.
    
    r? `@petrochenkov`
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    334b2d4 View commit details
    Browse the repository at this point in the history
  9. Rollup merge of rust-lang#101799 - LukeMathWalker:distribute-json-doc…

    …, r=jyn514
    
    Distribute json doc
    
    # Overview
    
    We add a new component, `rust-json-docs`, to distribute the JSON version of rustdoc's output for public compiler crates (i.e. `std`, `alloc`, `proc_macro`, `core` and `test`).
    As discussed in rust-lang#101383, we do not bundle this up as part of the existing `rust-docs` component since `rustdoc`'s JSON format is still unstable.
    
    # Open questions / Doubts
    
    I tried my best, but I never touched this codebase and I couldn't find much documentation on how `dist` works - I pattern-matched existing code, which might have led to some non-sensical choices in the eyes of people more familiar with the codebase. In particular, I am not sure if my choice of adding a new config flag is appropriate or if the decision to build/not build the JSON docs is more appropriately gated by one of the existing flags.
    Any suggestion is more than welcome.
    
    Closes rust-lang#101383
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    a00a2d3 View commit details
    Browse the repository at this point in the history
  10. Rollup merge of rust-lang#101807 - jackh726:no-gat-defaults, r=lcnr

    Disallow defaults on type GATs
    
    Fixes rust-lang#99205
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    a75fdd9 View commit details
    Browse the repository at this point in the history
  11. Rollup merge of rust-lang#101878 - Rageking8:More-simple-formatting, …

    …r=lcnr
    
    More simple formatting
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    4ffc06a View commit details
    Browse the repository at this point in the history
  12. Rollup merge of rust-lang#101898 - GuillaumeGomez:rm-unused-css, r=no…

    …triddle
    
    Remove some unused CSS rules
    
    Since we now have list of items for the ones on the page, we don't need the CSS rules anymore in the sidebar (`.sidebar a`). As for the `.content` ones, they are used to highlight the items in the page (for definitions and others). Surprisingly enough, `method` and `tymethod` are all replaced with `fnname`.
    
    I also used this opportunity to remove these rules in `ayu.css`:
    
    ```css
    .stab.unstable {}
    h2,
    h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod) {}
    ```
    
    In the second commit, I removed the `.block a.current*` CSS rules as they're overridden by `.sidebar a.current*` CSS rules.
    
    In the third commit I removed unneeded empty rules (that were there to satisfy the `--check-theme` option).
    
    cc `@jsha`
    r? `@notriddle`
    GuillaumeGomez authored Sep 16, 2022
    Configuration menu
    Copy the full SHA
    69ea4ff View commit details
    Browse the repository at this point in the history