Fix more links (#1884)
This commit is contained in:
parent
0916e9b8f5
commit
e0a9ace640
|
|
@ -38,7 +38,9 @@ exclude = [
|
|||
"www\\.amazon\\.com",
|
||||
"www\\.rustaceans\\.org",
|
||||
"play\\.rust-lang\\.org",
|
||||
"tomlee\\.co"
|
||||
"tomlee\\.co",
|
||||
"marketplace\\.visualstudio\\.com",
|
||||
"objects\\.githubusercontent\\.com"
|
||||
]
|
||||
cache-timeout = 86400
|
||||
warning-policy = "error"
|
||||
|
|
|
|||
|
|
@ -112,9 +112,7 @@ common sorts of constraints are:
|
|||
(e.g. `'a: 'b`). Outlives constraints are generated by the [MIR type
|
||||
checker].
|
||||
2. Liveness constraints. Each region needs to be live at points where it can be
|
||||
used. These constraints are collected by [`generate_constraints`].
|
||||
|
||||
[`generate_constraints`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_borrowck/constraint_generation/fn.generate_constraints.html
|
||||
used.
|
||||
|
||||
## Inference Overview
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
## Early-bound parameters
|
||||
|
||||
Early-bound parameters in rustc are identified by an index, stored in the
|
||||
[`ParamTy`] struct for types or the [`EarlyBoundRegion`] struct for lifetimes.
|
||||
[`ParamTy`] struct for types or the [`EarlyParamRegion`] struct for lifetimes.
|
||||
The index counts from the outermost declaration in scope. This means that as you
|
||||
add more binders inside, the index doesn't change.
|
||||
|
||||
|
|
@ -24,7 +24,7 @@ In rustc, the [`Generics`] structure carries this information. So the
|
|||
in [this chapter](./generics.md).
|
||||
|
||||
[`ParamTy`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamTy.html
|
||||
[`EarlyBoundRegion`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.EarlyBoundRegion.html
|
||||
[`EarlyParamRegion`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/region/struct.EarlyParamRegion.html
|
||||
[`Generics`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Generics.html
|
||||
|
||||
## Late-bound parameters
|
||||
|
|
|
|||
|
|
@ -99,9 +99,9 @@ further queries need to be executed in order to get at something as simple as a
|
|||
Future evaluations of the same constants will not actually invoke
|
||||
the interpreter, but just use the cached result.
|
||||
|
||||
[`Operand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/enum.Operand.html
|
||||
[`Operand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/operand/enum.Operand.html
|
||||
[`Immediate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/interpret/enum.Immediate.html
|
||||
[`ConstValue`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/enum.ConstValue.html
|
||||
[`ConstValue`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/consts/enum.ConstValue.html
|
||||
[`Scalar`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/enum.Scalar.html
|
||||
[`op_to_const`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_const_eval/const_eval/eval_queries/fn.op_to_const.html
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Diagnostic and subdiagnostic structs
|
||||
rustc has three diagnostic derives that can be used to create simple diagnostics,
|
||||
which are recommended to be used when they are applicable:
|
||||
`#[derive(Diagnostic)]`, #[derive(LintDiagnostic)], and `#[derive(Subdiagnostic)]`.
|
||||
`#[derive(Diagnostic)]`, `#[derive(LintDiagnostic)]`, and `#[derive(Subdiagnostic)]`.
|
||||
|
||||
Diagnostics created with the derive macros can be translated into different
|
||||
languages and each has a slug that uniquely identifies the diagnostic.
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ written, as always: ask your reviewer or ask around on the Rust Discord or Zulip
|
|||
|
||||
[^new-explanations]: See the draft RFC [here][new-explanations-rfc].
|
||||
|
||||
[`rustc_error_codes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_error_codes/error_codes/index.html
|
||||
[`rustc_error_codes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_error_codes/index.html
|
||||
[CommonMark Spec]: https://spec.commonmark.org/current/
|
||||
[RFC 1567]: https://github.com/rust-lang/rfcs/blob/master/text/1567-long-error-codes-explanation-normalization.md
|
||||
[new-explanations-rfc]: https://github.com/rust-lang/rfcs/pull/3370
|
||||
|
|
|
|||
|
|
@ -6,20 +6,20 @@ inference, type checking, and trait solving. Conceptually, during these routines
|
|||
that one type is equal to another type and want to swap one out for the other and then swap that out
|
||||
for another type and so on until we eventually get some concrete types (or an error).
|
||||
|
||||
In rustc this is done using [GenericArgsRef].
|
||||
Conceptually, you can think of `GenericArgsRef` as a list of types that are to be substituted for
|
||||
In rustc this is done using [GenericArgs].
|
||||
Conceptually, you can think of `GenericArgs` as a list of types that are to be substituted for
|
||||
the generic type parameters of the ADT.
|
||||
|
||||
`GenericArgsRef` is a type alias of `&'tcx List<GenericArg<'tcx>>` (see [`List` rustdocs][list]).
|
||||
`GenericArgs` is a type alias of `&'tcx List<GenericArg<'tcx>>` (see [`List` rustdocs][list]).
|
||||
[`GenericArg`] is essentially a space-efficient wrapper around [`GenericArgKind`], which is an enum
|
||||
indicating what kind of generic the type parameter is (type, lifetime, or const).
|
||||
Thus, `GenericArgsRef` is conceptually like a `&'tcx [GenericArgKind<'tcx>]` slice (but it is
|
||||
Thus, `GenericArgs` is conceptually like a `&'tcx [GenericArgKind<'tcx>]` slice (but it is
|
||||
actually a `List`).
|
||||
|
||||
[list]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.List.html
|
||||
[`GenericArg`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.GenericArg.html
|
||||
[`GenericArgKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.GenericArgKind.html
|
||||
[GenericArgsRef]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.GenericArgsRef.html
|
||||
[GenericArgs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.GenericArgs.html
|
||||
|
||||
So why do we use this `List` type instead of making it really a slice? It has the length "inline",
|
||||
so `&List` is only 32 bits. As a consequence, it cannot be "subsliced" (that only works if the
|
||||
|
|
@ -37,10 +37,10 @@ struct MyStruct<T>
|
|||
|
||||
- There would be an `AdtDef` (and corresponding `DefId`) for `MyStruct`.
|
||||
- There would be a `TyKind::Param` (and corresponding `DefId`) for `T` (more later).
|
||||
- There would be a `GenericArgsRef` containing the list `[GenericArgKind::Type(Ty(T))]`
|
||||
- There would be a `GenericArgs` containing the list `[GenericArgKind::Type(Ty(T))]`
|
||||
- The `Ty(T)` here is my shorthand for entire other `ty::Ty` that has `TyKind::Param`, which we
|
||||
mentioned in the previous point.
|
||||
- This is one `TyKind::Adt` containing the `AdtDef` of `MyStruct` with the `GenericArgsRef` above.
|
||||
- This is one `TyKind::Adt` containing the `AdtDef` of `MyStruct` with the `GenericArgs` above.
|
||||
|
||||
Finally, we will quickly mention the
|
||||
[`Generics`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Generics.html) type. It
|
||||
|
|
@ -114,7 +114,7 @@ This example has a few different substitutions:
|
|||
|
||||
Let’s look a bit more closely at that last substitution to see why we use indexes. If we want to
|
||||
find the type of `foo.x`, we can get generic type of `x`, which is `Vec<Param(0)>`. Now we can take
|
||||
the index `0` and use it to find the right type substitution: looking at `Foo`'s `GenericArgsRef`,
|
||||
the index `0` and use it to find the right type substitution: looking at `Foo`'s `GenericArgs`,
|
||||
we have the list `[u32, f32]` , since we want to replace index `0`, we take the 0-th index of this
|
||||
list, which is `u32`. Voila!
|
||||
|
||||
|
|
@ -127,7 +127,7 @@ You may have a couple of followup questions…
|
|||
`MyStruct`: `Adt(Foo, &[Param(0), Param(1)])`.
|
||||
|
||||
How do we actually do the substitutions? There is a function for that too! You
|
||||
use [`instantiate`] to replace a `GenericArgsRef` with another list of types.
|
||||
use [`instantiate`] to replace a `GenericArgs` with another list of types.
|
||||
|
||||
[Here is an example of actually using `instantiate` in the compiler][instantiatex].
|
||||
The exact details are not too important, but in this piece of code, we happen to be
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ So to reiterate:
|
|||
- `TypeFoldable` is a trait that is implemented by things that embed types.
|
||||
|
||||
In the case of `subst`, we can see that it is implemented as a `TypeFolder`:
|
||||
[`SubstFolder`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/subst/struct.SubstFolder.html).
|
||||
[`ArgFolder`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/generic_args/struct.ArgFolder.html).
|
||||
Looking at its implementation, we see where the actual substitutions are happening.
|
||||
|
||||
However, you might also notice that the implementation calls this `super_fold_with` method. What is
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ struct MyStruct<T> { x: u32, y: T }
|
|||
The type `MyStruct<u32>` would be an instance of `TyKind::Adt`:
|
||||
|
||||
```rust,ignore
|
||||
Adt(&'tcx AdtDef, GenericArgsRef<'tcx>)
|
||||
Adt(&'tcx AdtDef, GenericArgs<'tcx>)
|
||||
// ------------ ---------------
|
||||
// (1) (2)
|
||||
//
|
||||
|
|
@ -301,12 +301,12 @@ There are two parts:
|
|||
parameters. In our example, this is the `MyStruct` part *without* the argument `u32`.
|
||||
(Note that in the HIR, structs, enums and unions are represented differently, but in `ty::Ty`,
|
||||
they are all represented using `TyKind::Adt`.)
|
||||
- The [`GenericArgsRef`][GenericArgsRef] is an interned list of values that are to be substituted
|
||||
- The [`GenericArgs`][GenericArgs] is an interned list of values that are to be substituted
|
||||
for the generic parameters. In our example of `MyStruct<u32>`, we would end up with a list like
|
||||
`[u32]`. We’ll dig more into generics and substitutions in a little bit.
|
||||
|
||||
[adtdef]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.AdtDef.html
|
||||
[GenericArgsRef]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/subst/type.GenericArgsRef.html
|
||||
[GenericArgs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.GenericArgs.html
|
||||
|
||||
**`AdtDef` and `DefId`**
|
||||
|
||||
|
|
|
|||
|
|
@ -75,5 +75,4 @@ the ast that searches for unsafe blocks, functions and implementations, as well
|
|||
as certain unsafe attributes.
|
||||
|
||||
[Unsafe traits]: https://doc.rust-lang.org/reference/items/traits.html#unsafe-traits
|
||||
[coherence]: /home/matthew/rust/compiler/rustc_hir_analysis/src/coherence/unsafety.rs
|
||||
|
||||
[coherence]: https://github.com/rust-lang/rust/blob/master/compiler/rustc_hir_analysis/src/coherence/unsafety.rs
|
||||
|
|
|
|||
Loading…
Reference in New Issue