Auto merge of #24758 - Manishearth:rollup, r=Manishearth
- Successful merges: #24523, #24698, #24699, #24700, #24706, #24717, #24718, #24721, #24727 - Failed merges:
This commit is contained in:
commit
f191f92421
@ -271,7 +271,7 @@ cases mentioned in [Number literals](#number-literals) below.
|
||||
##### Suffixes
|
||||
| Integer | Floating-point |
|
||||
|---------|----------------|
|
||||
| `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`, `is` (`isize`), `us` (`usize`) | `f32`, `f64` |
|
||||
| `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`, `isize`, `usize` | `f32`, `f64` |
|
||||
|
||||
#### Character and string literals
|
||||
|
||||
@ -738,15 +738,26 @@ Rust syntax is restricted in two ways:
|
||||
|
||||
# Crates and source files
|
||||
|
||||
Rust is a *compiled* language. Its semantics obey a *phase distinction* between
|
||||
compile-time and run-time. Those semantic rules that have a *static
|
||||
Although Rust, like any other language, can be implemented by an interpreter as
|
||||
well as a compiler, the only existing implementation is a compiler —
|
||||
from now on referred to as *the* Rust compiler — and the language has
|
||||
always been designed to be compiled. For these reasons, this section assumes a
|
||||
compiler.
|
||||
|
||||
Rust's semantics obey a *phase distinction* between compile-time and
|
||||
run-time.[^phase-distinction] Those semantic rules that have a *static
|
||||
interpretation* govern the success or failure of compilation. Those semantics
|
||||
that have a *dynamic interpretation* govern the behavior of the program at
|
||||
run-time.
|
||||
|
||||
[^phase-distinction]: This distinction would also exist in an interpreter.
|
||||
Static checks like syntactic analysis, type checking, and lints should
|
||||
happen before the program is executed regardless of when it is executed.
|
||||
|
||||
The compilation model centers on artifacts called _crates_. Each compilation
|
||||
processes a single crate in source form, and if successful, produces a single
|
||||
crate in binary form: either an executable or a library.[^cratesourcefile]
|
||||
crate in binary form: either an executable or some sort of
|
||||
library.[^cratesourcefile]
|
||||
|
||||
[^cratesourcefile]: A crate is somewhat analogous to an *assembly* in the
|
||||
ECMA-335 CLI model, a *library* in the SML/NJ Compilation Manager, a *unit*
|
||||
@ -767,21 +778,25 @@ extension `.rs`.
|
||||
A Rust source file describes a module, the name and location of which —
|
||||
in the module tree of the current crate — are defined from outside the
|
||||
source file: either by an explicit `mod_item` in a referencing source file, or
|
||||
by the name of the crate itself.
|
||||
by the name of the crate itself. Every source file is a module, but not every
|
||||
module needs its own source file: [module definitions](#modules) can be nested
|
||||
within one file.
|
||||
|
||||
Each source file contains a sequence of zero or more `item` definitions, and
|
||||
may optionally begin with any number of `attributes` that apply to the
|
||||
containing module. Attributes on the anonymous crate module define important
|
||||
metadata that influences the behavior of the compiler.
|
||||
may optionally begin with any number of [attributes](#Items and attributes)
|
||||
that apply to the containing module, most of which influence the behavior of
|
||||
the compiler. The anonymous crate module can have additional attributes that
|
||||
apply to the crate as a whole.
|
||||
|
||||
```no_run
|
||||
// Crate name
|
||||
// Specify the crate name.
|
||||
#![crate_name = "projx"]
|
||||
|
||||
// Specify the output type
|
||||
// Specify the type of output artifact.
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// Turn on a warning
|
||||
// Turn on a warning.
|
||||
// This can be done in any module, not just the anonymous crate module.
|
||||
#![warn(non_camel_case_types)]
|
||||
```
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
* [Learn Rust](learn-rust.md)
|
||||
* [Effective Rust](effective-rust.md)
|
||||
* [The Stack and the Heap](the-stack-and-the-heap.md)
|
||||
* [Debug and Display](debug-and-display.md)
|
||||
* [Testing](testing.md)
|
||||
* [Conditional Compilation](conditional-compilation.md)
|
||||
* [Documentation](documentation.md)
|
||||
|
@ -1,3 +0,0 @@
|
||||
% Debug and Display
|
||||
|
||||
Coming soon!
|
@ -80,7 +80,7 @@ fn clone(&self) -> Slice<T> { *self }
|
||||
/// `TraitObject` is guaranteed to match layouts, but it is not the
|
||||
/// type of trait objects (e.g. the fields are not directly accessible
|
||||
/// on a `&SomeTrait`) nor does it control that layout (changing the
|
||||
/// definition will not change the layout of a `&SometTrait`). It is
|
||||
/// definition will not change the layout of a `&SomeTrait`). It is
|
||||
/// only designed to be used by unsafe code that needs to manipulate
|
||||
/// the low-level details.
|
||||
///
|
||||
|
@ -75,11 +75,13 @@
|
||||
into a variable called `op_string` while simultaneously requiring the inner
|
||||
String to be moved into a variable called `s`.
|
||||
|
||||
```
|
||||
let x = Some("s".to_string());
|
||||
match x {
|
||||
op_string @ Some(s) => ...
|
||||
None => ...
|
||||
}
|
||||
```
|
||||
|
||||
See also Error 303.
|
||||
"##,
|
||||
@ -90,10 +92,12 @@
|
||||
referenced in the pattern guard code. Doing so however would prevent the name
|
||||
from being available in the body of the match arm. Consider the following:
|
||||
|
||||
```
|
||||
match Some("hi".to_string()) {
|
||||
Some(s) if s.len() == 0 => // use s.
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
The variable `s` has type String, and its use in the guard is as a variable of
|
||||
type String. The guard code effectively executes in a separate scope to the body
|
||||
@ -102,11 +106,13 @@
|
||||
innocuous, the problem is most clear when considering functions that take their
|
||||
argument by value.
|
||||
|
||||
```
|
||||
match Some("hi".to_string()) {
|
||||
Some(s) if { drop(s); false } => (),
|
||||
Some(s) => // use s.
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
The value would be dropped in the guard then become unavailable not only in the
|
||||
body of that arm but also in all subsequent arms! The solution is to bind by
|
||||
@ -219,8 +225,10 @@ fn main() {
|
||||
You can build a free-standing crate by adding `#![no_std]` to the crate
|
||||
attributes:
|
||||
|
||||
```
|
||||
#![feature(no_std)]
|
||||
#![no_std]
|
||||
```
|
||||
|
||||
See also https://doc.rust-lang.org/book/no-stdlib.html
|
||||
"##,
|
||||
@ -236,11 +244,13 @@ fn main() {
|
||||
|
||||
If you want to match against a `static`, consider using a guard instead:
|
||||
|
||||
```
|
||||
static FORTY_TWO: i32 = 42;
|
||||
match Some(42) {
|
||||
Some(x) if x == FORTY_TWO => ...
|
||||
...
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0161: r##"
|
||||
@ -256,6 +266,7 @@ fn main() {
|
||||
match was succesful. If the match is irrefutable (when it cannot fail to match),
|
||||
use a regular `let`-binding instead. For instance:
|
||||
|
||||
```
|
||||
struct Irrefutable(i32);
|
||||
let irr = Irrefutable(0);
|
||||
|
||||
@ -268,6 +279,7 @@ fn main() {
|
||||
// Try this instead:
|
||||
let Irrefutable(x) = irr;
|
||||
foo(x);
|
||||
```
|
||||
"##,
|
||||
|
||||
E0165: r##"
|
||||
@ -275,6 +287,7 @@ fn main() {
|
||||
match was succesful. If the match is irrefutable (when it cannot fail to match),
|
||||
use a regular `let`-binding inside a `loop` instead. For instance:
|
||||
|
||||
```
|
||||
struct Irrefutable(i32);
|
||||
let irr = Irrefutable(0);
|
||||
|
||||
@ -288,22 +301,27 @@ fn main() {
|
||||
let Irrefutable(x) = irr;
|
||||
...
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0170: r##"
|
||||
Enum variants are qualified by default. For example, given this type:
|
||||
|
||||
```
|
||||
enum Method {
|
||||
GET,
|
||||
POST
|
||||
}
|
||||
```
|
||||
|
||||
you would match it using:
|
||||
|
||||
```
|
||||
match m {
|
||||
Method::GET => ...
|
||||
Method::POST => ...
|
||||
}
|
||||
```
|
||||
|
||||
If you don't qualify the names, the code will bind new variables named "GET" and
|
||||
"POST" instead. This behavior is likely not what you want, so rustc warns when
|
||||
@ -312,8 +330,10 @@ enum Method {
|
||||
Qualified names are good practice, and most code works well with them. But if
|
||||
you prefer them unqualified, you can import the variants into scope:
|
||||
|
||||
```
|
||||
use Method::*;
|
||||
enum Method { GET, POST }
|
||||
```
|
||||
"##,
|
||||
|
||||
E0267: r##"
|
||||
@ -333,7 +353,9 @@ enum Method { GET, POST }
|
||||
This error indicates that the given recursion limit could not be parsed. Ensure
|
||||
that the value provided is a positive integer between quotes, like so:
|
||||
|
||||
```
|
||||
#![recursion_limit="1000"]
|
||||
```
|
||||
"##,
|
||||
|
||||
E0297: r##"
|
||||
@ -342,6 +364,7 @@ enum Method { GET, POST }
|
||||
loop variable, consider using a `match` or `if let` inside the loop body. For
|
||||
instance:
|
||||
|
||||
```
|
||||
// This fails because `None` is not covered.
|
||||
for Some(x) in xs {
|
||||
...
|
||||
@ -361,6 +384,7 @@ enum Method { GET, POST }
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0301: r##"
|
||||
@ -370,11 +394,13 @@ enum Method { GET, POST }
|
||||
exhaustive. For instance, the following would not match any arm if mutable
|
||||
borrows were allowed:
|
||||
|
||||
```
|
||||
match Some(()) {
|
||||
None => { },
|
||||
option if option.take().is_none() => { /* impossible, option is `Some` */ },
|
||||
Some(_) => { } // When the previous match failed, the option became `None`.
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0302: r##"
|
||||
@ -384,11 +410,13 @@ enum Method { GET, POST }
|
||||
exhaustive. For instance, the following would not match any arm if assignments
|
||||
were allowed:
|
||||
|
||||
```
|
||||
match Some(()) {
|
||||
None => { },
|
||||
option if { option = None; false } { },
|
||||
Some(_) => { } // When the previous match failed, the option became `None`.
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0303: r##"
|
||||
@ -396,9 +424,10 @@ enum Method { GET, POST }
|
||||
Updates to the borrow checker in a future version of Rust may remove this
|
||||
restriction, but for now patterns must be rewritten without sub-bindings.
|
||||
|
||||
// Before.
|
||||
match Some("hi".to_string()) {
|
||||
ref op_string_ref @ Some(ref s) => ...
|
||||
```
|
||||
// Code like this...
|
||||
match Some(5) {
|
||||
ref op_num @ Some(num) => ...
|
||||
None => ...
|
||||
}
|
||||
|
||||
@ -410,6 +439,7 @@ enum Method { GET, POST }
|
||||
}
|
||||
None => ...
|
||||
}
|
||||
```
|
||||
|
||||
The `op_string_ref` binding has type &Option<&String> in both cases.
|
||||
|
||||
|
@ -828,6 +828,9 @@
|
||||
$(document).on("click", ".collapse-toggle", function() {
|
||||
var toggle = $(this);
|
||||
var relatedDoc = toggle.parent().next();
|
||||
if (relatedDoc.is(".stability")) {
|
||||
relatedDoc = relatedDoc.next();
|
||||
}
|
||||
if (relatedDoc.is(".docblock")) {
|
||||
if (relatedDoc.is(":visible")) {
|
||||
relatedDoc.slideUp({duration:'fast', easing:'linear'});
|
||||
@ -848,9 +851,10 @@
|
||||
.html("[<span class='inner'>-</span>]");
|
||||
|
||||
$(".method").each(function() {
|
||||
if ($(this).next().is(".docblock")) {
|
||||
$(this).children().first().after(toggle.clone());
|
||||
}
|
||||
if ($(this).next().is(".docblock") ||
|
||||
($(this).next().is(".stability") && $(this).next().next().is(".docblock"))) {
|
||||
$(this).children().first().after(toggle.clone());
|
||||
}
|
||||
});
|
||||
|
||||
var mainToggle =
|
||||
|
@ -40,14 +40,6 @@ fn drop(&mut self) {
|
||||
}
|
||||
|
||||
impl DynamicLibrary {
|
||||
// FIXME (#12938): Until DST lands, we cannot decompose &str into
|
||||
// & and str, so we cannot usefully take ToCStr arguments by
|
||||
// reference (without forcing an additional & around &str). So we
|
||||
// are instead temporarily adding an instance for &Path, so that
|
||||
// we can take ToCStr as owned. When DST lands, the &Path instance
|
||||
// should be removed, and arguments bound by ToCStr should be
|
||||
// passed by reference. (Here: in the `open` method.)
|
||||
|
||||
/// Lazily open a dynamic library. When passed None it gives a
|
||||
/// handle to the calling process
|
||||
pub fn open(filename: Option<&Path>) -> Result<DynamicLibrary, String> {
|
||||
|
@ -95,6 +95,8 @@ fn flush(&mut self) -> io::Result<()> { Ok(()) }
|
||||
///
|
||||
/// This handle implements the `Read` trait, but beware that concurrent reads
|
||||
/// of `Stdin` must be executed with care.
|
||||
///
|
||||
/// Created by the function `io::stdin()`.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Stdin {
|
||||
inner: Arc<Mutex<BufReader<StdinRaw>>>,
|
||||
@ -206,6 +208,8 @@ fn consume(&mut self, n: usize) { self.inner.consume(n) }
|
||||
/// Each handle shares a global buffer of data to be written to the standard
|
||||
/// output stream. Access is also synchronized via a lock and explicit control
|
||||
/// over locking is available via the `lock` method.
|
||||
///
|
||||
/// Created by the function `io::stdout()`.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Stdout {
|
||||
// FIXME: this should be LineWriter or BufWriter depending on the state of
|
||||
|
Loading…
Reference in New Issue
Block a user