Skip to content

Commit a3e6820

Browse files
authored
Merge branch 'master' into spec-add-identifiers-rest
2 parents 4452b08 + c118ff6 commit a3e6820

File tree

15 files changed

+42
-46
lines changed

15 files changed

+42
-46
lines changed

docs/authoring.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,4 @@ The reference does not document which targets exist, or the properties of specif
154154

155155
### Editions
156156

157-
The main text and flow should document only the current edition. Whenever there is a difference between editions, the differences should be called out with an "Edition Differences" block.
157+
The main text and flow should document only the current edition. Whenever there is a difference between editions, the differences should be called out with an "Edition differences" block.

mdbook-spec/src/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![deny(rust_2018_idioms, unused_lifetimes)]
2+
13
use mdbook::book::{Book, Chapter};
24
use mdbook::errors::Error;
35
use mdbook::preprocess::{CmdPreprocessor, Preprocessor, PreprocessorContext};
@@ -82,8 +84,8 @@ impl Spec {
8284
}
8385
}
8486
format!(
85-
"<div class=\"rule\" id=\"{rule_id}\">\
86-
<a class=\"rule-link\" href=\"#{rule_id}\">[{rule_id}]</a>\
87+
"<div class=\"rule\" id=\"r-{rule_id}\">\
88+
<a class=\"rule-link\" href=\"#r-{rule_id}\">[{rule_id}]</a>\
8789
</div>\n"
8890
)
8991
})
@@ -102,7 +104,7 @@ impl Spec {
102104
.iter()
103105
.map(|(rule_id, (_, path))| {
104106
let relative = pathdiff::diff_paths(path, current_path).unwrap();
105-
format!("[{rule_id}]: {}#{rule_id}\n", relative.display())
107+
format!("[{rule_id}]: {}#r-{rule_id}\n", relative.display())
106108
})
107109
.collect();
108110
format!(

mdbook-spec/src/std_links.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ fn collect_markdown_links(chapter: &Chapter) -> Vec<Link<'_>> {
145145
// Broken links are collected so that you can write something like
146146
// `[std::option::Option]` which in pulldown_cmark's eyes is a broken
147147
// link. However, that is the normal syntax for rustdoc.
148-
let broken_link = |broken_link: BrokenLink| {
148+
let broken_link = |broken_link: BrokenLink<'_>| {
149149
broken_links.push(Link {
150150
link_type: broken_link.link_type,
151151
// Necessary due to lifetime issues.
@@ -205,7 +205,7 @@ fn collect_markdown_links(chapter: &Chapter) -> Vec<Link<'_>> {
205205
/// generate intra-doc links on them.
206206
///
207207
/// The output will be in the given `tmp` directory.
208-
fn run_rustdoc(tmp: &TempDir, chapter_links: &HashMap<&PathBuf, Vec<Link>>) {
208+
fn run_rustdoc(tmp: &TempDir, chapter_links: &HashMap<&PathBuf, Vec<Link<'_>>>) {
209209
let src_path = tmp.path().join("a.rs");
210210
// Allow redundant since there could some in-scope things that are
211211
// technically not necessary, but we don't care about (like

src/const_eval.md

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -61,40 +61,24 @@ A _const context_ is one of the following:
6161
* A [const generic argument]
6262
* A [const block]
6363

64+
Const contexts that are used as parts of types (array type and repeat length
65+
expressions as well as const generic arguments) can only make restricted use of
66+
surrounding generic parameters: such an expression must either be a single bare
67+
const generic parameter, or an arbitrary expression not making use of any
68+
generics.
69+
6470
## Const Functions
6571

6672
A _const fn_ is a function that one is permitted to call from a const context. Declaring a function
6773
`const` has no effect on any existing uses, it only restricts the types that arguments and the
68-
return type may use, as well as prevent various expressions from being used within it. You can freely
69-
do anything with a const function that you can do with a regular function.
74+
return type may use, and restricts the function body to constant expressions.
7075

7176
When called from a const context, the function is interpreted by the
7277
compiler at compile time. The interpretation happens in the
7378
environment of the compilation target and not the host. So `usize` is
7479
`32` bits if you are compiling against a `32` bit system, irrelevant
7580
of whether you are building on a `64` bit or a `32` bit system.
7681

77-
Const functions have various restrictions to make sure that they can be
78-
evaluated at compile-time. It is, for example, not possible to write a random
79-
number generator as a const function. Calling a const function at compile-time
80-
will always yield the same result as calling it at runtime, even when called
81-
multiple times. There's one exception to this rule: if you are doing complex
82-
floating point operations in extreme situations, then you might get (very
83-
slightly) different results. It is advisable to not make array lengths and enum
84-
discriminants depend on floating point computations.
85-
86-
87-
Notable features that are allowed in const contexts but not in const functions include:
88-
89-
* floating point operations
90-
* floating point values are treated just like generic parameters without trait bounds beyond
91-
`Copy`. So you cannot do anything with them but copy/move them around.
92-
93-
Conversely, the following are possible in a const function, but not in a const context:
94-
95-
* Use of generic type and lifetime parameters.
96-
* Const contexts do allow limited use of [const generic parameters].
97-
9882
[arithmetic]: expressions/operator-expr.md#arithmetic-and-logical-binary-operators
9983
[array expressions]: expressions/array-expr.md
10084
[array indexing]: expressions/array-expr.md#array-and-slice-indexing-expressions

src/expressions/method-call-expr.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Once a method is looked up, if it can't be called for one (or more) of those rea
6666
If a step is reached where there is more than one possible method, such as where generic methods or traits are considered the same, then it is a compiler error.
6767
These cases require a [disambiguating function call syntax] for method and function invocation.
6868
69-
> **Edition Differences**: Before the 2021 edition, during the search for visible methods, if the candidate receiver type is an [array type], methods provided by the standard library [`IntoIterator`] trait are ignored.
69+
> **Edition differences**: Before the 2021 edition, during the search for visible methods, if the candidate receiver type is an [array type], methods provided by the standard library [`IntoIterator`] trait are ignored.
7070
>
7171
> The edition used for this purpose is determined by the token representing the method name.
7272
>

src/introduction.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ These conventions are documented here.
8282

8383
An *example term* is an example of a term being defined.
8484

85-
* Differences in the language by which edition the crate is compiled under are in a blockquote that start with the words "Edition Differences:" in **bold**.
85+
* Differences in the language by which edition the crate is compiled under are in a blockquote that start with the words "Edition differences:" in **bold**.
8686

87-
> **Edition Differences**: In the 2015 edition, this syntax is valid that is disallowed as of the 2018 edition.
87+
> **Edition differences**: In the 2015 edition, this syntax is valid that is disallowed as of the 2018 edition.
8888
8989
* Notes that contain useful information about the state of the book or point out useful, but mostly out of scope, information are in blockquotes that start with the word "Note:" in **bold**.
9090

@@ -120,6 +120,15 @@ These conventions are documented here.
120120
121121
See [Notation] for more detail.
122122

123+
* Rule identifiers appear before each language rule enclosed in square brackets. These identifiers provide a way to refer to a specific rule in the language. The rule identifier uses periods to separate sections from most general to most specific ([destructors.scope.nesting.function-body] for example).
124+
125+
The rule name can be clicked to link to that rule.
126+
127+
r[example.rule.label]
128+
129+
> [!WARNING]
130+
> The organization of the rules is currently in flux. For the time being, these identifier names are not stable between releases, and links to these rules may fail if they are changed. We intend to stabilize these once the organization has settled so that links to the rule names will not break between releases.
131+
123132
## Contributing
124133

125134
We welcome contributions of all kinds.

src/items/associated-items.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ let circle_shape = Circle::new();
189189
let bounding_box = circle_shape.bounding_box();
190190
```
191191

192-
> **Edition Differences**: In the 2015 edition, it is possible to declare trait
192+
> **Edition differences**: In the 2015 edition, it is possible to declare trait
193193
> methods with anonymous parameters (e.g. `fn foo(u8)`). This is deprecated and
194194
> an error as of the 2018 edition. All parameters must have an argument name.
195195

src/macros-by-example.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ the `expr` fragment specifier. However, `_` is matched by the `expr` fragment
148148
specifier when it appears as a subexpression.
149149
For the same reason, a standalone [const block] is not matched but it is matched when appearing as a subexpression.
150150

151-
> **Edition Differences**: Starting with the 2021 edition, `pat` fragment-specifiers match top-level or-patterns (that is, they accept [_Pattern_]).
151+
> **Edition differences**: Starting with the 2021 edition, `pat` fragment-specifiers match top-level or-patterns (that is, they accept [_Pattern_]).
152152
>
153153
> Before the 2021 edition, they match exactly the same fragments as `pat_param` (that is, they accept [_PatternNoTopAlt_]).
154154
>
@@ -421,7 +421,7 @@ macro_rules! call_foo {
421421
fn foo() {}
422422
```
423423

424-
> **Version & Edition Differences**: Prior to Rust 1.30, `$crate` and
424+
> **Version & Edition differences**: Prior to Rust 1.30, `$crate` and
425425
> `local_inner_macros` (below) were unsupported. They were added alongside
426426
> path-based imports of macros (described above), to ensure that helper macros
427427
> did not need to be manually imported by users of a macro-exporting crate.
@@ -475,7 +475,7 @@ Matchers like `$i:expr,` or `$i:expr;` would be legal, however, because `,` and
475475
`ident`, `ty`, or `path` fragment specifier.
476476
* All other fragment specifiers have no restrictions.
477477

478-
> **Edition Differences**: Before the 2021 edition, `pat` may also be followed by `|`.
478+
> **Edition differences**: Before the 2021 edition, `pat` may also be followed by `|`.
479479
480480
When repetitions are involved, then the rules apply to every possible number of
481481
expansions, taking separators into account. This means:

src/names/preludes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ new_name`, then the symbol `new_name` is instead added to the prelude.
4444
The [`core`] crate is always added to the extern prelude. The [`std`] crate is
4545
added as long as the [`no_std` attribute] is not specified in the crate root.
4646

47-
> **Edition Differences**: In the 2015 edition, crates in the extern prelude
47+
> **Edition differences**: In the 2015 edition, crates in the extern prelude
4848
> cannot be referenced via [use declarations], so it is generally standard
4949
> practice to include `extern crate` declarations to bring them into scope.
5050
>
@@ -132,7 +132,7 @@ module or any of its descendants.
132132
133133
This attribute does not affect the [language prelude].
134134
135-
> **Edition Differences**: In the 2015 edition, the `no_implicit_prelude`
135+
> **Edition differences**: In the 2015 edition, the `no_implicit_prelude`
136136
> attribute does not affect the [`macro_use` prelude], and all macros exported
137137
> from the standard library are still included in the `macro_use` prelude.
138138
> Starting in the 2018 edition, it will remove the `macro_use` prelude.

src/paths.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ Paths starting with `::` are considered to be *global paths* where the segments
195195
start being resolved from a place which differs based on edition. Each identifier in
196196
the path must resolve to an item.
197197

198+
198199
r[path.qualifier.global-root.edition2015]
199200
> **Edition Differences**: In the 2015 Edition, identifiers resolve from the "crate root"
200201
> (`crate::` in the 2018 edition), which contains a variety of different items, including

src/patterns.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ The range of values for an integer type is the closed range from its minimum to
645645
r[pattern.range.refutable-char]
646646
The range of values for a `char` type are precisely those ranges containing all Unicode Scalar Values: `'\u{0000}'..='\u{D7FF}'` and `'\u{E000}'..='\u{10FFFF}'`.
647647

648-
> **Edition Differences**: Before the 2021 edition, range patterns with both a lower and upper bound may also be written using `...` in place of `..=`, with the same meaning.
648+
> **Edition differences**: Before the 2021 edition, range patterns with both a lower and upper bound may also be written using `...` in place of `..=`, with the same meaning.
649649
650650
## Reference patterns
651651

src/tokens.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ c"\u{00E6}";
375375
c"\xC3\xA6";
376376
```
377377

378-
> **Edition Differences**: C string literals are accepted in the 2021 edition or
378+
> **Edition differences**: C string literals are accepted in the 2021 edition or
379379
> later. In earlier additions the token `c""` is lexed as `c ""`.
380380
381381
#### Raw C string literals
@@ -400,7 +400,7 @@ encoding. The characters `U+0022` (double-quote) (except when followed by at
400400
least as many `U+0023` (`#`) characters as were used to start the raw C string
401401
literal) or `U+005C` (`\`) do not have any special meaning.
402402

403-
> **Edition Differences**: Raw C string literals are accepted in the 2021
403+
> **Edition differences**: Raw C string literals are accepted in the 2021
404404
> edition or later. In earlier additions the token `cr""` is lexed as `cr ""`,
405405
> and `cr#""#` is lexed as `cr #""#` (which is non-grammatical).
406406
@@ -735,7 +735,7 @@ Note that raw identifiers, raw string literals, and raw byte string literals may
735735

736736
Similarly the `r`, `b`, `br`, `c`, and `cr` prefixes used in raw string literals, byte literals, byte string literals, raw byte string literals, C string literals, and raw C string literals are not interpreted as reserved prefixes.
737737

738-
> **Edition Differences**: Starting with the 2021 edition, reserved prefixes are reported as an error by the lexer (in particular, they cannot be passed to macros).
738+
> **Edition differences**: Starting with the 2021 edition, reserved prefixes are reported as an error by the lexer (in particular, they cannot be passed to macros).
739739
>
740740
> Before the 2021 edition, reserved prefixes are accepted by the lexer and interpreted as multiple tokens (for example, one token for the identifier or keyword, followed by a `#` token).
741741
>

src/types/enum.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Enum types cannot be denoted *structurally* as types, but must be denoted by
1616
named reference to an [`enum` item].
1717

1818
[^enumtype]: The `enum` type is analogous to a `data` constructor declaration in
19-
ML, or a *pick ADT* in Limbo.
19+
Haskell, or a *pick ADT* in Limbo.
2020

2121
[`enum` item]: ../items/enumerations.md
2222
[struct expression]: ../expressions/struct-expr.md

src/types/trait-object.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ For example, given a trait `Trait`, the following are all trait objects:
3131
* `dyn 'static + Trait`.
3232
* `dyn (Trait)`
3333

34-
> **Edition Differences**: Before the 2021 edition, the `dyn` keyword may be
34+
> **Edition differences**: Before the 2021 edition, the `dyn` keyword may be
3535
> omitted.
3636
>
3737
> Note: For clarity, it is recommended to always use the `dyn` keyword on your
3838
> trait objects unless your codebase supports compiling with Rust 1.26 or lower.
3939
40-
> **Edition Differences**: In the 2015 edition, if the first bound of the
40+
> **Edition differences**: In the 2015 edition, if the first bound of the
4141
> trait object is a path that starts with `::`, then the `dyn` will be treated
4242
> as a part of the path. The first path can be put in parenthesis to get
4343
> around this. As such, if you want a trait object with the trait

src/visibility-and-privacy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ follows:
156156
- `pub(self)` makes an item visible to the current module. This is equivalent
157157
to `pub(in self)` or not using `pub` at all.
158158

159-
> **Edition Differences**: Starting with the 2018 edition, paths for
159+
> **Edition differences**: Starting with the 2018 edition, paths for
160160
> `pub(in path)` must start with `crate`, `self`, or `super`. The 2015 edition
161161
> may also use paths starting with `::` or modules from the crate root.
162162

0 commit comments

Comments
 (0)