Rollup merge of #135829 - Kobzol:rustc-push, r=jieyouxu
Rustc dev guide subtree update r? ``@ghost``
This commit is contained in:
commit
dcd43d3896
31 changed files with 184 additions and 106 deletions
19
src/doc/rustc-dev-guide/.github/workflows/ci.yml
vendored
19
src/doc/rustc-dev-guide/.github/workflows/ci.yml
vendored
|
@ -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--${{ env.MDBOOK_LINKCHECK2_VERSION }}
|
||||
|
||||
- name: Install latest nightly Rust toolchain
|
||||
if: steps.mdbook-cache.outputs.cache-hit != 'true'
|
||||
|
@ -59,6 +60,14 @@ jobs:
|
|||
- name: Check build
|
||||
run: ENABLE_LINKCHECK=1 mdbook build
|
||||
|
||||
- name: Save cached Linkcheck
|
||||
id: cache-linkcheck-save
|
||||
if: ${{ !cancelled() && github.event_name == 'schedule' }}
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: book/linkcheck/cache.json
|
||||
key: linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }}
|
||||
|
||||
- name: Deploy to gh-pages
|
||||
if: github.event_name == 'push'
|
||||
run: |
|
||||
|
|
85
src/doc/rustc-dev-guide/.github/workflows/rustc-pull.yml
vendored
Normal file
85
src/doc/rustc-dev-guide/.github/workflows/rustc-pull.yml
vendored
Normal file
|
@ -0,0 +1,85 @@
|
|||
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
|
||||
outputs:
|
||||
pr_url: ${{ steps.update-pr.outputs.pr_url }}
|
||||
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
|
||||
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
|
||||
# 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"
|
||||
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
|
||||
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 }}
|
2
src/doc/rustc-dev-guide/.gitignore
vendored
2
src/doc/rustc-dev-guide/.gitignore
vendored
|
@ -4,3 +4,5 @@ ci/date-check/target/
|
|||
|
||||
# Generated by check-in.sh
|
||||
pulls.json
|
||||
|
||||
josh-sync/target
|
||||
|
|
|
@ -74,6 +74,13 @@ including the `<!-- toc -->` 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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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.
|
||||
|
@ -76,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.");
|
||||
|
|
|
@ -1 +1 @@
|
|||
dcfa38fe234de9304169afc6638e81d0dd222c06
|
||||
ecda83b30f0f68cf5692855dddc0bc38ee8863fc
|
||||
|
|
|
@ -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<T>` 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<P1...Pn>`) | [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)
|
||||
|
|
|
@ -69,7 +69,7 @@ Term | Meaning
|
|||
<span id="rib">rib</span> | A data structure in the name resolver that keeps track of a single scope for names. ([see more](../name-resolution.md))
|
||||
<span id="rpit">RPIT</span> | A return-position `impl Trait`. ([see the reference](https://doc.rust-lang.org/reference/types/impl-trait.html#abstract-return-types)).
|
||||
<span id="rpitit">RPITIT</span> | 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))
|
||||
<span id="scrutinee">scrutinee</div> | 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.
|
||||
<span id="scrutinee">scrutinee</span> | 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.
|
||||
<span id="sess">`sess`</span> | The compiler _session_, which stores global data used throughout compilation
|
||||
<span id="side-tables">side tables</span> | 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.
|
||||
<span id="sigil">sigil</span> | Like a keyword but composed entirely of non-alphanumeric tokens. For example, `&` is a sigil for references.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
<a id="guide">
|
||||
<a id="guide"></a>
|
||||
|
||||
### Removing a lint
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 <https://forge.rust-lang.org/release/issue-triaging.html>.
|
||||
|
||||
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
|
||||
|
||||
<style>
|
||||
.label-color {
|
||||
border-radius:0.5em;
|
||||
}
|
||||
table td:nth-child(2) {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
| Labels | Color | Description |
|
||||
|--------|-------|-------------|
|
||||
| [A-] | <span class="label-color" style="background-color:#f7e101;"> </span> Yellow | The **area** of the project an issue relates to. |
|
||||
| [B-] | <span class="label-color" style="background-color:#d304cb;"> </span> Magenta | Issues which are **blockers**. |
|
||||
| [beta-] | <span class="label-color" style="background-color:#1e76d9;"> </span> Dark Blue | Tracks changes which need to be [backported to beta][beta-backport] |
|
||||
| [C-] | <span class="label-color" style="background-color:#f5f1fd;"> </span> Light Purple | The **category** of an issue. |
|
||||
| [D-] | <span class="label-color" style="background-color:#c9f7a3;"> </span> Mossy Green | Issues for **diagnostics**. |
|
||||
| [E-] | <span class="label-color" style="background-color:#02e10c;"> </span> Green | The **experience** level necessary to fix an issue. |
|
||||
| [F-] | <span class="label-color" style="background-color:#f9c0cc;"> </span> Peach | Issues for **nightly features**. |
|
||||
| [I-] | <span class="label-color" style="background-color:#e10c02;"> </span> Red | The **importance** of the issue. |
|
||||
| [I-\*-nominated] | <span class="label-color" style="background-color:#e10c02;"> </span> Red | The issue has been nominated for discussion at the next meeting of the corresponding team. |
|
||||
| [I-prioritize] | <span class="label-color" style="background-color:#e10c02;"> </span> Red | The issue has been nominated for prioritization by the team tagged with a **T**-prefixed label. |
|
||||
| [L-] | <span class="label-color" style="background-color:#64E9CF;"> </span> Teal | The relevant **lint**. |
|
||||
| [metabug] | <span class="label-color" style="background-color:#5319e7;"> </span> Purple | Bugs that collect other bugs. |
|
||||
| [O-] | <span class="label-color" style="background-color:#6e6ec0;"> </span> Purple Grey | The **operating system** or platform that the issue is specific to. |
|
||||
| [P-] | <span class="label-color" style="background-color:#eb6420;"> </span> 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-] | <span class="label-color" style="background-color:#e4008a;"> </span> Pink | Tracks regressions from a stable release. |
|
||||
| [relnotes] | <span class="label-color" style="background-color:#fad8c7;"> </span> Light Orange | Changes that should be documented in the release notes of the next release. |
|
||||
| [S-] | <span class="label-color" style="background-color:#d3dddd;"> </span> Gray | Tracks the **status** of pull requests. |
|
||||
| [S-tracking-] | <span class="label-color" style="background-color:#4682b4;"> </span> Steel Blue | Tracks the **status** of [tracking issues]. |
|
||||
| [stable-] | <span class="label-color" style="background-color:#00229c;"> </span> Dark Blue | Tracks changes which need to be [backported to stable][stable-backport] in anticipation of a point release. |
|
||||
| [T-] | <span class="label-color" style="background-color:#bfd4f2;"> </span> Blue | Denotes which **team** the issue belongs to. |
|
||||
| [WG-] | <span class="label-color" style="background-color:#c2e0c6;"> </span> 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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -18,9 +18,11 @@ 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)
|
||||
* [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
|
||||
|
@ -33,13 +35,15 @@ 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
|
||||
* `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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -23,9 +23,6 @@ well-formed after normalizing said aliases. We rely on this as
|
|||
otherwise we would have to re-check for well-formedness for these
|
||||
types.
|
||||
|
||||
This is unfortunately broken for `<fndef as FnOnce<..>>::Output` due to implied bounds,
|
||||
resulting in [#114936].
|
||||
|
||||
### Structural equality modulo regions implies semantic equality ✅
|
||||
|
||||
If you have a some type and equate it to itself after replacing any regions with unique
|
||||
|
@ -33,7 +30,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 +88,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:
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
[`ci.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.
|
||||
|
||||
|
@ -409,10 +409,25 @@ 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
|
||||
<https://github.com/rust-lang-ci/rust/actions?query=branch%3Aauto+is%3Asuccess>
|
||||
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
|
||||
[`ci.py`]: https://github.com/rust-lang/rust/blob/master/src/ci/github-actions/ci.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
|
||||
|
|
|
@ -252,7 +252,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 |
|
||||
|
||||
<!--
|
||||
**FIXME(rustdoc)**: what does `check-test-line-numbers-match` do?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
[#100051]: https://github.com/rust-lang/rust/issues/100051
|
||||
|
|
|
@ -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:
|
||||
```
|
||||
|
|
|
@ -48,7 +48,7 @@ fn bar(foo: Foo<u32, f32>) {
|
|||
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.
|
||||
|
||||
|
|
|
@ -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<Param(0)>: Sized` vs `Vec<T>: 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<T>` it would be written as `Vec<T/#0>`.
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue