From a74bcb71f19f61d50c0c1fc254007205cfcefb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Sun, 5 Jan 2025 18:12:52 +0100 Subject: [PATCH 01/52] Preparing for merge from rustc --- rust-version | 1 + 1 file changed, 1 insertion(+) diff --git a/rust-version b/rust-version index e69de29b..876c32dc 100644 --- a/rust-version +++ b/rust-version @@ -0,0 +1 @@ +dcfa38fe234de9304169afc6638e81d0dd222c06 From 42160c343a42a3895a27c9bb0e4637b3cb0e2616 Mon Sep 17 00:00:00 2001 From: Boxy Date: Sun, 5 Jan 2025 18:57:03 +0000 Subject: [PATCH 02/52] add josh-sync build dir to gitignore (#2196) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 160c5f0f..f03fcae7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ ci/date-check/target/ # Generated by check-in.sh pulls.json + +josh-sync/target From 1dad69ebd457edf61377ae3041ab8e3858255f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 6 Jan 2025 11:30:59 +0100 Subject: [PATCH 03/52] Add rustc-dev-guide to the list of repositories managed by josh (#2197) --- src/external-repos.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/external-repos.md b/src/external-repos.md index a7ab3d77..8f981930 100644 --- a/src/external-repos.md +++ b/src/external-repos.md @@ -21,6 +21,7 @@ The following external projects are managed using some form of a `subtree`: * [rustfmt](https://github.com/rust-lang/rustfmt) * [rust-analyzer](https://github.com/rust-lang/rust-analyzer) * [rustc_codegen_cranelift](https://github.com/rust-lang/rustc_codegen_cranelift) +* [rustc-dev-guide](https://github.com/rust-lang/rustc-dev-guide) In contrast to `submodule` dependencies (see below for those), the `subtree` dependencies are just regular files and directories which can @@ -38,8 +39,9 @@ implement a new tool feature or test, that should happen in one collective rustc * Using the [josh] tool * `miri` ([sync guide](https://github.com/rust-lang/miri/blob/master/CONTRIBUTING.md#advanced-topic-syncing-with-the-rustc-repo)) * `rust-analyzer` ([sync script](https://github.com/rust-lang/rust-analyzer/blob/2e13684be123eca7181aa48e043e185d8044a84a/xtask/src/release.rs#L147)) + * `rustc-dev-guide` ([sync guide](https://github.com/rust-lang/rustc-dev-guide#synchronizing-josh-subtree-with-rustc)) -The [josh] tool is an alternative to git subtrees, which manages git history in a different way and scales better to larger repositories. Specific tooling is required to work with josh, you can check out the `miri` or `rust-analyzer` scripts linked above for inspiration. If you want to migrate a subtree from `git subtree` to josh, you can check out [this guide](https://hackmd.io/7pOuxnkdQDaL1Y1FQr65xg). +The [josh] tool is an alternative to git subtrees, which manages git history in a different way and scales better to larger repositories. Specific tooling is required to work with josh, you can check out the `miri` or `rust-analyzer` scripts linked above for inspiration. If you want to migrate a repository dependency from `git subtree` or `git submodule` to josh, you can check out [this guide](https://hackmd.io/7pOuxnkdQDaL1Y1FQr65xg). Below you can find a guide on how to perform push and pull synchronization with the main rustc repo using `git subtree`, although these instructions might differ repo from repo. From 32835d18d80af8c47d6167172ea37712628277b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= <39484203+jieyouxu@users.noreply.github.com> Date: Mon, 6 Jan 2025 00:32:06 +0800 Subject: [PATCH 04/52] Only keep label description in Forge docs --- src/contributing.md | 62 +-------------------------------------------- 1 file changed, 1 insertion(+), 61 deletions(-) diff --git a/src/contributing.md b/src/contributing.md index ad1d3326..9817326f 100644 --- a/src/contributing.md +++ b/src/contributing.md @@ -422,68 +422,8 @@ Just a few things to keep in mind: ## Issue triage -Sometimes, an issue will stay open, even though the bug has been fixed. -And sometimes, the original bug may go stale because something has changed in the meantime. +Please see . -It can be helpful to go through older bug reports and make sure that they are still valid. -Load up an older issue, double check that it's still true, -and leave a comment letting us know if it is or is not. -The [least recently updated sort][lru] is good for finding issues like this. - -[Thanks to `@rustbot`][rustbot], anyone can help triage issues by adding -appropriate labels to issues that haven't been triaged yet: - -[lru]: https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc -[rustbot]: ./rustbot.md - - - -| Labels | Color | Description | -|--------|-------|-------------| -| [A-] |  Yellow | The **area** of the project an issue relates to. | -| [B-] |  Magenta | Issues which are **blockers**. | -| [beta-] |  Dark Blue | Tracks changes which need to be [backported to beta][beta-backport] | -| [C-] |  Light Purple | The **category** of an issue. | -| [D-] |  Mossy Green | Issues for **diagnostics**. | -| [E-] |  Green | The **experience** level necessary to fix an issue. | -| [F-] |  Peach | Issues for **nightly features**. | -| [I-] |  Red | The **importance** of the issue. | -| [I-\*-nominated] |  Red | The issue has been nominated for discussion at the next meeting of the corresponding team. | -| [I-prioritize] |  Red | The issue has been nominated for prioritization by the team tagged with a **T**-prefixed label. | -| [L-] |  Teal | The relevant **lint**. | -| [metabug] |  Purple | Bugs that collect other bugs. | -| [O-] |  Purple Grey | The **operating system** or platform that the issue is specific to. | -| [P-] |  Orange | The issue **priority**. These labels can be assigned by anyone that understand the issue and is able to prioritize it, and remove the [I-prioritize] label. | -| [regression-] |  Pink | Tracks regressions from a stable release. | -| [relnotes] |  Light Orange | Changes that should be documented in the release notes of the next release. | -| [S-] |  Gray | Tracks the **status** of pull requests. | -| [S-tracking-] |  Steel Blue | Tracks the **status** of [tracking issues]. | -| [stable-] |  Dark Blue | Tracks changes which need to be [backported to stable][stable-backport] in anticipation of a point release. | -| [T-] |  Blue | Denotes which **team** the issue belongs to. | -| [WG-] |  Green | Denotes which **working group** the issue belongs to. | - - -[A-]: https://github.com/rust-lang/rust/labels?q=A -[B-]: https://github.com/rust-lang/rust/labels?q=B -[C-]: https://github.com/rust-lang/rust/labels?q=C -[D-]: https://github.com/rust-lang/rust/labels?q=D -[E-]: https://github.com/rust-lang/rust/labels?q=E -[F-]: https://github.com/rust-lang/rust/labels?q=F -[I-]: https://github.com/rust-lang/rust/labels?q=I -[L-]: https://github.com/rust-lang/rust/labels?q=L -[O-]: https://github.com/rust-lang/rust/labels?q=O -[P-]: https://github.com/rust-lang/rust/labels?q=P -[S-]: https://github.com/rust-lang/rust/labels?q=S -[T-]: https://github.com/rust-lang/rust/labels?q=T -[WG-]: https://github.com/rust-lang/rust/labels?q=WG [stable-]: https://github.com/rust-lang/rust/labels?q=stable [beta-]: https://github.com/rust-lang/rust/labels?q=beta [I-\*-nominated]: https://github.com/rust-lang/rust/labels?q=nominated From 0fd52366ca06dc505859b6dba7bea4e6ed959818 Mon Sep 17 00:00:00 2001 From: Max Heller Date: Tue, 7 Jan 2025 03:00:59 -0500 Subject: [PATCH 05/52] Fix broken raw HTML (#2198) --- src/appendix/glossary.md | 2 +- src/bug-fix-procedure.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appendix/glossary.md b/src/appendix/glossary.md index bf3475a9..a7c3236d 100644 --- a/src/appendix/glossary.md +++ b/src/appendix/glossary.md @@ -69,7 +69,7 @@ Term | Meaning rib | A data structure in the name resolver that keeps track of a single scope for names. ([see more](../name-resolution.md)) RPIT | A return-position `impl Trait`. ([see the reference](https://doc.rust-lang.org/reference/types/impl-trait.html#abstract-return-types)). RPITIT | A return-position `impl Trait` in trait. Unlike RPIT, this is desugared to a generic associated type (GAT). Introduced in [RFC 3425](https://rust-lang.github.io/rfcs/3425-return-position-impl-trait-in-traits.html). ([see more](../return-position-impl-trait-in-trait.md)) -scrutinee | A scrutinee is the expression that is matched on in `match` expressions and similar pattern matching constructs. For example, in `match x { A => 1, B => 2 }`, the expression `x` is the scrutinee. +scrutinee | A scrutinee is the expression that is matched on in `match` expressions and similar pattern matching constructs. For example, in `match x { A => 1, B => 2 }`, the expression `x` is the scrutinee. `sess` | The compiler _session_, which stores global data used throughout compilation side tables | Because the [AST](#ast) and HIR are immutable once created, we often carry extra information about them in the form of hashtables, indexed by the id of a particular node. sigil | Like a keyword but composed entirely of non-alphanumeric tokens. For example, `&` is a sigil for references. diff --git a/src/bug-fix-procedure.md b/src/bug-fix-procedure.md index 4857cf5e..e6a16df6 100644 --- a/src/bug-fix-procedure.md +++ b/src/bug-fix-procedure.md @@ -227,7 +227,7 @@ that we use for unstable features: Ideally, breaking changes should have landed on the **stable branch** of the compiler before they are finalized. - + ### Removing a lint From 55ac466fd7ffacc7e6d5b274a56b292738a57442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Wed, 8 Jan 2025 13:40:40 +0100 Subject: [PATCH 06/52] Preparing for merge from rustc --- rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-version b/rust-version index 876c32dc..651db786 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -dcfa38fe234de9304169afc6638e81d0dd222c06 +9c87288a7d2f03625a813df6d3bfe43c09ad4f5a From 57d1e6b068512d2dd52e7e90a2b96240899ff36a Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 6 Jan 2025 08:58:29 +0100 Subject: [PATCH 07/52] Save linkcheck cache always --- .github/workflows/ci.yml | 22 ++++++++++++++++------ book.toml | 4 +++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07c20d8d..1b5c4141 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,12 +35,13 @@ jobs: ~/.cargo/bin key: ${{ runner.os }}-${{ env.MDBOOK_VERSION }}--${{ env.MDBOOK_LINKCHECK2_VERSION }}--${{ env.MDBOOK_TOC_VERSION }}--${{ env.MDBOOK_MERMAID_VERSION }} - - name: Cache linkcheck - uses: actions/cache@v4 + - name: Restore cached Linkcheck + if: github.event_name == 'schedule' + id: cache-linkcheck-restore + uses: actions/cache/restore@v4 with: - path: | - ~/book/linkcheck - key: ${{ runner.os }}-${{ hashFiles('./book/linkcheck') }} + path: book/linkcheck/cache.json + key: linkcheck - name: Install latest nightly Rust toolchain if: steps.mdbook-cache.outputs.cache-hit != 'true' @@ -57,7 +58,16 @@ jobs: cargo install mdbook-mermaid --version ${{ env.MDBOOK_MERMAID_VERSION }} - name: Check build - run: ENABLE_LINKCHECK=1 mdbook build + run: mdbook build + continue-on-error: true + + - name: Save cached Linkcheck + id: cache-linkcheck-save + if: github.event_name == 'schedule' + uses: actions/cache/save@v4 + with: + path: book/linkcheck/cache.json + key: linkcheck - name: Deploy to gh-pages if: github.event_name == 'push' diff --git a/book.toml b/book.toml index 2f67aecf..67069d99 100644 --- a/book.toml +++ b/book.toml @@ -52,7 +52,9 @@ exclude = [ # 500 is returned for HEAD request "code\\.visualstudio\\.com/docs/editor/tasks", ] -cache-timeout = 86400 +# The scheduled CI runs every day and so we need to reuse a part of the cache +# in order to face "Server returned 429 Too Many Requests" errors for github.com. +cache-timeout = 90000 warning-policy = "error" [output.html.redirect] From 10c76e1bfc6fe65c0dd0c3304349ae12339758bb Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 8 Jan 2025 17:06:15 +0100 Subject: [PATCH 08/52] Update key --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b5c4141..3c45ad16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: uses: actions/cache/restore@v4 with: path: book/linkcheck/cache.json - key: linkcheck + key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }} - name: Install latest nightly Rust toolchain if: steps.mdbook-cache.outputs.cache-hit != 'true' @@ -58,7 +58,7 @@ jobs: cargo install mdbook-mermaid --version ${{ env.MDBOOK_MERMAID_VERSION }} - name: Check build - run: mdbook build + run: ENABLE_LINKCHECK=1 mdbook build continue-on-error: true - name: Save cached Linkcheck @@ -67,7 +67,7 @@ jobs: uses: actions/cache/save@v4 with: path: book/linkcheck/cache.json - key: linkcheck + key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }} - name: Deploy to gh-pages if: github.event_name == 'push' From c92957d38a6486dbcb7ac0668e4b24b02f94ccbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Wed, 8 Jan 2025 15:26:14 +0100 Subject: [PATCH 09/52] Print an explicit message if the base repo head commit is up-to-date --- josh-sync/src/sync.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/josh-sync/src/sync.rs b/josh-sync/src/sync.rs index da21a4c9..1c1757a4 100644 --- a/josh-sync/src/sync.rs +++ b/josh-sync/src/sync.rs @@ -45,6 +45,11 @@ impl GitSync { let josh_url = format!("http://localhost:{JOSH_PORT}/{UPSTREAM_REPO}.git@{commit}{JOSH_FILTER}.git"); + let previous_base_commit = sh.read_file("rust-version")?.trim().to_string(); + if previous_base_commit == commit { + return Err(anyhow::anyhow!("No changes since last pull")); + } + // Update rust-version file. As a separate commit, since making it part of // the merge has confused the heck out of josh in the past. // We pass `--no-verify` to avoid running git hooks. From 482ebfbbae7d4a4b20b25378c4ba2d13a1734101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Wed, 8 Jan 2025 17:17:03 +0100 Subject: [PATCH 10/52] Error if there is nothing to pull --- josh-sync/src/sync.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/josh-sync/src/sync.rs b/josh-sync/src/sync.rs index 1c1757a4..eff80b10 100644 --- a/josh-sync/src/sync.rs +++ b/josh-sync/src/sync.rs @@ -81,12 +81,22 @@ impl GitSync { }; let num_roots_before = num_roots()?; + let sha = cmd!(sh, "git rev-parse HEAD").output().context("FAILED to get current commit")?.stdout; + // Merge the fetched commit. const MERGE_COMMIT_MESSAGE: &str = "Merge from rustc"; cmd!(sh, "git merge FETCH_HEAD --no-verify --no-ff -m {MERGE_COMMIT_MESSAGE}") .run() .context("FAILED to merge new commits, something went wrong")?; + let current_sha = cmd!(sh, "git rev-parse HEAD").output().context("FAILED to get current commit")?.stdout; + if current_sha == sha { + cmd!(sh, "git reset --hard HEAD^") + .run() + .expect("FAILED to clean up after creating the preparation commit"); + return Err(anyhow::anyhow!("No merge was performed, nothing to pull. Rolled back the preparation commit.")); + } + // Check that the number of roots did not increase. if num_roots()? != num_roots_before { bail!("Josh created a new root commit. This is probably not the history you want."); From bb0051a0061b8f20484cad3ba315163118ea62ad Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Thu, 9 Jan 2025 13:24:42 -0800 Subject: [PATCH 11/52] ci: Remove incorrect use of `continue-on-error` This will cause the CI build to be marked successful even if the build failed. Instead, use `if: '!cancelled()'` to always save the cache (except when the job is cancelled), even if the linkcheck failed. See https://stackoverflow.com/a/58859404 for more. --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c45ad16..006bcce4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,11 +59,10 @@ jobs: - name: Check build run: ENABLE_LINKCHECK=1 mdbook build - continue-on-error: true - name: Save cached Linkcheck id: cache-linkcheck-save - if: github.event_name == 'schedule' + if: ${{ !cancelled() && github.event_name == 'schedule' }} uses: actions/cache/save@v4 with: path: book/linkcheck/cache.json From 42768820febab846c1bdf326fe81705af65920f4 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 10 Jan 2025 08:16:37 -0800 Subject: [PATCH 12/52] Document how to find the configuration used in CI This documents how to determine which settings are used in CI, since I see this question come up regularly. We currently don't have a great way to answer the question, but at least there is something. --- src/tests/ci.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/tests/ci.md b/src/tests/ci.md index 5e27a2fd..3940928f 100644 --- a/src/tests/ci.md +++ b/src/tests/ci.md @@ -410,6 +410,21 @@ To learn more about the dashboard, see the [Datadog CI docs]. [Datadog CI docs]: https://docs.datadoghq.com/continuous_integration/ [public dashboard]: https://p.datadoghq.com/sb/3a172e20-e9e1-11ed-80e3-da7ad0900002-b5f7bb7e08b664a06b08527da85f7e30 +## Determining the CI configuration + +If you want to determine which `config.toml` settings are used in CI for a +particular job, it is probably easiest to just look at the build log. To do +this: + +1. Go to + + to find the most recently successful build, and click on it. +2. Choose the job you are interested in on the left-hand side. +3. Click on the gear icon and choose "View raw logs" +4. Search for the string "Configure the build" +5. All of the build settings are listed below that starting with the + `configure:` prefix. + [GitHub Actions]: https://github.com/rust-lang/rust/actions [`jobs.yml`]: https://github.com/rust-lang/rust/blob/master/src/ci/github-actions/jobs.yml [`.github/workflows/ci.yml`]: https://github.com/rust-lang/rust/blob/master/.github/workflows/ci.yml From cd9705f029884ccde7b021ed49c42607b174749c Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 10 Jan 2025 08:26:52 -0800 Subject: [PATCH 13/52] Fix calculate-job-matrix.py link --- src/tests/ci.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ci.md b/src/tests/ci.md index 5e27a2fd..e325b8e3 100644 --- a/src/tests/ci.md +++ b/src/tests/ci.md @@ -28,7 +28,7 @@ Our CI is primarily executed on [GitHub Actions], with a single workflow defined in [`.github/workflows/ci.yml`], which contains a bunch of steps that are unified for all CI jobs that we execute. When a commit is pushed to a corresponding branch or a PR, the workflow executes the -[`calculate-job-matrix.py`] script, which dynamically generates the specific CI +[`src/ci/github-actions/ci.py`] script, which dynamically generates the specific CI jobs that should be executed. This script uses the [`jobs.yml`] file as an input, which contains a declarative configuration of all our CI jobs. @@ -413,7 +413,7 @@ To learn more about the dashboard, see the [Datadog CI docs]. [GitHub Actions]: https://github.com/rust-lang/rust/actions [`jobs.yml`]: https://github.com/rust-lang/rust/blob/master/src/ci/github-actions/jobs.yml [`.github/workflows/ci.yml`]: https://github.com/rust-lang/rust/blob/master/.github/workflows/ci.yml -[`calculate-job-matrix.py`]: https://github.com/rust-lang/rust/blob/master/src/ci/github-actions/calculate-job-matrix.py +[`src/ci/github-actions/ci.py`]: https://github.com/rust-lang/rust/blob/master/src/ci/github-actions/ci.py [rust-lang-ci]: https://github.com/rust-lang-ci/rust/actions [bors]: https://github.com/bors [homu]: https://github.com/rust-lang/homu From 4c02798cb44de021b8fffd056bc3a138f9329840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Wed, 8 Jan 2025 17:54:02 +0100 Subject: [PATCH 14/52] Add CI workflow for performing rustc-pull --- .github/workflows/rustc-pull.yml | 55 ++++++++++++++++++++++++++++++++ triagebot.toml | 3 ++ 2 files changed, 58 insertions(+) create mode 100644 .github/workflows/rustc-pull.yml diff --git a/.github/workflows/rustc-pull.yml b/.github/workflows/rustc-pull.yml new file mode 100644 index 00000000..dcb90b84 --- /dev/null +++ b/.github/workflows/rustc-pull.yml @@ -0,0 +1,55 @@ +name: rustc-pull + +on: + workflow_dispatch: + schedule: + # Run at 04:00 UTC every Monday + - cron: '0 4 * * 1' + +jobs: + pull: + if: github.repository == 'rust-lang/rustc-dev-guide' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + # We need the full history for josh to work + fetch-depth: '0' + - name: Install stable Rust toolchain + run: rustup update stable + - uses: Swatinem/rust-cache@v2 + with: + workspaces: "josh-sync" + # Cache the josh directory with checked out rustc + cache-directories: "/home/runner/.cache/rustc-dev-guide-josh" + - name: Install josh + run: RUSTFLAGS="--cap-lints warn" cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r24.10.04 + - name: Setup bot git name and email + run: | + git config --global user.name 'The rustc-dev-guide Cronjob Bot' + git config --global user.email 'github-actions@github.com' + - name: Perform rustc-pull + run: cargo run --manifest-path josh-sync/Cargo.toml -- rustc-pull + - name: Push changes to a branch + run: | + # Update a sticky branch that is used only for rustc pulls + BRANCH="rustc-pull" + git switch -c $BRANCH + git push -u origin $BRANCH --force + - name: Create pull request + run: | + # Check if an open pull request for an rustc pull update already exists + # If it does, the previous push has just updated it + # If not, we create it now + RESULT=`gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | length' --json title` + if [[ "$RESULT" -eq 0 ]]; then + echo "Creating new pull request" + gh pr create -B master --title 'Rustc pull update' --body 'Latest update from rustc.' + else + echo "Updated existing pull request" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/triagebot.toml b/triagebot.toml index ccb0de86..12aa0b7b 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -6,3 +6,6 @@ allow-unauthenticated = [ "waiting-on-author", "blocked", ] + +# Automatically close and reopen PRs made by bots to run CI on them +[bot-pull-requests] From 1cd70aaa2c6d84eae8effc74180ad3b5d6ef16b7 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 14 Jan 2025 17:00:12 +0100 Subject: [PATCH 15/52] rustc-dev-guide: add note about not adding rustc_allowed_through_unstable_modules to more items --- src/stability.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stability.md b/src/stability.md index 1bfe911c..23092525 100644 --- a/src/stability.md +++ b/src/stability.md @@ -34,7 +34,8 @@ Previously, due to a [rustc bug], stable items inside unstable modules were available to stable code in that location. As of September 2024, items with [accidentally stabilized paths] are marked with the `#[rustc_allowed_through_unstable_modules]` attribute -to prevent code dependent on those paths from breaking. +to prevent code dependent on those paths from breaking. Do *not* add this attribute +to any more items unless that is needed to avoid breaking changes. The `unstable` attribute may also have the `soft` value, which makes it a future-incompatible deny-by-default lint instead of a hard error. This is used From 7a4c3d3c30d5dcff62722bfb9edf963e4d8c0c77 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Tue, 14 Jan 2025 21:48:24 -0800 Subject: [PATCH 16/52] Fix some broken links * Rename `StringReader -> Lexer` * Remove deleted `Query` struct * Update some internal links --- src/appendix/code-index.md | 3 +-- src/guides/editions.md | 4 ++-- src/overview.md | 4 ++-- src/the-parser.md | 6 +++--- src/ty_module/param_ty_const_regions.md | 4 ++-- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/appendix/code-index.md b/src/appendix/code-index.md index c33887d7..b96ede68 100644 --- a/src/appendix/code-index.md +++ b/src/appendix/code-index.md @@ -14,17 +14,16 @@ Item | Kind | Short description | Chapter | `Diag` | struct | A struct for a compiler diagnostic, such as an error or lint | [Emitting Diagnostics] | [compiler/rustc_errors/src/diagnostic.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/struct.Diag.html) `DocContext` | struct | A state container used by rustdoc when crawling through a crate to gather its documentation | [Rustdoc] | [src/librustdoc/core.rs](https://github.com/rust-lang/rust/blob/master/src/librustdoc/core.rs) `HirId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [compiler/rustc_hir/src/hir_id.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/hir_id/struct.HirId.html) +`Lexer` | struct | This is the lexer used during parsing. It consumes characters from the raw source code being compiled and produces a series of tokens for use by the rest of the parser | [The parser] | [compiler/rustc_parse/src/lexer/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.Lexer.html) `NodeId` | struct | One of four types of HIR node identifiers. Being phased out | [Identifiers in the HIR] | [compiler/rustc_ast/src/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html) `P` | struct | An owned immutable smart pointer. By contrast, `&T` is not owned, and `Box` is not immutable. | None | [compiler/rustc_ast/src/ptr.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ptr/struct.P.html) `ParamEnv` | struct | Information about generic parameters or `Self`, useful for working with associated or generic items | [Parameter Environment] | [compiler/rustc_middle/src/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamEnv.html) `ParseSess` | struct | This struct contains information about a parsing session | [The parser] | [compiler/rustc_session/src/parse/parse.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.ParseSess.html) -`Query` | struct | Represents the result of query to the `Compiler` interface and allows stealing, borrowing, and returning the results of compiler passes. | [The Rustc Driver and Interface] | [compiler/rustc_interface/src/queries.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/queries/struct.Query.html) `Rib` | struct | Represents a single scope of names | [Name resolution] | [compiler/rustc_resolve/src/lib.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/struct.Rib.html) `Session` | struct | The data associated with a compilation session | [The parser], [The Rustc Driver and Interface] | [compiler/rustc_session/src/session.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/struct.Session.html) `SourceFile` | struct | Part of the `SourceMap`. Maps AST nodes to their source code for a single source file. Was previously called FileMap | [The parser] | [compiler/rustc_span/src/lib.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.SourceFile.html) `SourceMap` | struct | Maps AST nodes to their source code. It is composed of `SourceFile`s. Was previously called CodeMap | [The parser] | [compiler/rustc_span/src/source_map.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html) `Span` | struct | A location in the user's source code, used for error reporting primarily | [Emitting Diagnostics] | [compiler/rustc_span/src/span_encoding.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html) -`StringReader` | struct | This is the lexer used during parsing. It consumes characters from the raw source code being compiled and produces a series of tokens for use by the rest of the parser | [The parser] | [compiler/rustc_parse/src/lexer/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html) `rustc_ast::token_stream::TokenStream` | struct | An abstract sequence of tokens, organized into `TokenTree`s | [The parser], [Macro expansion] | [compiler/rustc_ast/src/tokenstream.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/struct.TokenStream.html) `TraitDef` | struct | This struct contains a trait's definition with type information | [The `ty` modules] | [compiler/rustc_middle/src/ty/trait_def.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/trait_def/struct.TraitDef.html) `TraitRef` | struct | The combination of a trait and its input types (e.g. `P0: Trait`) | [Trait Solving: Goals and Clauses] | [compiler/rustc_middle/src/ty/sty.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.TraitRef.html) diff --git a/src/guides/editions.md b/src/guides/editions.md index 336e391d..ea207167 100644 --- a/src/guides/editions.md +++ b/src/guides/editions.md @@ -91,7 +91,7 @@ stability. ## Edition parsing For the most part, the lexer is edition-agnostic. -Within [`StringReader`], tokens can be modified based on edition-specific behavior. +Within [`Lexer`], tokens can be modified based on edition-specific behavior. For example, C-String literals like `c"foo"` are split into multiple tokens in editions before 2021. This is also where things like reserved prefixes are handled for the 2021 edition. @@ -114,7 +114,7 @@ For example, the deprecated `start...end` pattern syntax emits the [`ellipsis_inclusive_range_patterns`] lint on editions before 2021, and in 2021 is an hard error via the `emit_err` method. -[`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html +[`Lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.Lexer.html [`ParseSess::edition`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.ParseSess.html#structfield.edition [`ellipsis_inclusive_range_patterns`]: https://doc.rust-lang.org/nightly/rustc/lints/listing/warn-by-default.html#ellipsis-inclusive-range-patterns diff --git a/src/overview.md b/src/overview.md index cc17eaa9..21ab0040 100644 --- a/src/overview.md +++ b/src/overview.md @@ -38,7 +38,7 @@ Unicode character encoding. The token stream passes through a higher-level lexer located in [`rustc_parse`] to prepare for the next stage of the compile process. The -[`StringReader`] `struct` is used at this stage to perform a set of validations +[`Lexer`] `struct` is used at this stage to perform a set of validations and turn strings into interned symbols (_interning_ is discussed later). [String interning] is a way of storing only one immutable copy of each distinct string value. @@ -153,7 +153,7 @@ the final binary. [`rustc_parse::parser::Parser`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/struct.Parser.html [`rustc_parse`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html [`simplify_try`]: https://github.com/rust-lang/rust/pull/66282 -[`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html +[`Lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.Lexer.html [`Ty<'tcx>`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Ty.html [borrow checking]: borrow_check.md [codegen]: backend/codegen.md diff --git a/src/the-parser.md b/src/the-parser.md index 703ef279..60a71ae3 100644 --- a/src/the-parser.md +++ b/src/the-parser.md @@ -52,7 +52,7 @@ the token stream, and then execute the parser to get a [`Crate`] (the root AST node). To minimize the amount of copying that is done, -both [`StringReader`] and [`Parser`] have lifetimes which bind them to the parent [`ParseSess`]. +both [`Lexer`] and [`Parser`] have lifetimes which bind them to the parent [`ParseSess`]. This contains all the information needed while parsing, as well as the [`SourceMap`] itself. Note that while parsing, we may encounter macro definitions or invocations. @@ -67,7 +67,7 @@ Code for lexical analysis is split between two crates: constituting tokens. Although it is popular to implement lexers as generated finite state machines, the lexer in [`rustc_lexer`] is hand-written. -- [`StringReader`] integrates [`rustc_lexer`] with data structures specific to +- [`Lexer`] integrates [`rustc_lexer`] with data structures specific to `rustc`. Specifically, it adds `Span` information to tokens returned by [`rustc_lexer`] and interns identifiers. @@ -76,7 +76,7 @@ Code for lexical analysis is split between two crates: [`ParseSess`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.ParseSess.html [`rustc_lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/index.html [`SourceMap`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/source_map/struct.SourceMap.html -[`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html +[`Lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.Lexer.html [ast module]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/index.html [ast]: ./ast-validation.md [parser]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/index.html diff --git a/src/ty_module/param_ty_const_regions.md b/src/ty_module/param_ty_const_regions.md index 6b467724..e6dfe8a6 100644 --- a/src/ty_module/param_ty_const_regions.md +++ b/src/ty_module/param_ty_const_regions.md @@ -65,7 +65,7 @@ The rules against shadowing make this difficult but those language rules could c ### Lifetime parameters -In contrast to `Ty`/`Const`'s `Param` singular `Param` variant, lifetimes have two variants for representing region parameters: [`RegionKind::EarlyParam`] and [`RegionKind::LateParam`]. The reason for this is due to function's distinguishing between [early and late bound parameters](../early-late-bound-params/early-late-bound-summary.md) which is discussed in an earlier chapter (see link). +In contrast to `Ty`/`Const`'s `Param` singular `Param` variant, lifetimes have two variants for representing region parameters: [`RegionKind::EarlyParam`] and [`RegionKind::LateParam`]. The reason for this is due to function's distinguishing between [early and late bound parameters][ch_early_late_bound] which is discussed in an earlier chapter (see link). `RegionKind::EarlyParam` is structured identically to `Ty/Const`'s `Param` variant, it is simply a `u32` index and a `Symbol`. For lifetime parameters defined on non-function items we always use `ReEarlyParam`. For functions we use `ReEarlyParam` for any early bound parameters and `ReLateParam` for any late bound parameters. Note that just like `Ty` and `Const` params we often debug format them as `'SYMBOL/#INDEX`, see for example: @@ -85,7 +85,7 @@ fn foo<'a, 'b, T: 'a>(one: T, two: &'a &'b u32) -> &'b u32 { `RegionKind::LateParam` will be discussed more in the chapter on [instantiating binders][ch_instantiating_binders]. -[ch_early_late_bound]: ../early-late-bound-params/early-late-bound-summary.md +[ch_early_late_bound]: ../early_late_parameters.md [ch_binders]: ./binders.md [ch_instantiating_binders]: ./instantiating_binders.md [`BoundRegionKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.BoundRegionKind.html From b4940bbed6c572fd703f13ead070484f4a79cc47 Mon Sep 17 00:00:00 2001 From: Ryan Mehri Date: Tue, 14 Jan 2025 23:01:42 -0800 Subject: [PATCH 17/52] fix some more typos --- src/backend/backend-agnostic.md | 2 +- src/closure.md | 2 +- src/const-eval.md | 2 +- src/diagnostics.md | 2 +- src/opaque-types-impl-trait-inference.md | 2 +- src/solve/caching.md | 4 ++-- src/solve/invariants.md | 4 ++-- src/solve/the-solver.md | 4 ++-- src/traits/implied-bounds.md | 4 ++-- src/ty_module/binders.md | 2 +- src/ty_module/early_binder.md | 2 +- src/ty_module/param_ty_const_regions.md | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/backend/backend-agnostic.md b/src/backend/backend-agnostic.md index 3521c00f..0f81d3cb 100644 --- a/src/backend/backend-agnostic.md +++ b/src/backend/backend-agnostic.md @@ -45,7 +45,7 @@ heavily on other parts of the crate. The separation of the code must not affect the logic of the code nor its performance. For these reasons, the separation process involves two transformations that -have to be done at the same time for the resulting code to compile : +have to be done at the same time for the resulting code to compile: 1. replace all the LLVM-specific types by generics inside function signatures and structure definitions; diff --git a/src/closure.md b/src/closure.md index 718a0e5d..427919cd 100644 --- a/src/closure.md +++ b/src/closure.md @@ -157,7 +157,7 @@ The other option is to step through the code using lldb or gdb. 1. `rust-lldb build/host/stage1/bin/rustc test.rs` 2. In lldb: - 1. `b upvar.rs:134` // Setting the breakpoint on a certain line in the upvar.rs file` + 1. `b upvar.rs:134` // Setting the breakpoint on a certain line in the upvar.rs file 2. `r` // Run the program until it hits the breakpoint Let's start with [`upvar.rs`][upvar]. This file has something called diff --git a/src/const-eval.md b/src/const-eval.md index ee026960..69329a3e 100644 --- a/src/const-eval.md +++ b/src/const-eval.md @@ -17,7 +17,7 @@ Prominent examples are: * need to be known to check for overlapping patterns Additionally constant evaluation can be used to reduce the workload or binary -size at runtime by precomputing complex operations at compiletime and only +size at runtime by precomputing complex operations at compile time and only storing the result. All uses of constant evaluation can either be categorized as "influencing the type system" diff --git a/src/diagnostics.md b/src/diagnostics.md index ccd10116..709e9d4f 100644 --- a/src/diagnostics.md +++ b/src/diagnostics.md @@ -111,7 +111,7 @@ Here are a few examples: their crate, making this a hard error would make refactoring and development very painful. - [future-incompatible lints]: - these are silencable lints. + these are silenceable lints. It was decided that making them fixed errors would cause too much breakage, so warnings are instead emitted, and will eventually be turned into fixed (hard) errors. diff --git a/src/opaque-types-impl-trait-inference.md b/src/opaque-types-impl-trait-inference.md index c56d51a4..bdf4e4cd 100644 --- a/src/opaque-types-impl-trait-inference.md +++ b/src/opaque-types-impl-trait-inference.md @@ -78,7 +78,7 @@ If that fails, we reveal the hidden type of the opaque type, but only to prove this specific trait bound, not in general. Revealing is done by invoking the `type_of` query on the `DefId` of the opaque type. The query will internally request the hidden types from the defining function(s) -and return that (see [the section on `type_of`](#Within-the-type_of-query) for more details). +and return that (see [the section on `type_of`](#within-the-type_of-query) for more details). #### Flowchart of type checking steps diff --git a/src/solve/caching.md b/src/solve/caching.md index 72b90c59..e568d47c 100644 --- a/src/solve/caching.md +++ b/src/solve/caching.md @@ -98,8 +98,8 @@ TODO: write this :3 [req-depth-ck]: https://github.com/rust-lang/rust/blob/7606c13961ddc1174b70638e934df0439b7dc515/compiler/rustc_middle/src/traits/solve/cache.rs#L76-L86 [update-depth]: https://github.com/rust-lang/rust/blob/7606c13961ddc1174b70638e934df0439b7dc515/compiler/rustc_trait_selection/src/solve/search_graph.rs#L308 [rem-depth]: https://github.com/rust-lang/rust/blob/7606c13961ddc1174b70638e934df0439b7dc515/compiler/rustc_middle/src/traits/solve/cache.rs#L124 -[^1]: This is overly restrictive: if all nested goal return the overflow response with some -availabledepth `n`, then their result should be the same for any depths smaller than `n`. +[^1]: This is overly restrictive: if all nested goals return the overflow response with some +available depth `n`, then their result should be the same for any depths smaller than `n`. We can implement this optimization in the future. [chapter on coinduction]: ./coinduction.md diff --git a/src/solve/invariants.md b/src/solve/invariants.md index c16a3aeb..588da490 100644 --- a/src/solve/invariants.md +++ b/src/solve/invariants.md @@ -33,7 +33,7 @@ inference variables in both the lhs and rhs, the now potentially structurally di types should still be equal to each other. Needed to prevent goals from succeeding in HIR typeck and then failing in MIR borrowck. -If this does invariant is broken MIR typeck ends up failing with an ICE. +If this invariant is broken MIR typeck ends up failing with an ICE. ### Applying inference results from a goal does not change its result ❌ @@ -91,7 +91,7 @@ it can easily result in unsoundness, e.g. [#57893](https://github.com/rust-lang/ If a trait goal holds with an empty environment, there should be a unique `impl`, either user-defined or builtin, which is used to prove that goal. This is -necessary to select a unique method. It +necessary to select a unique method. We do however break this invariant in few cases, some of which are due to bugs, some by design: diff --git a/src/solve/the-solver.md b/src/solve/the-solver.md index f7d82d11..006fb649 100644 --- a/src/solve/the-solver.md +++ b/src/solve/the-solver.md @@ -25,7 +25,7 @@ a separate "probe", to not leak inference constraints to the other candidates. We then try to merge the assembled candidates via `EvalCtxt::merge_candidates`. -## Important concepts and design pattern +## Important concepts and design patterns ### `EvalCtxt::add_goal` @@ -64,7 +64,7 @@ eagerly instantiates `'a` with a placeholder and then recursively proves Some goals can be proven in multiple ways. In these cases we try each option in a separate "probe" and then attempt to merge the resulting responses by using `EvalCtxt::try_merge_responses`. If merging the responses fails, we use -`EvalCtxt::flounder` instead, returning ambiguity. For some goals, we try +`EvalCtxt::flounder` instead, returning ambiguity. For some goals, we try to incompletely prefer some choices over others in case `EvalCtxt::try_merge_responses` fails. diff --git a/src/traits/implied-bounds.md b/src/traits/implied-bounds.md index 911553ad..63b09a43 100644 --- a/src/traits/implied-bounds.md +++ b/src/traits/implied-bounds.md @@ -41,7 +41,7 @@ requirements of impls and functions as explicit predicates. These bounds are not added to the `ParamEnv` of the affected item itself. For lexical region resolution they are added using [`fn OutlivesEnvironment::with_bounds`]. -Similarly,during MIR borrowck we add them using +Similarly, during MIR borrowck we add them using [`fn UniversalRegionRelationsBuilder::add_implied_bounds`]. [We add implied bounds for the function signature and impl header in MIR borrowck][mir]. @@ -81,4 +81,4 @@ This results in multiple unsoundnesses: [#25860]: https://github.com/rust-lang/rust/issues/25860 [#84591]: https://github.com/rust-lang/rust/issues/84591 -[#100051]: https://github.com/rust-lang/rust/issues/100051 \ No newline at end of file +[#100051]: https://github.com/rust-lang/rust/issues/100051 diff --git a/src/ty_module/binders.md b/src/ty_module/binders.md index 6f31103d..defb7cde 100644 --- a/src/ty_module/binders.md +++ b/src/ty_module/binders.md @@ -16,7 +16,7 @@ Usages of these parameters is represented by the `RegionKind::Bound` (or `TyKind - A [`BoundVar`] which specifies which of the parameters the `Binder` introduces we are referring to. - We also sometimes store some extra information for diagnostics reasons via the [`BoundTyKind`]/[`BoundRegionKind`] but this is not important for type equality or more generally the semantics of `Ty`. (omitted from the above example) -In debug output (and also informally when talking to eachother) we tend to write these bound variables in the format of `^DebruijnIndex_BoundVar`. The above example would instead be written as `Binder(fn(&'^0_0), &[BoundVariableKind::Region])`. Sometimes when the `DebruijnIndex` is `0` we just omit it and would write `^0`. +In debug output (and also informally when talking to each other) we tend to write these bound variables in the format of `^DebruijnIndex_BoundVar`. The above example would instead be written as `Binder(fn(&'^0_0), &[BoundVariableKind::Region])`. Sometimes when the `DebruijnIndex` is `0` we just omit it and would write `^0`. Another concrete example, this time a mixture of `for<'a>` in a where clause and a type: ``` diff --git a/src/ty_module/early_binder.md b/src/ty_module/early_binder.md index e8ff3a53..d83d73c9 100644 --- a/src/ty_module/early_binder.md +++ b/src/ty_module/early_binder.md @@ -48,7 +48,7 @@ fn bar(foo: Foo) { In the compiler the `instantiate` call for this is done in [`FieldDef::ty`] ([src][field_def_ty_src]), at some point during type checking `bar` we will wind up calling `FieldDef::ty(x, &[u32, f32])` in order to obtain the type of `foo.x`. **Note on indices:** It is a bug if the index of a `Param` does not match what the `EarlyBinder` binds. For -example, if the index is out of bounds or the index index of a lifetime corresponds to a type parameter. +example, if the index is out of bounds or the index of a lifetime corresponds to a type parameter. These sorts of errors are caught earlier in the compiler during name resolution where we disallow references to generics parameters introduced by items that should not be nameable by the inner item. diff --git a/src/ty_module/param_ty_const_regions.md b/src/ty_module/param_ty_const_regions.md index e6dfe8a6..c52f0c0d 100644 --- a/src/ty_module/param_ty_const_regions.md +++ b/src/ty_module/param_ty_const_regions.md @@ -53,7 +53,7 @@ Concretely given the `ty::Generics` for the item the parameter is defined on, if The index fully defines the `Ty` and is the only part of `TyKind::Param` that matters for reasoning about the code we are compiling. -Generally we do not care what the name is and only use the index is included for diagnostics and debug logs as otherwise it would be +Generally we do not care what the name is and only use the index. The name is included for diagnostics and debug logs as otherwise it would be incredibly difficult to understand the output, i.e. `Vec: Sized` vs `Vec: Sized`. In debug output, parameter types are often printed out as `{name}/#{index}`, for example in the function `foo` if we were to debug print `Vec` it would be written as `Vec`. From 46458edee5b278670883443c526c134ed494d1f3 Mon Sep 17 00:00:00 2001 From: lcnr Date: Wed, 15 Jan 2025 14:20:48 +0100 Subject: [PATCH 18/52] nyaa --- src/borrow_check/region_inference/closure_constraints.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/borrow_check/region_inference/closure_constraints.md b/src/borrow_check/region_inference/closure_constraints.md index be279b77..b95c9f72 100644 --- a/src/borrow_check/region_inference/closure_constraints.md +++ b/src/borrow_check/region_inference/closure_constraints.md @@ -31,9 +31,9 @@ It starts by calling `fn try_promote_type_test_subject`. This function takes the We then promote the `lower_bound` into the context of the caller. If the lower bound is equal to a placeholder, we replace it with `'static` -We then look at all universal regions `uv` which are required to outlive `lower_bound`, i.e. for which borrow checking adding region constraints. For each of these we then emit a `ClosureOutlivesRequirement` for non-local universal regions which are known to outlive `uv`. +We then look at all universal regions `uv` which are required to be outlived by `lower_bound`, i.e. for which borrow checking added region constraints. For each of these we then emit a `ClosureOutlivesRequirement` for all non-local universal regions which are known to outlive `uv`. -As we've already built the region graph of the closure at this point and emitted errors if that one is inconsistent, we are also able to assume that the outlive constraints `uv: lower_bound` hold. +As we've already built the region graph of the closure at this point and separately check that it is consistent, we are also able to assume the outlive constraints `uv: lower_bound` here. So if we have a type-outlives bounds we can't prove, e.g. `T: 'local_infer`, we use the region graph to go to universal variables `'a` with `'a: local_infer`. In case `'a` are local, we then use the assumed outlived constraints to go to non-local ones. From e9d9b29d0699b060c1dfc01d09cb46fa0db2babd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= <39484203+jieyouxu@users.noreply.github.com> Date: Fri, 17 Jan 2025 08:40:04 +0800 Subject: [PATCH 19/52] compiletest: fix outdated `rustdoc-js` test suite name --- src/tests/directives.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/directives.md b/src/tests/directives.md index 69f4c864..ea9caf8d 100644 --- a/src/tests/directives.md +++ b/src/tests/directives.md @@ -248,7 +248,7 @@ Consider writing the test as a proper incremental test instead. | Directive | Explanation | Supported test suites | Possible values | |-------------|--------------------------------------------------------------|------------------------------------------|---------------------------| -| `doc-flags` | Flags passed to `rustdoc` when building the test or aux file | `rustdoc`, `js-doc-test`, `rustdoc-json` | Any valid `rustdoc` flags | +| `doc-flags` | Flags passed to `rustdoc` when building the test or aux file | `rustdoc`, `rustdoc-js`, `rustdoc-json` | Any valid `rustdoc` flags | ` marker at the place where you want the TOC. This repository is linked to `rust-lang/rust` as a [josh](https://josh-project.github.io/josh/intro.html) subtree. You can use the following commands to synchronize the subtree in both directions. +You'll need to install `josh-proxy` locally via + +``` +cargo +stable install josh-proxy --git https://github.com/josh-project/josh --tag r24.10.04 +``` +Older versions of `josh-proxy` may not round trip commits losslessly so it is important to install this exact version. + ### Pull changes from `rust-lang/rust` into this repository 1) Checkout a new branch that will be used to create a PR into `rust-lang/rustc-dev-guide` 2) Run the pull command From 0ae03351d2f6a4e877698d2e17a395cc6d76eb7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 20 Jan 2025 13:51:50 +0100 Subject: [PATCH 22/52] Add portable SIMD to list of subtrees --- src/external-repos.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/external-repos.md b/src/external-repos.md index 8f981930..f3170c92 100644 --- a/src/external-repos.md +++ b/src/external-repos.md @@ -18,6 +18,7 @@ The following external projects are managed using some form of a `subtree`: * [clippy](https://github.com/rust-lang/rust-clippy) * [miri](https://github.com/rust-lang/miri) +* [portable-simd](https://github.com/rust-lang/portable-simd) * [rustfmt](https://github.com/rust-lang/rustfmt) * [rust-analyzer](https://github.com/rust-lang/rust-analyzer) * [rustc_codegen_cranelift](https://github.com/rust-lang/rustc_codegen_cranelift) @@ -34,6 +35,7 @@ implement a new tool feature or test, that should happen in one collective rustc * Using `git subtree` * `clippy` ([sync guide](https://doc.rust-lang.org/nightly/clippy/development/infrastructure/sync.html#performing-the-sync-from-rust-langrust-to-clippy)) + * `portable-simd` ([sync script](https://github.com/rust-lang/portable-simd/blob/master/subtree-sync.sh)) * `rustfmt` * `rustc_codegen_cranelift` ([sync script](https://github.com/rust-lang/rustc_codegen_cranelift/blob/113af154d459e41b3dc2c5d7d878e3d3a8f33c69/scripts/rustup.sh#L7)) * Using the [josh] tool From c89935feca87f791143be2a94923fee322f04657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 20 Jan 2025 14:11:57 +0100 Subject: [PATCH 23/52] Preparing for merge from rustc --- rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-version b/rust-version index 651db786..9693bfd6 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -9c87288a7d2f03625a813df6d3bfe43c09ad4f5a +ecda83b30f0f68cf5692855dddc0bc38ee8863fc From f9cb2ec0e7ac73a2ffa15316a0dc7f86eeba1242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 20 Jan 2025 17:30:09 +0100 Subject: [PATCH 24/52] Send a message to Zulip when a sync finishes --- .github/workflows/rustc-pull.yml | 34 ++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rustc-pull.yml b/.github/workflows/rustc-pull.yml index dcb90b84..87a3ee2e 100644 --- a/.github/workflows/rustc-pull.yml +++ b/.github/workflows/rustc-pull.yml @@ -10,6 +10,8 @@ jobs: pull: if: github.repository == 'rust-lang/rustc-dev-guide' runs-on: ubuntu-latest + outputs: + pr_url: ${{ steps.update-pr.outputs.pr_url }} permissions: contents: write pull-requests: write @@ -40,6 +42,7 @@ jobs: git switch -c $BRANCH git push -u origin $BRANCH --force - name: Create pull request + id: update-pr run: | # Check if an open pull request for an rustc pull update already exists # If it does, the previous push has just updated it @@ -47,9 +50,36 @@ jobs: RESULT=`gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | length' --json title` if [[ "$RESULT" -eq 0 ]]; then echo "Creating new pull request" - gh pr create -B master --title 'Rustc pull update' --body 'Latest update from rustc.' + PR_URL=gh pr create -B master --title 'Rustc pull update' --body 'Latest update from rustc.' + echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT else - echo "Updated existing pull request" + PR_URL=gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | .[0].url' --json url,title + echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + send-zulip-message: + needs: [pull] + if: ${{ !cancelled() }} + runs-on: ubuntu-latest + steps: + - name: Compute message + id: message + run: | + if [ "${{ needs.pull.result }}" == "failure" ]; + then + WORKFLOW_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + echo "message=Rustc pull sync failed. Check out the [workflow URL]($WORKFLOW_URL)." >> $GITHUB_OUTPUT + else + echo "message=Rustc pull sync succeeded. Check out the [PR](${{ needs.pull.outputs.pr_url }})." >> $GITHUB_OUTPUT + fi + - name: Send a Zulip message about updated PR + uses: zulip/github-actions-zulip/send-message@e4c8f27c732ba9bd98ac6be0583096dea82feea5 + with: + api-key: ${{ secrets.ZULIP_API_TOKEN }} + email: "rustc-dev-guide-gha-notif-bot@rust-lang.zulipchat.com" + organization-url: "https://rust-lang.zulipchat.com" + to: 196385 + type: "stream" + topic: "Subtree sync automation" + content: ${{ steps.message.outputs.message }} From 3543f80951b15788044a6e483b7cf02fa0aa7423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 6 Jan 2025 17:23:28 +0100 Subject: [PATCH 25/52] Add test for checking used glibc symbols --- src/tests/directives.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/directives.md b/src/tests/directives.md index e80857b7..426a6ff1 100644 --- a/src/tests/directives.md +++ b/src/tests/directives.md @@ -152,6 +152,8 @@ Some examples of `X` in `ignore-X` or `only-X`: `compare-mode-split-dwarf`, `compare-mode-split-dwarf-single` - The two different test modes used by coverage tests: `ignore-coverage-map`, `ignore-coverage-run` +- When testing a dist toolchain: `dist` + - This needs to be enabled with `COMPILETEST_ENABLE_DIST_TESTS=1` The following directives will check rustc build settings and target settings: From 7fb252d7fe8dd1d7f5e6f1d3f842ae40de95a900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Tue, 21 Jan 2025 17:00:28 +0100 Subject: [PATCH 26/52] Add `@bors rollup=never` to rustc-push PR body --- josh-sync/src/sync.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/josh-sync/src/sync.rs b/josh-sync/src/sync.rs index eff80b10..7ff5e018 100644 --- a/josh-sync/src/sync.rs +++ b/josh-sync/src/sync.rs @@ -180,7 +180,7 @@ impl GitSync { ); println!( // Open PR with `subtree update` title to silence the `no-merges` triagebot check - " https://github.com/{UPSTREAM_REPO}/compare/{github_user}:{branch}?quick_pull=1&title=Rustc+dev+guide+subtree+update&body=r?+@ghost" + " https://github.com/{UPSTREAM_REPO}/compare/{github_user}:{branch}?quick_pull=1&title=Rustc+dev+guide+subtree+update&body=@bors+rollup=never%0Ar?+@ghost" ); drop(josh); From 851d9a5b20dee21ac7dfd31d811379856bdece56 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:00:36 +0000 Subject: [PATCH 27/52] Remove set_make_codegen_backend and set_file_loader They can both be set inside the config callback too. --- examples/rustc-driver-example.rs | 13 ++++++------- examples/rustc-driver-interacting-with-the-ast.rs | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/examples/rustc-driver-example.rs b/examples/rustc-driver-example.rs index 576bbcea..b7717284 100644 --- a/examples/rustc-driver-example.rs +++ b/examples/rustc-driver-example.rs @@ -19,7 +19,7 @@ use std::path::Path; use rustc_ast_pretty::pprust::item_to_string; use rustc_data_structures::sync::Lrc; use rustc_driver::{Compilation, RunCompiler}; -use rustc_interface::interface::Compiler; +use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; struct MyFileLoader; @@ -51,6 +51,10 @@ fn main() { struct MyCallbacks; impl rustc_driver::Callbacks for MyCallbacks { + fn config(&mut self, config: &mut Config) { + config.file_loader = Some(Box::new(MyFileLoader)); + } + fn after_crate_root_parsing( &mut self, _compiler: &Compiler, @@ -83,10 +87,5 @@ impl rustc_driver::Callbacks for MyCallbacks { } fn main() { - match RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks) { - mut compiler => { - compiler.set_file_loader(Some(Box::new(MyFileLoader))); - compiler.run(); - } - } + RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks).run(); } diff --git a/examples/rustc-driver-interacting-with-the-ast.rs b/examples/rustc-driver-interacting-with-the-ast.rs index 90a85d5d..6c06bbed 100644 --- a/examples/rustc-driver-interacting-with-the-ast.rs +++ b/examples/rustc-driver-interacting-with-the-ast.rs @@ -19,7 +19,7 @@ use std::path::Path; use rustc_ast_pretty::pprust::item_to_string; use rustc_data_structures::sync::Lrc; use rustc_driver::{Compilation, RunCompiler}; -use rustc_interface::interface::Compiler; +use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; struct MyFileLoader; @@ -51,6 +51,10 @@ fn main() { struct MyCallbacks; impl rustc_driver::Callbacks for MyCallbacks { + fn config(&mut self, config: &mut Config) { + config.file_loader = Some(Box::new(MyFileLoader)); + } + fn after_crate_root_parsing( &mut self, _compiler: &Compiler, @@ -90,10 +94,5 @@ impl rustc_driver::Callbacks for MyCallbacks { } fn main() { - match RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks) { - mut compiler => { - compiler.set_file_loader(Some(Box::new(MyFileLoader))); - compiler.run(); - } - } + RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks).run(); } From 76f7584f6a008bc0a5829a4dd82840e501c6140b Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:13:14 +0000 Subject: [PATCH 28/52] Remove RunCompiler It has become nothing other than a wrapper around run_compiler. --- examples/rustc-driver-example.rs | 4 ++-- examples/rustc-driver-interacting-with-the-ast.rs | 4 ++-- src/rustc-driver/intro.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/rustc-driver-example.rs b/examples/rustc-driver-example.rs index b7717284..8983915d 100644 --- a/examples/rustc-driver-example.rs +++ b/examples/rustc-driver-example.rs @@ -18,7 +18,7 @@ use std::path::Path; use rustc_ast_pretty::pprust::item_to_string; use rustc_data_structures::sync::Lrc; -use rustc_driver::{Compilation, RunCompiler}; +use rustc_driver::{Compilation, run_compiler}; use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; @@ -87,5 +87,5 @@ impl rustc_driver::Callbacks for MyCallbacks { } fn main() { - RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks).run(); + run_compiler(&["main.rs".to_string()], &mut MyCallbacks); } diff --git a/examples/rustc-driver-interacting-with-the-ast.rs b/examples/rustc-driver-interacting-with-the-ast.rs index 6c06bbed..c894b604 100644 --- a/examples/rustc-driver-interacting-with-the-ast.rs +++ b/examples/rustc-driver-interacting-with-the-ast.rs @@ -18,7 +18,7 @@ use std::path::Path; use rustc_ast_pretty::pprust::item_to_string; use rustc_data_structures::sync::Lrc; -use rustc_driver::{Compilation, RunCompiler}; +use rustc_driver::{Compilation, run_compiler}; use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; @@ -94,5 +94,5 @@ impl rustc_driver::Callbacks for MyCallbacks { } fn main() { - RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks).run(); + run_compiler(&["main.rs".to_string()], &mut MyCallbacks); } diff --git a/src/rustc-driver/intro.md b/src/rustc-driver/intro.md index a6234dc1..40500e6b 100644 --- a/src/rustc-driver/intro.md +++ b/src/rustc-driver/intro.md @@ -6,7 +6,7 @@ The [`rustc_driver`] is essentially `rustc`'s `main` function. It acts as the glue for running the various phases of the compiler in the correct order, using the interface defined in the [`rustc_interface`] crate. Where possible, using [`rustc_driver`] rather than [`rustc_interface`] is recommended. -The main entry point of [`rustc_driver`] is [`rustc_driver::RunCompiler`][rd_rc]. +The main entry point of [`rustc_driver`] is [`rustc_driver::run_compiler`][rd_rc]. This builder accepts the same command-line args as rustc as well as an implementation of [`Callbacks`][cb] and a couple of other optional options. [`Callbacks`][cb] is a `trait` that allows for custom compiler configuration, as well as allowing custom code to run after different phases of the compilation. @@ -40,7 +40,7 @@ specifically [`rustc_driver_impl::run_compiler`][rdi_rc] [cb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/trait.Callbacks.html [example]: https://github.com/rust-lang/rustc-dev-guide/blob/master/examples/rustc-interface-example.rs [i_rc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/interface/fn.run_compiler.html -[rd_rc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/struct.RunCompiler.html +[rd_rc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/fn.run_compiler.html [rdi_rc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver_impl/fn.run_compiler.html [stupid-stats]: https://github.com/nrc/stupid-stats [`nightly-rustc`]: https://doc.rust-lang.org/nightly/nightly-rustc/ From 0f175948cdfe12d6ae4973eec25a791f058adf64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= <39484203+jieyouxu@users.noreply.github.com> Date: Thu, 23 Jan 2025 14:39:04 +0800 Subject: [PATCH 29/52] rustc-dev-guide: document `needs-subprocess` directive --- src/tests/directives.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/directives.md b/src/tests/directives.md index 426a6ff1..7366e55d 100644 --- a/src/tests/directives.md +++ b/src/tests/directives.md @@ -94,7 +94,7 @@ for more details. | Directive | Explanation | Supported test suites | Possible values | |-----------------------------------|--------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|-----------------------------------------------------------------------------------------| | `check-run-results` | Check run test binary `run-{pass,fail}` output snapshot | `ui`, `crashes`, `incremental` if `run-pass` | N/A | -| `error-pattern` | Check that output contains a specific string | `ui`, `crashes`, `incremental` if `run-pass` | String | +| `error-pattern` | Check that output contains a specific string | `ui`, `crashes`, `incremental` if `run-pass` | String | | `regex-error-pattern` | Check that output contains a regex pattern | `ui`, `crashes`, `incremental` if `run-pass` | Regex | | `check-stdout` | Check `stdout` against `error-pattern`s from running test binary[^check_stdout] | `ui`, `crashes`, `incremental` | N/A | | `normalize-stderr-32bit` | Normalize actual stderr (for 32-bit platforms) with a rule `"" -> ""` before comparing against snapshot | `ui`, `incremental` | `"" -> ""`, ``/`` is regex capture and replace syntax | @@ -176,6 +176,7 @@ settings: - `needs-rust-lld` — ignores if the rust lld support is not enabled (`rust.lld = true` in `config.toml`) - `needs-threads` — ignores if the target does not have threading support +- `needs-subprocess` — ignores if the target does not have subprocess support - `needs-symlink` — ignores if the target does not support symlinks. This can be the case on Windows if the developer did not enable privileged symlink permissions. From 80aac13e782ac3c0217ac792a4a188f9523ab7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Thu, 23 Jan 2025 20:09:13 +0100 Subject: [PATCH 30/52] Document Python formatting and linting in the rustc-dev-guide --- src/conventions.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/conventions.md b/src/conventions.md index 37af8121..4010e908 100644 --- a/src/conventions.md +++ b/src/conventions.md @@ -1,4 +1,4 @@ -This file offers some tips on the coding conventions for rustc. This +This file offers some tips on the coding conventions for rustc. This chapter covers [formatting](#formatting), [coding for correctness](#cc), [using crates from crates.io](#cio), and some tips on [structuring your PR for easy review](#er). @@ -25,6 +25,7 @@ pass the `--edition=2021` argument yourself when c `rustfmt` directly. [fmt]: https://github.com/rust-dev-tools/fmt-rfcs + [`rustfmt`]:https://github.com/rust-lang/rustfmt ## Formatting C++ code @@ -40,6 +41,26 @@ When modifying that code, use this command to format it: This uses a pinned version of `clang-format`, to avoid relying on the local environment. +## Formatting and linting Python code + +The Rust repository contains quite a lof of Python code. We try to keep +it both linted and formatted by the [ruff][ruff] tool. + +When modifying Python code, use this command to format it: +```sh +./x test tidy --extra-checks=py:fmt --bless +``` + +and the following command to run lints: +```sh +./x test tidy --extra-checks=py:lint +``` + +This uses a pinned version of `ruff`, to avoid relying on the local +environment. + +[ruff]: https://github.com/astral-sh/ruff + @@ -84,7 +105,7 @@ Using `_` in a match is convenient, but it means that when new variants are added to the enum, they may not get handled correctly. Ask yourself: if a new variant were added to this enum, what's the chance that it would want to use the `_` code, versus having some -other treatment? Unless the answer is "low", then prefer an +other treatment? Unless the answer is "low", then prefer an exhaustive match. (The same advice applies to `if let` and `while let`, which are effectively tests for a single variant.) @@ -124,7 +145,7 @@ See the [crates.io dependencies][crates] section. # How to structure your PR How you prepare the commits in your PR can make a big difference for the -reviewer. Here are some tips. +reviewer. Here are some tips. **Isolate "pure refactorings" into their own commit.** For example, if you rename a method, then put that rename into its own commit, along @@ -165,4 +186,5 @@ to the compiler. crate-related, often the spelling is changed to `krate`. [tcx]: ./ty.md + [crates]: ./crates-io.md From d56358082cd5995f4532cd192ec05ce0fc8abc22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Fri, 24 Jan 2025 13:59:05 +0100 Subject: [PATCH 31/52] Revert "Add `@bors rollup=never` to rustc-push PR body" --- josh-sync/src/sync.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/josh-sync/src/sync.rs b/josh-sync/src/sync.rs index 7ff5e018..eff80b10 100644 --- a/josh-sync/src/sync.rs +++ b/josh-sync/src/sync.rs @@ -180,7 +180,7 @@ impl GitSync { ); println!( // Open PR with `subtree update` title to silence the `no-merges` triagebot check - " https://github.com/{UPSTREAM_REPO}/compare/{github_user}:{branch}?quick_pull=1&title=Rustc+dev+guide+subtree+update&body=@bors+rollup=never%0Ar?+@ghost" + " https://github.com/{UPSTREAM_REPO}/compare/{github_user}:{branch}?quick_pull=1&title=Rustc+dev+guide+subtree+update&body=r?+@ghost" ); drop(josh); From 168456e7a30062684b418e7944f62d0ed6ba01fb Mon Sep 17 00:00:00 2001 From: Ada Alakbarova <58857108+ada4a@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:12:17 +0100 Subject: [PATCH 32/52] fix(solve/significant-changes): typo --- src/solve/significant-changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solve/significant-changes.md b/src/solve/significant-changes.md index c5bb8a01..c82b5d46 100644 --- a/src/solve/significant-changes.md +++ b/src/solve/significant-changes.md @@ -42,7 +42,7 @@ old implementation structurally relates the aliases instead. This enables the new solver to stall equality until it is able to normalize the related aliases. The behavior of the old solver is incomplete and relies on eager normalization -which replaces ambiguous aliases with inference variables. As this is not +which replaces ambiguous aliases with inference variables. As this is not possible for aliases containing bound variables, the old implementation does not handle aliases inside of binders correctly, e.g. [#102048]. See the chapter on [normalization] for more details. From 2e060866f0199daf4485582c8b41b22bfd0111c1 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 24 Jan 2025 14:40:12 +0100 Subject: [PATCH 33/52] Cross-link documentation for adding a new target Both the target tier policy and the rustc-dev-guide has documentation on this, let's make sure people see both. --- src/building/new-target.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/building/new-target.md b/src/building/new-target.md index 1d9fa1b5..cd215277 100644 --- a/src/building/new-target.md +++ b/src/building/new-target.md @@ -4,8 +4,13 @@ These are a set of steps to add support for a new target. There are numerous end states and paths to get there, so not all sections may be relevant to your desired goal. +See also the associated documentation in the +[target tier policy][target_tier_policy_add]. + +[target_tier_policy_add]: https://doc.rust-lang.org/rustc/target-tier-policy.html#adding-a-new-target + ## Specifying a new LLVM For very new targets, you may need to use a different fork of LLVM From adb70de1c4fa5417e961a536c9f2812122f2aff6 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Sat, 25 Jan 2025 18:21:58 +0100 Subject: [PATCH 34/52] CI: use key-restore for cache GH action It seems one can't overwrite a cache entry: ``` Failed to save: Unable to reserve cache with key linkcheck--0.8.1, another job may be creating this cache. More details: Cache already exists. Scope: refs/heads/master, Key: linkcheck--0.8.1, Version: 33f8fd511bed9c91c40778bc5c27cb58425caa894ab50f9c5705d83cb78660e0 Warning: Cache save failed. ``` A proper solution is to use `restore-keys`: https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 006bcce4..3f810e2f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,9 @@ jobs: uses: actions/cache/restore@v4 with: path: book/linkcheck/cache.json - key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }} + key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }}--${{ github.run_id }} + restore-keys: | + linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }}-- - name: Install latest nightly Rust toolchain if: steps.mdbook-cache.outputs.cache-hit != 'true' @@ -66,7 +68,7 @@ jobs: uses: actions/cache/save@v4 with: path: book/linkcheck/cache.json - key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }} + key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }}--${{ github.run_id }} - name: Deploy to gh-pages if: github.event_name == 'push' From 684424aeef127d6c107a7fb1d94596d02c95bfb8 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 25 Jan 2025 13:47:50 -0800 Subject: [PATCH 35/52] Update boring lines to sync with rustdoc --- src/early_late_parameters.md | 62 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/early_late_parameters.md b/src/early_late_parameters.md index 6d136552..28026b0a 100644 --- a/src/early_late_parameters.md +++ b/src/early_late_parameters.md @@ -126,8 +126,8 @@ In this example we call `foo`'s function item type twice, each time with a borro If the lifetime parameter on `foo` was late bound this would be able to compile as each caller could provide a different lifetime argument for its borrow. See the following example which demonstrates this using the `bar` function defined above: ```rust -#fn foo<'a: 'a>(b: &'a String) -> &'a String { b } -#fn bar<'a>(b: &'a String) -> &'a String { b } +# fn foo<'a: 'a>(b: &'a String) -> &'a String { b } +# fn bar<'a>(b: &'a String) -> &'a String { b } // Early bound parameters are instantiated here, however as `'a` is // late bound it is not provided here. @@ -220,24 +220,24 @@ Then, for the first case, we can call each function with a single lifetime argum ```rust #![deny(late_bound_lifetime_arguments)] -#fn free_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# fn free_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} # -#struct Foo; +# struct Foo; # -#trait Trait: Sized { -# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()); -# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()); -#} +# trait Trait: Sized { +# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()); +# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()); +# } # -#impl Trait for Foo { -# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} -# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} -#} +# impl Trait for Foo { +# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} +# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# } # -#impl Foo { -# fn inherent_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} -# fn inherent_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} -#} +# impl Foo { +# fn inherent_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} +# fn inherent_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# } # // Specifying as many arguments as there are early // bound parameters is always a future compat warning @@ -251,24 +251,24 @@ free_function::<'static>(&(), &()); For the second case we call each function with more lifetime arguments than there are lifetime parameters (be it early or late bound) and note that method calls result in a FCW as opposed to the free/associated functions which result in a hard error: ```rust -#fn free_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# fn free_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} # -#struct Foo; +# struct Foo; # -#trait Trait: Sized { -# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()); -# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()); -#} +# trait Trait: Sized { +# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()); +# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()); +# } # -#impl Trait for Foo { -# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} -# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} -#} +# impl Trait for Foo { +# fn trait_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} +# fn trait_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# } # -#impl Foo { -# fn inherent_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} -# fn inherent_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} -#} +# impl Foo { +# fn inherent_method<'a: 'a, 'b>(self, _: &'a (), _: &'b ()) {} +# fn inherent_function<'a: 'a, 'b>(_: &'a (), _: &'b ()) {} +# } # // Specifying more arguments than there are early // bound parameters is a future compat warning when @@ -421,4 +421,4 @@ impl<'a> Fn<()> for FooFnItem<'a> { type Output = &'a String; /* fn call(...) -> ... { ... } */ } -``` \ No newline at end of file +``` From 3ffcf606a9985ad14b0119671a3a612836a3dda8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=C3=B3n=20Orell=20Valerian=20Liehr?= Date: Sun, 26 Jan 2025 02:42:09 +0100 Subject: [PATCH 36/52] Remove accidental leading empty line in code block --- src/early_late_parameters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/early_late_parameters.md b/src/early_late_parameters.md index 28026b0a..3b2a5e8a 100644 --- a/src/early_late_parameters.md +++ b/src/early_late_parameters.md @@ -128,7 +128,7 @@ If the lifetime parameter on `foo` was late bound this would be able to compile ```rust # fn foo<'a: 'a>(b: &'a String) -> &'a String { b } # fn bar<'a>(b: &'a String) -> &'a String { b } - +# // Early bound parameters are instantiated here, however as `'a` is // late bound it is not provided here. let b = bar; From a86a368f0f20b4ddb4ece70ad47387a7283ae62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= <39484203+jieyouxu@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:31:40 +0800 Subject: [PATCH 37/52] rustc-dev-guide: update bootstrap tracing docs --- .../bootstrapping/debugging-bootstrap.md | 90 +++++++++++------- .../tracing-output-example.png | Bin 140711 -> 0 bytes 2 files changed, 58 insertions(+), 32 deletions(-) delete mode 100644 src/building/bootstrapping/debugging-bootstrap/tracing-output-example.png diff --git a/src/building/bootstrapping/debugging-bootstrap.md b/src/building/bootstrapping/debugging-bootstrap.md index 972b4a8f..3f907e85 100644 --- a/src/building/bootstrapping/debugging-bootstrap.md +++ b/src/building/bootstrapping/debugging-bootstrap.md @@ -1,6 +1,6 @@ # Debugging bootstrap -> FIXME: this page could be expanded +> FIXME: this section should be expanded ## `tracing` in bootstrap @@ -10,21 +10,69 @@ Bootstrap has conditional [`tracing`][tracing] setup to provide structured loggi ### Enabling `tracing` output -Bootstrap will conditionally enable `tracing` output if the `BOOTSTRAP_TRACING` env var is set. +Bootstrap will conditionally build `tracing` support and enable `tracing` output if the `BOOTSTRAP_TRACING` env var is set. -Example usage: +#### Basic usage + +Example basic usage[^just-trace]: + +[^just-trace]: It is not recommend to use *just* `BOOTSTRAP_TRACING=TRACE` because that will dump *everything* at `TRACE` level, including logs intentionally gated behind custom targets as they are too verbose even for `TRACE` level by default. ```bash -$ BOOTSTRAP_TRACING=TRACE ./x build library --stage 1 +$ BOOTSTRAP_TRACING=bootstrap=TRACE ./x build library --stage 1 ``` -Example output[^experimental]: +Example output[^unstable]: -![Example bootstrap tracing output](./debugging-bootstrap/tracing-output-example.png) +``` +$ BOOTSTRAP_TRACING=bootstrap=TRACE ./x check src/bootstrap/ +Building bootstrap + Compiling bootstrap v0.0.0 (/home/joe/repos/rust/src/bootstrap) + Finished `dev` profile [unoptimized] target(s) in 2.74s + DEBUG bootstrap parsing flags + bootstrap::core::config::flags::Flags::parse args=["check", "src/bootstrap/"] + DEBUG bootstrap parsing config based on flags + DEBUG bootstrap creating new build based on config + bootstrap::Build::build + TRACE bootstrap setting up job management + TRACE bootstrap downloading rustfmt early + bootstrap::handling hardcoded subcommands (Format, Suggest, Perf) + DEBUG bootstrap not a hardcoded subcommand; returning to normal handling, cmd=Check { all_targets: false } + DEBUG bootstrap handling subcommand normally + bootstrap::executing real run + bootstrap::(1) executing dry-run sanity-check + bootstrap::(2) executing actual run +Checking stage0 library artifacts (x86_64-unknown-linux-gnu) + Finished `release` profile [optimized + debuginfo] target(s) in 0.04s +Checking stage0 compiler artifacts {rustc-main, rustc_abi, rustc_arena, rustc_ast, rustc_ast_ir, rustc_ast_lowering, rustc_ast_passes, rustc_ast_pretty, rustc_attr_data_structures, rustc_attr_parsing, rustc_baked_icu_data, rustc_borrowck, rustc_builtin_macros, rustc_codegen_llvm, rustc_codegen_ssa, rustc_const_eval, rustc_data_structures, rustc_driver, rustc_driver_impl, rustc_error_codes, rustc_error_messages, rustc_errors, rustc_expand, rustc_feature, rustc_fluent_macro, rustc_fs_util, rustc_graphviz, rustc_hir, rustc_hir_analysis, rustc_hir_pretty, rustc_hir_typeck, rustc_incremental, rustc_index, rustc_index_macros, rustc_infer, rustc_interface, rustc_lexer, rustc_lint, rustc_lint_defs, rustc_llvm, rustc_log, rustc_macros, rustc_metadata, rustc_middle, rustc_mir_build, rustc_mir_dataflow, rustc_mir_transform, rustc_monomorphize, rustc_next_trait_solver, rustc_parse, rustc_parse_format, rustc_passes, rustc_pattern_analysis, rustc_privacy, rustc_query_impl, rustc_query_system, rustc_resolve, rustc_sanitizers, rustc_serialize, rustc_session, rustc_smir, rustc_span, rustc_symbol_mangling, rustc_target, rustc_trait_selection, rustc_traits, rustc_transmute, rustc_ty_utils, rustc_type_ir, rustc_type_ir_macros, stable_mir} (x86_64-unknown-linux-gnu) + Finished `release` profile [optimized + debuginfo] target(s) in 0.23s +Checking stage0 bootstrap artifacts (x86_64-unknown-linux-gnu) + Checking bootstrap v0.0.0 (/home/joe/repos/rust/src/bootstrap) + Finished `release` profile [optimized + debuginfo] target(s) in 0.64s + DEBUG bootstrap checking for postponed test failures from `test --no-fail-fast` +Build completed successfully in 0:00:08 +``` -[^experimental]: This shows what's *possible* with the infra in an experimental implementation. +#### Controlling log output -The env var `BOOTSTRAP_TRACING` accepts a [`tracing` env-filter][tracing-env-filter]. The `TRACE` filter will enable *all* `trace` level or less verbose level tracing output. +The env var `BOOTSTRAP_TRACING` accepts a [`tracing` env-filter][tracing-env-filter]. + +There are two orthogonal ways to control which kind of logs you want: + +1. You can specify the log **level**, e.g. `DEBUG` or `TRACE`. +2. You can also control the log **target**, e.g. `bootstrap` or `bootstrap::core::config` vs custom targets like `CONFIG_HANDLING`. + - Custom targets are used to limit what is output when `BOOTSTRAP_TRACING=bootstrap=TRACE` is used, as they can be too verbose even for `TRACE` level by default. Currently used custom targets: + - `CONFIG_HANDLING` + +The `TRACE` filter will enable *all* `trace` level or less verbose level tracing output. + +You can of course combine them (custom target logs are typically gated behind `TRACE` log level additionally): + +```bash +$ BOOTSTRAP_TRACING=CONFIG_HANDLING=TRACE ./x build library --stage 1 +``` + +[^unstable]: This output is always subject to further changes. [tracing-env-filter]: https://docs.rs/tracing-subscriber/0.3.19/tracing_subscriber/filter/struct.EnvFilter.html @@ -73,28 +121,6 @@ For `#[instrument]`, it's recommended to: - Explicitly pick an instrumentation name via `name = ".."` to distinguish between e.g. `run` of different steps. - Take care to not cause diverging behavior via tracing, e.g. building extra things only when tracing infra is enabled. -### Enabling `tracing` bootstrap feature in rust-analyzer +### rust-analyzer integration? -You can adjust your `settings.json`'s `rust-analyzer.check.overrideCommand` and `rust-analyzer.cargo.buildScripts.overrideCommand` if you want to also enable `logging` cargo feature by default in your editor. This is mostly useful if you want proper r-a completions and such when working on bootstrap itself. - -```json -"rust-analyzer.check.overrideCommand": [ - "BOOTSTRAP_TRACING=1", // <- BOOTSTRAP_TRACING=1 won't enable tracing filter, but it will activate bootstrap's `tracing` feature - "python3", - "x.py", - "check", - "--json-output", - "--build-dir=build-rust-analyzer" -], -``` - -```json -"rust-analyzer.cargo.buildScripts.overrideCommand": [ - "BOOTSTRAP_TRACING=1", // <- note this - "python3", - "x.py", - "check", - "--json-output", - "--build-dir=build-rust-analyzer" -], -``` +Unfortunately, because bootstrap is a `rust-analyzer.linkedProjects`, you can't ask r-a to check/build bootstrap itself with `tracing` feature enabled to get relevant completions, due to lack of support as described in . diff --git a/src/building/bootstrapping/debugging-bootstrap/tracing-output-example.png b/src/building/bootstrapping/debugging-bootstrap/tracing-output-example.png deleted file mode 100644 index 745aec50d4a36563fa2701a3647506b29576518a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140711 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

(^WK44=cvB_&R#yN?@avo_z#Y8bN?d# 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

z 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 From ae3a58a13a7fad816bf57b037ca698585f36cc68 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 26 Jan 2025 12:08:48 -0800 Subject: [PATCH 38/52] Correct information on dylib compression Compression of dylibs was removed in https://github.com/rust-lang/rust/pull/113695 (and decompression removed in https://github.com/rust-lang/rust/pull/132402). --- src/backend/libs-and-metadata.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/libs-and-metadata.md b/src/backend/libs-and-metadata.md index b0823b9a..556b3fdf 100644 --- a/src/backend/libs-and-metadata.md +++ b/src/backend/libs-and-metadata.md @@ -42,7 +42,7 @@ format is specific to `rustc`, and may change over time. This file contains: ### dylib A `dylib` is a platform-specific shared library. It includes the `rustc` -[metadata] in a special link section called `.rustc` in a compressed format. +[metadata] in a special link section called `.rustc`. ### rmeta From a0f5d80dfe8d77b4b17b344c40a4fef0965661dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Mon, 27 Jan 2025 23:34:36 +0100 Subject: [PATCH 39/52] Fix rustc-pull CI's bash commands --- .github/workflows/rustc-pull.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rustc-pull.yml b/.github/workflows/rustc-pull.yml index 87a3ee2e..615927d5 100644 --- a/.github/workflows/rustc-pull.yml +++ b/.github/workflows/rustc-pull.yml @@ -50,10 +50,10 @@ jobs: RESULT=`gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | length' --json title` if [[ "$RESULT" -eq 0 ]]; then echo "Creating new pull request" - PR_URL=gh pr create -B master --title 'Rustc pull update' --body 'Latest update from rustc.' + PR_URL=`gh pr create -B master --title 'Rustc pull update' --body 'Latest update from rustc.'` echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT else - PR_URL=gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | .[0].url' --json url,title + PR_URL=`gh pr list --author github-actions[bot] --state open -q 'map(select(.title=="Rustc pull update")) | .[0].url' --json url,title` echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT fi env: From 636c5b1a4d07e2747e58df04d8218507a65dd178 Mon Sep 17 00:00:00 2001 From: Joren-vanGoethem <55790052+Joren-vanGoethem@users.noreply.github.com> Date: Tue, 28 Jan 2025 07:43:16 +0100 Subject: [PATCH 40/52] Update about-this-guide.md --- src/about-this-guide.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/about-this-guide.md b/src/about-this-guide.md index 793bfa9e..781a5c51 100644 --- a/src/about-this-guide.md +++ b/src/about-this-guide.md @@ -72,7 +72,6 @@ You might also find the following sites useful: - The [Rust reference][rr], even though it doesn't specifically talk about Rust's internals, is a great resource nonetheless - Although out of date, [Tom Lee's great blog article][tlgba] is very helpful -- [rustaceans.org][ro] is helpful, but mostly dedicated to IRC - The [Rust Compiler Testing Docs][rctd] - For [@bors], [this cheat sheet][cheatsheet] is helpful - Google is always helpful when programming. From b06461f7df95b0dd517f32f8b244ef61f9f466df Mon Sep 17 00:00:00 2001 From: Boxy Date: Tue, 28 Jan 2025 11:57:04 +0000 Subject: [PATCH 41/52] Preparing for merge from rustc --- rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-version b/rust-version index 9693bfd6..183d26b2 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -ecda83b30f0f68cf5692855dddc0bc38ee8863fc +66d6064f9eb888018775e08f84747ee6f39ba28e From bc8f00367ef549fc1b80ce209afbf5308813d37d Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 28 Jan 2025 11:04:26 -0700 Subject: [PATCH 42/52] Add some extra pointers for rustdoc frontend devs --- src/rustdoc.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rustdoc.md b/src/rustdoc.md index 3867d248..2a0e212f 100644 --- a/src/rustdoc.md +++ b/src/rustdoc.md @@ -58,10 +58,13 @@ does is call the `main()` that's in this crate's `lib.rs`, though.) * If you want to copy those docs to a webserver, copy all of `build/host/doc`, since that's where the CSS, JS, fonts, and landing page are. + * For frontend debugging, disable the `rust.docs-minification` option in [`config.toml`]. * Use `./x test tests/rustdoc*` to run the tests using a stage1 rustdoc. * See [Rustdoc internals] for more information about tests. +[`config.toml`]: ./building/how-to-build-and-run.md + ## Code structure * All paths in this section are relative to `src/librustdoc` in the rust-lang/rust repository. @@ -77,6 +80,7 @@ does is call the `main()` that's in this crate's `lib.rs`, though.) * The tests on the structure of rustdoc HTML output are located in `tests/rustdoc`, where they're handled by the test runner of bootstrap and the supplementary script `src/etc/htmldocck.py`. +* Frontend CSS and JavaScript are stored in `html/static/`. ## Tests @@ -91,6 +95,11 @@ does is call the `main()` that's in this crate's `lib.rs`, though.) browser-UI-test](https://github.com/GuillaumeGomez/browser-UI-test/) that uses puppeteer to run tests in a headless browser and check rendering and interactivity. +* Additionally, JavaScript type annotations are written using [TypeScript-flavored JSDoc] + comments and an external d.ts file. The code itself is plain, valid JavaScript; we only + use tsc as a linter. + +[TypeScript-flavored JSDoc]: https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html ## Constraints From cd9a8cc9c3179bce896fc482ca66d542e89a52d9 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 25 Jan 2025 04:26:32 +0000 Subject: [PATCH 43/52] Move outlives env computation into methods --- src/traits/implied-bounds.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traits/implied-bounds.md b/src/traits/implied-bounds.md index 63b09a43..05693dcd 100644 --- a/src/traits/implied-bounds.md +++ b/src/traits/implied-bounds.md @@ -40,7 +40,7 @@ requirements of impls and functions as explicit predicates. ### using implicit implied bounds as assumptions These bounds are not added to the `ParamEnv` of the affected item itself. For lexical -region resolution they are added using [`fn OutlivesEnvironment::with_bounds`]. +region resolution they are added using [`fn OutlivesEnvironment::new`]. Similarly, during MIR borrowck we add them using [`fn UniversalRegionRelationsBuilder::add_implied_bounds`]. @@ -55,7 +55,7 @@ The assumed outlives constraints for implicit bounds are computed using the MIR borrowck adds the outlives constraints for both the normalized and unnormalized types, lexical region resolution [only uses the unnormalized types][notnorm]. -[`fn OutlivesEnvironment::with_bounds`]: https://github.com/rust-lang/rust/blob/5b8bc568d28b2e922290c9a966b3231d0ce9398b/compiler/rustc_infer/src/infer/outlives/env.rs#L90-L97 +[`fn OutlivesEnvironment::new`]: TODO [`fn UniversalRegionRelationsBuilder::add_implied_bounds`]: https://github.com/rust-lang/rust/blob/5b8bc568d28b2e922290c9a966b3231d0ce9398b/compiler/rustc_borrowck/src/type_check/free_region_relations.rs#L316 [mir]: https://github.com/rust-lang/rust/blob/91cae1dcdcf1a31bd8a92e4a63793d65cfe289bb/compiler/rustc_borrowck/src/type_check/free_region_relations.rs#L258-L332 [`fn assumed_wf_types`]: https://github.com/rust-lang/rust/blob/5b8bc568d28b2e922290c9a966b3231d0ce9398b/compiler/rustc_ty_utils/src/implied_bounds.rs#L21 From 936683c1c9dd51da17126b75412f008db328bd29 Mon Sep 17 00:00:00 2001 From: Mohammad Omidvar Date: Tue, 28 Jan 2025 19:45:20 +0000 Subject: [PATCH 44/52] Make crate AST mutation accessible for driver callback --- examples/rustc-driver-example.rs | 2 +- examples/rustc-driver-interacting-with-the-ast.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/rustc-driver-example.rs b/examples/rustc-driver-example.rs index 8983915d..b0f9af1b 100644 --- a/examples/rustc-driver-example.rs +++ b/examples/rustc-driver-example.rs @@ -58,7 +58,7 @@ impl rustc_driver::Callbacks for MyCallbacks { fn after_crate_root_parsing( &mut self, _compiler: &Compiler, - krate: &rustc_ast::Crate, + krate: &mut rustc_ast::Crate, ) -> Compilation { for item in &krate.items { println!("{}", item_to_string(&item)); diff --git a/examples/rustc-driver-interacting-with-the-ast.rs b/examples/rustc-driver-interacting-with-the-ast.rs index c894b604..8766a817 100644 --- a/examples/rustc-driver-interacting-with-the-ast.rs +++ b/examples/rustc-driver-interacting-with-the-ast.rs @@ -58,7 +58,7 @@ impl rustc_driver::Callbacks for MyCallbacks { fn after_crate_root_parsing( &mut self, _compiler: &Compiler, - krate: &rustc_ast::Crate, + krate: &mut rustc_ast::Crate, ) -> Compilation { for item in &krate.items { println!("{}", item_to_string(&item)); From 930c6a61e34633d6c53919fe0ccbf1fea979553f Mon Sep 17 00:00:00 2001 From: yegeunyang Date: Tue, 28 Jan 2025 20:42:26 -0600 Subject: [PATCH 45/52] Add "Writing tests" section --- src/getting-started.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/getting-started.md b/src/getting-started.md index 03d2811e..d7797d2e 100644 --- a/src/getting-started.md +++ b/src/getting-started.md @@ -137,6 +137,10 @@ pull request, continuing the work on the feature. [abandoned-prs]: https://github.com/rust-lang/rust/pulls?q=is%3Apr+label%3AS-inactive+is%3Aclosed +### Writing tests + +Issues that have been resolved but do not have a regression test are marked with the `E-needs-test` label. Writing unit tests is a low-risk, lower-priority task that offers new contributors a great opportunity to familiarize themselves with the codebase. + ### Contributing to std (standard library) See [std-dev-guide](https://std-dev-guide.rust-lang.org/). From 7e74e43eaa0297a076237cb986ba2a6b1ecde011 Mon Sep 17 00:00:00 2001 From: yegeunyang Date: Tue, 28 Jan 2025 21:05:12 -0600 Subject: [PATCH 46/52] Add link to declare_lint! macro --- src/diagnostics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagnostics.md b/src/diagnostics.md index 709e9d4f..8f389640 100644 --- a/src/diagnostics.md +++ b/src/diagnostics.md @@ -602,7 +602,7 @@ as the linter walks the AST. You can then choose to emit lints in a very similar way to compile errors. You also declare the metadata of a particular lint via the `declare_lint!` -macro. This includes the name, the default level, a short description, and some +macro. [This macro](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint_defs/macro.declare_lint.html) includes the name, the default level, a short description, and some more details. Note that the lint and the lint pass must be registered with the compiler. From 2332c8e11493390c01016a8f19c772ed8ec3ca66 Mon Sep 17 00:00:00 2001 From: yegeunyang Date: Tue, 28 Jan 2025 22:56:52 -0600 Subject: [PATCH 47/52] Touch up a sentence --- src/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/getting-started.md b/src/getting-started.md index d7797d2e..4cb1d0b3 100644 --- a/src/getting-started.md +++ b/src/getting-started.md @@ -139,7 +139,7 @@ pull request, continuing the work on the feature. ### Writing tests -Issues that have been resolved but do not have a regression test are marked with the `E-needs-test` label. Writing unit tests is a low-risk, lower-priority task that offers new contributors a great opportunity to familiarize themselves with the codebase. +Issues that have been resolved but do not have a regression test are marked with the `E-needs-test` label. Writing unit tests is a low-risk, lower-priority task that offers new contributors a great opportunity to familiarize themselves with the testing infrastructure and contribution workflow. ### Contributing to std (standard library) From 0cd4069ee42e80dec6ce74ba1a0b22b3d63b638a Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Fri, 10 Jan 2025 20:09:10 +0000 Subject: [PATCH 48/52] Rework rustc_dump_vtable --- src/compiler-debugging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler-debugging.md b/src/compiler-debugging.md index a2a6c808..e2097b26 100644 --- a/src/compiler-debugging.md +++ b/src/compiler-debugging.md @@ -275,7 +275,7 @@ Here are some notable ones: | `rustc_dump_def_parents` | Dumps the chain of `DefId` parents of certain definitions. | | `rustc_dump_item_bounds` | Dumps the [`item_bounds`] of an item. | | `rustc_dump_predicates` | Dumps the [`predicates_of`] an item. | -| `rustc_dump_vtable` | | +| `rustc_dump_vtable` | Dumps the vtable layout of an impl, or a type alias of a dyn type. | | `rustc_hidden_type_of_opaques` | Dumps the [hidden type of each opaque types][opaq] in the crate. | | `rustc_layout` | [See this section](#debugging-type-layouts). | | `rustc_object_lifetime_default` | Dumps the [object lifetime defaults] of an item. | From 55cd18d5cc255d8932e17be9369b61c93091a5d7 Mon Sep 17 00:00:00 2001 From: Ryan Cumming Date: Fri, 31 Jan 2025 10:23:46 +1100 Subject: [PATCH 49/52] Fix a typo in conventions.md Introduced in #135950 --- src/conventions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conventions.md b/src/conventions.md index 4010e908..0e624a45 100644 --- a/src/conventions.md +++ b/src/conventions.md @@ -43,7 +43,7 @@ environment. ## Formatting and linting Python code -The Rust repository contains quite a lof of Python code. We try to keep +The Rust repository contains quite a lot of Python code. We try to keep it both linted and formatted by the [ruff][ruff] tool. When modifying Python code, use this command to format it: From 65daf3b01a0450e6772abfed88b207654681038d Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 2 Feb 2025 16:06:16 +0000 Subject: [PATCH 50/52] Replace ParseSess::set_dcx with DiagCtxt::set_emitter Replacing the error emitter doesn't accidentally clear the error count. --- examples/rustc-interface-getting-diagnostics.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/rustc-interface-getting-diagnostics.rs b/examples/rustc-interface-getting-diagnostics.rs index be37dd86..2355cb85 100644 --- a/examples/rustc-interface-getting-diagnostics.rs +++ b/examples/rustc-interface-getting-diagnostics.rs @@ -10,6 +10,8 @@ extern crate rustc_interface; extern crate rustc_session; extern crate rustc_span; +use std::sync::{Arc, Mutex}; + use rustc_errors::emitter::Emitter; use rustc_errors::registry::{self, Registry}; use rustc_errors::translation::Translate; @@ -17,8 +19,6 @@ use rustc_errors::{DiagCtxt, DiagInner, FluentBundle}; use rustc_session::config; use rustc_span::source_map::SourceMap; -use std::sync::{Arc, Mutex}; - struct DebugEmitter { source_map: Arc, diagnostics: Arc>>, @@ -67,10 +67,10 @@ fn main() { locale_resources: rustc_driver::DEFAULT_LOCALE_RESOURCES.to_owned(), lint_caps: rustc_hash::FxHashMap::default(), psess_created: Some(Box::new(|parse_sess| { - parse_sess.set_dcx(DiagCtxt::new(Box::new(DebugEmitter { + parse_sess.dcx().set_emitter(Box::new(DebugEmitter { source_map: parse_sess.clone_source_map(), diagnostics, - }))); + })); })), register_lints: None, override_queries: None, From 9f683c9070e802ce8c5b5636eb14cd5183a7ac36 Mon Sep 17 00:00:00 2001 From: Askar Safin Date: Mon, 3 Feb 2025 06:44:41 +0300 Subject: [PATCH 51/52] tree-wide: parallel: Fully removed all `Lrc`, replaced with `Arc` --- examples/rustc-driver-example.rs | 4 ++-- examples/rustc-driver-interacting-with-the-ast.rs | 4 ++-- src/diagnostics/lintstore.md | 2 +- src/parallel-rustc.md | 1 - 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/rustc-driver-example.rs b/examples/rustc-driver-example.rs index b0f9af1b..14998965 100644 --- a/examples/rustc-driver-example.rs +++ b/examples/rustc-driver-example.rs @@ -15,9 +15,9 @@ extern crate rustc_span; use std::io; use std::path::Path; +use std::sync::Arc; use rustc_ast_pretty::pprust::item_to_string; -use rustc_data_structures::sync::Lrc; use rustc_driver::{Compilation, run_compiler}; use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; @@ -43,7 +43,7 @@ fn main() { } } - fn read_binary_file(&self, _path: &Path) -> io::Result> { + fn read_binary_file(&self, _path: &Path) -> io::Result> { Err(io::Error::other("oops")) } } diff --git a/examples/rustc-driver-interacting-with-the-ast.rs b/examples/rustc-driver-interacting-with-the-ast.rs index 8766a817..9fcb16b0 100644 --- a/examples/rustc-driver-interacting-with-the-ast.rs +++ b/examples/rustc-driver-interacting-with-the-ast.rs @@ -15,9 +15,9 @@ extern crate rustc_span; use std::io; use std::path::Path; +use std::sync::Arc; use rustc_ast_pretty::pprust::item_to_string; -use rustc_data_structures::sync::Lrc; use rustc_driver::{Compilation, run_compiler}; use rustc_interface::interface::{Compiler, Config}; use rustc_middle::ty::TyCtxt; @@ -43,7 +43,7 @@ fn main() { } } - fn read_binary_file(&self, _path: &Path) -> io::Result> { + fn read_binary_file(&self, _path: &Path) -> io::Result> { Err(io::Error::other("oops")) } } diff --git a/src/diagnostics/lintstore.md b/src/diagnostics/lintstore.md index bd2b0252..7b98bc62 100644 --- a/src/diagnostics/lintstore.md +++ b/src/diagnostics/lintstore.md @@ -54,7 +54,7 @@ Lints are registered via the [`LintStore::register_lint`] function. This should happen just once for any lint, or an ICE will occur. Once the registration is complete, we "freeze" the lint store by placing it in -an `Lrc`. +an `Arc`. Lint passes are registered separately into one of the categories (pre-expansion, early, late, late module). Passes are registered as a closure diff --git a/src/parallel-rustc.md b/src/parallel-rustc.md index 2dae95a3..44c78a12 100644 --- a/src/parallel-rustc.md +++ b/src/parallel-rustc.md @@ -46,7 +46,6 @@ are implemented differently depending on whether `parallel-compiler` is true. | data structure | parallel | non-parallel | | -------------------------------- | --------------------------------------------------- | ------------ | -| Lrc | std::sync::Arc | std::rc::Rc | | Weak | std::sync::Weak | std::rc::Weak | | Atomic{Bool}/{Usize}/{U32}/{U64} | std::sync::atomic::Atomic{Bool}/{Usize}/{U32}/{U64} | (std::cell::Cell) | | OnceCell | std::sync::OnceLock | std::cell::OnceCell | From 0238431e2011208621531a003abad5a614819869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Tue, 4 Feb 2025 11:10:14 +0100 Subject: [PATCH 52/52] Update rustc-dev-guide --- src/profiling/with_rustc_perf.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/profiling/with_rustc_perf.md b/src/profiling/with_rustc_perf.md index 87d205d9..eda8c3a1 100644 --- a/src/profiling/with_rustc_perf.md +++ b/src/profiling/with_rustc_perf.md @@ -7,9 +7,7 @@ However, using the suite manually can be a bit cumbersome. To make this easier f the compiler build system (`bootstrap`) also provides built-in integration with the benchmarking suite, which will download and build the suite for you, build a local compiler toolchain and let you profile it using a simplified command-line interface. -You can use the `./x perf -- [options]` command to use this integration. - -> Note that you need to specify arguments after `--` in the `x perf` command! You will not be able to pass arguments without the double dashes. +You can use the `./x perf [options]` command to use this integration. You can use normal bootstrap flags for this command, such as `--stage 1` or `--stage 2`, for example to modify the stage of the created sysroot. It might also be useful to configure `config.toml` to better support profiling, e.g. set `rust.debuginfo-level = 1` to add source line information to the built compiler.

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𝔴D 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