Merge pull request #19126 from lnicola/sync-from-rust
minor: Sync from downstream
This commit is contained in:
commit
8767aebedc
|
|
@ -35,12 +35,15 @@ 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 }}--${{ github.run_id }}
|
||||
restore-keys: |
|
||||
linkcheck--${{ env.MDBOOK_LINKCHECK2_VERSION }}--
|
||||
|
||||
- name: Install latest nightly Rust toolchain
|
||||
if: steps.mdbook-cache.outputs.cache-hit != 'true'
|
||||
|
|
@ -59,6 +62,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 }}--${{ github.run_id }}
|
||||
|
||||
- name: Deploy to gh-pages
|
||||
if: github.event_name == 'push'
|
||||
run: |
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -15,11 +15,11 @@ 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, RunCompiler};
|
||||
use rustc_interface::interface::Compiler;
|
||||
use rustc_driver::{Compilation, run_compiler};
|
||||
use rustc_interface::interface::{Compiler, Config};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
struct MyFileLoader;
|
||||
|
|
@ -43,7 +43,7 @@ fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_binary_file(&self, _path: &Path) -> io::Result<Lrc<[u8]>> {
|
||||
fn read_binary_file(&self, _path: &Path) -> io::Result<Arc<[u8]>> {
|
||||
Err(io::Error::other("oops"))
|
||||
}
|
||||
}
|
||||
|
|
@ -51,10 +51,14 @@ 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,
|
||||
krate: &rustc_ast::Crate,
|
||||
krate: &mut rustc_ast::Crate,
|
||||
) -> Compilation {
|
||||
for item in &krate.items {
|
||||
println!("{}", item_to_string(&item));
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
run_compiler(&["main.rs".to_string()], &mut MyCallbacks);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,11 +15,11 @@ 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, RunCompiler};
|
||||
use rustc_interface::interface::Compiler;
|
||||
use rustc_driver::{Compilation, run_compiler};
|
||||
use rustc_interface::interface::{Compiler, Config};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
struct MyFileLoader;
|
||||
|
|
@ -43,7 +43,7 @@ fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_binary_file(&self, _path: &Path) -> io::Result<Lrc<[u8]>> {
|
||||
fn read_binary_file(&self, _path: &Path) -> io::Result<Arc<[u8]>> {
|
||||
Err(io::Error::other("oops"))
|
||||
}
|
||||
}
|
||||
|
|
@ -51,10 +51,14 @@ 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,
|
||||
krate: &rustc_ast::Crate,
|
||||
krate: &mut rustc_ast::Crate,
|
||||
) -> Compilation {
|
||||
for item in &krate.items {
|
||||
println!("{}", item_to_string(&item));
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
run_compiler(&["main.rs".to_string()], &mut MyCallbacks);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<SourceMap>,
|
||||
diagnostics: Arc<Mutex<Vec<DiagInner>>>,
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
66d6064f9eb888018775e08f84747ee6f39ba28e
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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]:
|
||||
|
||||

|
||||
```
|
||||
$ 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 <https://github.com/rust-lang/rust-analyzer/issues/8521>.
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 137 KiB |
|
|
@ -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].
|
||||
|
||||
<!-- toc -->
|
||||
|
||||
[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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 <!-- date-check: nov 2022 --> `--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 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:
|
||||
```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
|
||||
|
||||
<a id="copyright"></a>
|
||||
|
||||
<!-- REUSE-IgnoreStart -->
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -126,9 +126,9 @@ 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.
|
||||
let b = bar;
|
||||
|
|
@ -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(...) -> ... { ... } */
|
||||
}
|
||||
```
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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 testing infrastructure and contribution workflow.
|
||||
|
||||
### Contributing to std (standard library)
|
||||
|
||||
See [std-dev-guide](https://std-dev-guide.rust-lang.org/).
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<bool/usize/u32/u64>) |
|
||||
| OnceCell | std::sync::OnceLock | std::cell::OnceCell |
|
||||
|
|
|
|||
|
|
@ -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 -- <command> [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 <command> [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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <!-- date-check --> 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 `"<raw>" -> "<normalized>"` before comparing against snapshot | `ui`, `incremental` | `"<RAW>" -> "<NORMALIZED>"`, `<RAW>`/`<NORMALIZED>` is regex capture and replace syntax |
|
||||
|
|
@ -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:
|
||||
|
|
@ -174,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.
|
||||
|
|
@ -249,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
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ 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`].
|
||||
Similarly,during MIR borrowck we add them using
|
||||
region resolution they are added using [`fn OutlivesEnvironment::new`].
|
||||
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].
|
||||
|
|
@ -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
|
||||
|
|
@ -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…
Reference in New Issue