]> git.lizzy.rs Git - rust.git/blob - src/doc/reference.md
Update and organize the Keywords table
[rust.git] / src / doc / reference.md
1 % The Rust Reference
2
3 # Introduction
4
5 This document is the primary reference for the Rust programming language. It
6 provides three kinds of material:
7
8   - Chapters that informally describe each language construct and their use.
9   - Chapters that informally describe the memory model, concurrency model,
10     runtime services, linkage model and debugging facilities.
11   - Appendix chapters providing rationale and references to languages that
12     influenced the design.
13
14 This document does not serve as an introduction to the language. Background
15 familiarity with the language is assumed. A separate [book] is available to
16 help acquire such background familiarity.
17
18 This document also does not serve as a reference to the [standard] library
19 included in the language distribution. Those libraries are documented
20 separately by extracting documentation attributes from their source code. Many
21 of the features that one might expect to be language features are library
22 features in Rust, so what you're looking for may be there, not here.
23
24 You may also be interested in the [grammar].
25
26 [book]: book/index.html
27 [standard]: std/index.html
28 [grammar]: grammar.html
29
30 # Notation
31
32 Rust's grammar is defined over Unicode codepoints, each conventionally denoted
33 `U+XXXX`, for 4 or more hexadecimal digits `X`. _Most_ of Rust's grammar is
34 confined to the ASCII range of Unicode, and is described in this document by a
35 dialect of Extended Backus-Naur Form (EBNF), specifically a dialect of EBNF
36 supported by common automated LL(k) parsing tools such as `llgen`, rather than
37 the dialect given in ISO 14977. The dialect can be defined self-referentially
38 as follows:
39
40 ```{.ebnf .notation}
41 grammar : rule + ;
42 rule    : nonterminal ':' productionrule ';' ;
43 productionrule : production [ '|' production ] * ;
44 production : term * ;
45 term : element repeats ;
46 element : LITERAL | IDENTIFIER | '[' productionrule ']' ;
47 repeats : [ '*' | '+' ] NUMBER ? | NUMBER ? | '?' ;
48 ```
49
50 Where:
51
52 - Whitespace in the grammar is ignored.
53 - Square brackets are used to group rules.
54 - `LITERAL` is a single printable ASCII character, or an escaped hexadecimal
55   ASCII code of the form `\xQQ`, in single quotes, denoting the corresponding
56   Unicode codepoint `U+00QQ`.
57 - `IDENTIFIER` is a nonempty string of ASCII letters and underscores.
58 - The `repeat` forms apply to the adjacent `element`, and are as follows:
59   - `?` means zero or one repetition
60   - `*` means zero or more repetitions
61   - `+` means one or more repetitions
62   - NUMBER trailing a repeat symbol gives a maximum repetition count
63   - NUMBER on its own gives an exact repetition count
64
65 This EBNF dialect should hopefully be familiar to many readers.
66
67 ## Unicode productions
68
69 A few productions in Rust's grammar permit Unicode codepoints outside the ASCII
70 range. We define these productions in terms of character properties specified
71 in the Unicode standard, rather than in terms of ASCII-range codepoints. The
72 section [Special Unicode Productions](#special-unicode-productions) lists these
73 productions.
74
75 ## String table productions
76
77 Some rules in the grammar — notably [unary
78 operators](#unary-operator-expressions), [binary
79 operators](#binary-operator-expressions), and [keywords](#keywords) — are
80 given in a simplified form: as a listing of a table of unquoted, printable
81 whitespace-separated strings. These cases form a subset of the rules regarding
82 the [token](#tokens) rule, and are assumed to be the result of a
83 lexical-analysis phase feeding the parser, driven by a DFA, operating over the
84 disjunction of all such string table entries.
85
86 When such a string enclosed in double-quotes (`"`) occurs inside the grammar,
87 it is an implicit reference to a single member of such a string table
88 production. See [tokens](#tokens) for more information.
89
90 # Lexical structure
91
92 ## Input format
93
94 Rust input is interpreted as a sequence of Unicode codepoints encoded in UTF-8.
95 Most Rust grammar rules are defined in terms of printable ASCII-range
96 codepoints, but a small number are defined in terms of Unicode properties or
97 explicit codepoint lists. [^inputformat]
98
99 [^inputformat]: Substitute definitions for the special Unicode productions are
100   provided to the grammar verifier, restricted to ASCII range, when verifying the
101   grammar in this document.
102
103 ## Special Unicode Productions
104
105 The following productions in the Rust grammar are defined in terms of Unicode
106 properties: `ident`, `non_null`, `non_star`, `non_eol`, `non_slash_or_star`,
107 `non_single_quote` and `non_double_quote`.
108
109 ### Identifiers
110
111 The `ident` production is any nonempty Unicode string of the following form:
112
113 - The first character has property `XID_start`
114 - The remaining characters have property `XID_continue`
115
116 that does _not_ occur in the set of [keywords](#keywords).
117
118 > **Note**: `XID_start` and `XID_continue` as character properties cover the
119 > character ranges used to form the more familiar C and Java language-family
120 > identifiers.
121
122 ### Delimiter-restricted productions
123
124 Some productions are defined by exclusion of particular Unicode characters:
125
126 - `non_null` is any single Unicode character aside from `U+0000` (null)
127 - `non_eol` is `non_null` restricted to exclude `U+000A` (`'\n'`)
128 - `non_star` is `non_null` restricted to exclude `U+002A` (`*`)
129 - `non_slash_or_star` is `non_null` restricted to exclude `U+002F` (`/`) and `U+002A` (`*`)
130 - `non_single_quote` is `non_null` restricted to exclude `U+0027`  (`'`)
131 - `non_double_quote` is `non_null` restricted to exclude `U+0022` (`"`)
132
133 ## Comments
134
135 ```{.ebnf .gram}
136 comment : block_comment | line_comment ;
137 block_comment : "/*" block_comment_body * "*/" ;
138 block_comment_body : [block_comment | character] * ;
139 line_comment : "//" non_eol * ;
140 ```
141
142 Comments in Rust code follow the general C++ style of line and block-comment
143 forms. Nested block comments are supported.
144
145 Line comments beginning with exactly _three_ slashes (`///`), and block
146 comments beginning with exactly one repeated asterisk in the block-open
147 sequence (`/**`), are interpreted as a special syntax for `doc`
148 [attributes](#attributes). That is, they are equivalent to writing
149 `#[doc="..."]` around the body of the comment (this includes the comment
150 characters themselves, ie `/// Foo` turns into `#[doc="/// Foo"]`).
151
152 `//!` comments apply to the parent of the comment, rather than the item that
153 follows. `//!` comments are usually used to display information on the crate
154 index page.
155
156 Non-doc comments are interpreted as a form of whitespace.
157
158 ## Whitespace
159
160 ```{.ebnf .gram}
161 whitespace_char : '\x20' | '\x09' | '\x0a' | '\x0d' ;
162 whitespace : [ whitespace_char | comment ] + ;
163 ```
164
165 The `whitespace_char` production is any nonempty Unicode string consisting of
166 any of the following Unicode characters: `U+0020` (space, `' '`), `U+0009`
167 (tab, `'\t'`), `U+000A` (LF, `'\n'`), `U+000D` (CR, `'\r'`).
168
169 Rust is a "free-form" language, meaning that all forms of whitespace serve only
170 to separate _tokens_ in the grammar, and have no semantic significance.
171
172 A Rust program has identical meaning if each whitespace element is replaced
173 with any other legal whitespace element, such as a single space character.
174
175 ## Tokens
176
177 ```{.ebnf .gram}
178 simple_token : keyword | unop | binop ;
179 token : simple_token | ident | literal | symbol | whitespace token ;
180 ```
181
182 Tokens are primitive productions in the grammar defined by regular
183 (non-recursive) languages. "Simple" tokens are given in [string table
184 production](#string-table-productions) form, and occur in the rest of the
185 grammar as double-quoted strings. Other tokens have exact rules given.
186
187 ### Keywords
188
189 <p id="keyword-table-marker"></p>
190
191 |          |          |          |          |         |
192 |----------|----------|----------|----------|---------|
193 | abstract | alignof  | as       | become   | box     |
194 | break    | const    | continue | crate    | do      |
195 | else     | enum     | extern   | false    | final   |
196 | fn       | for      | if       | impl     | in      |
197 | let      | loop     | macro    | match    | mod     |
198 | move     | mut      | offsetof | override | priv    |
199 | proc     | pub      | pure     | ref      | return  |
200 | Self     | self     | sizeof   | static   | struct  |
201 | super    | trait    | true     | type     | typeof  |
202 | unsafe   | unsized  | use      | virtual  | where   |
203 | while    | yield    |          |          |         |
204
205
206 Each of these keywords has special meaning in its grammar, and all of them are
207 excluded from the `ident` rule.
208
209 Note that some of these keywords are reserved, and do not currently do
210 anything.
211
212 ### Literals
213
214 A literal is an expression consisting of a single token, rather than a sequence
215 of tokens, that immediately and directly denotes the value it evaluates to,
216 rather than referring to it by name or some other evaluation rule. A literal is
217 a form of constant expression, so is evaluated (primarily) at compile time.
218
219 ```{.ebnf .gram}
220 lit_suffix : ident;
221 literal : [ string_lit | char_lit | byte_string_lit | byte_lit | num_lit ] lit_suffix ?;
222 ```
223
224 The optional suffix is only used for certain numeric literals, but is
225 reserved for future extension, that is, the above gives the lexical
226 grammar, but a Rust parser will reject everything but the 12 special
227 cases mentioned in [Number literals](#number-literals) below.
228
229 #### Examples
230
231 ##### Characters and strings
232
233 |                                              | Example         | `#` sets   | Characters  | Escapes             |
234 |----------------------------------------------|-----------------|------------|-------------|---------------------|
235 | [Character](#character-literals)             | `'H'`           | `N/A`      | All Unicode | `\'` & [Byte](#byte-escapes) & [Unicode](#unicode-escapes) |
236 | [String](#string-literals)                   | `"hello"`       | `N/A`      | All Unicode | `\"` & [Byte](#byte-escapes) & [Unicode](#unicode-escapes) |
237 | [Raw](#raw-string-literals)                  | `r#"hello"#`    | `0...`     | All Unicode | `N/A`                                                      |
238 | [Byte](#byte-literals)                       | `b'H'`          | `N/A`      | All ASCII   | `\'` & [Byte](#byte-escapes)                               |
239 | [Byte string](#byte-string-literals)         | `b"hello"`      | `N/A`      | All ASCII   | `\"` & [Byte](#byte-escapes)                               |
240 | [Raw byte string](#raw-byte-string-literals) | `br#"hello"#`   | `0...`     | All ASCII   | `N/A`                                                      |
241
242 ##### Byte escapes
243
244 |   | Name |
245 |---|------|
246 | `\x7F` | 8-bit character code (exactly 2 digits) |
247 | `\n` | Newline |
248 | `\r` | Carriage return |
249 | `\t` | Tab |
250 | `\\` | Backslash |
251
252 ##### Unicode escapes
253 |   | Name |
254 |---|------|
255 | `\u{7FFF}` | 24-bit Unicode character code (up to 6 digits) |
256
257 ##### Numbers
258
259 | [Number literals](#number-literals)`*` | Example | Exponentiation | Suffixes |
260 |----------------------------------------|---------|----------------|----------|
261 | Decimal integer | `98_222` | `N/A` | Integer suffixes |
262 | Hex integer | `0xff` | `N/A` | Integer suffixes |
263 | Octal integer | `0o77` | `N/A` | Integer suffixes |
264 | Binary integer | `0b1111_0000` | `N/A` | Integer suffixes |
265 | Floating-point | `123.0E+77` | `Optional` | Floating-point suffixes |
266
267 `*` All number literals allow `_` as a visual separator: `1_234.0E+18f64`
268
269 ##### Suffixes
270 | Integer | Floating-point |
271 |---------|----------------|
272 | `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`, `is` (`isize`), `us` (`usize`) | `f32`, `f64` |
273
274 #### Character and string literals
275
276 ```{.ebnf .gram}
277 char_lit : '\x27' char_body '\x27' ;
278 string_lit : '"' string_body * '"' | 'r' raw_string ;
279
280 char_body : non_single_quote
281           | '\x5c' [ '\x27' | common_escape | unicode_escape ] ;
282
283 string_body : non_double_quote
284             | '\x5c' [ '\x22' | common_escape | unicode_escape ] ;
285 raw_string : '"' raw_string_body '"' | '#' raw_string '#' ;
286
287 common_escape : '\x5c'
288               | 'n' | 'r' | 't' | '0'
289               | 'x' hex_digit 2
290
291 unicode_escape : 'u' '{' hex_digit+ 6 '}';
292
293 hex_digit : 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
294           | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'
295           | dec_digit ;
296 oct_digit : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' ;
297 dec_digit : '0' | nonzero_dec ;
298 nonzero_dec: '1' | '2' | '3' | '4'
299            | '5' | '6' | '7' | '8' | '9' ;
300 ```
301
302 ##### Character literals
303
304 A _character literal_ is a single Unicode character enclosed within two
305 `U+0027` (single-quote) characters, with the exception of `U+0027` itself,
306 which must be _escaped_ by a preceding `U+005C` character (`\`).
307
308 ##### String literals
309
310 A _string literal_ is a sequence of any Unicode characters enclosed within two
311 `U+0022` (double-quote) characters, with the exception of `U+0022` itself,
312 which must be _escaped_ by a preceding `U+005C` character (`\`), or a _raw
313 string literal_.
314
315 A multi-line string literal may be defined by terminating each line with a
316 `U+005C` character (`\`) immediately before the newline. This causes the
317 `U+005C` character, the newline, and all whitespace at the beginning of the
318 next line to be ignored.
319
320 ```rust
321 let a = "foobar";
322 let b = "foo\
323          bar";
324
325 assert_eq!(a,b);
326 ```
327
328 ##### Character escapes
329
330 Some additional _escapes_ are available in either character or non-raw string
331 literals. An escape starts with a `U+005C` (`\`) and continues with one of the
332 following forms:
333
334 * An _8-bit codepoint escape_ escape starts with `U+0078` (`x`) and is
335   followed by exactly two _hex digits_. It denotes the Unicode codepoint
336   equal to the provided hex value.
337 * A _24-bit codepoint escape_ starts with `U+0075` (`u`) and is followed
338   by up to six _hex digits_ surrounded by braces `U+007B` (`{`) and `U+007D`
339   (`}`). It denotes the Unicode codepoint equal to the provided hex value.
340 * A _whitespace escape_ is one of the characters `U+006E` (`n`), `U+0072`
341   (`r`), or `U+0074` (`t`), denoting the unicode values `U+000A` (LF),
342   `U+000D` (CR) or `U+0009` (HT) respectively.
343 * The _backslash escape_ is the character `U+005C` (`\`) which must be
344   escaped in order to denote *itself*.
345
346 ##### Raw string literals
347
348 Raw string literals do not process any escapes. They start with the character
349 `U+0072` (`r`), followed by zero or more of the character `U+0023` (`#`) and a
350 `U+0022` (double-quote) character. The _raw string body_ is not defined in the
351 EBNF grammar above: it can contain any sequence of Unicode characters and is
352 terminated only by another `U+0022` (double-quote) character, followed by the
353 same number of `U+0023` (`#`) characters that preceded the opening `U+0022`
354 (double-quote) character.
355
356 All Unicode characters contained in the raw string body represent themselves,
357 the characters `U+0022` (double-quote) (except when followed by at least as
358 many `U+0023` (`#`) characters as were used to start the raw string literal) or
359 `U+005C` (`\`) do not have any special meaning.
360
361 Examples for string literals:
362
363 ```
364 "foo"; r"foo";                     // foo
365 "\"foo\""; r#""foo""#;             // "foo"
366
367 "foo #\"# bar";
368 r##"foo #"# bar"##;                // foo #"# bar
369
370 "\x52"; "R"; r"R";                 // R
371 "\\x52"; r"\x52";                  // \x52
372 ```
373
374 #### Byte and byte string literals
375
376 ```{.ebnf .gram}
377 byte_lit : "b\x27" byte_body '\x27' ;
378 byte_string_lit : "b\x22" string_body * '\x22' | "br" raw_byte_string ;
379
380 byte_body : ascii_non_single_quote
381           | '\x5c' [ '\x27' | common_escape ] ;
382
383 byte_string_body : ascii_non_double_quote
384             | '\x5c' [ '\x22' | common_escape ] ;
385 raw_byte_string : '"' raw_byte_string_body '"' | '#' raw_byte_string '#' ;
386
387 ```
388
389 ##### Byte literals
390
391 A _byte literal_ is a single ASCII character (in the `U+0000` to `U+007F`
392 range) enclosed within two `U+0027` (single-quote) characters, with the
393 exception of `U+0027` itself, which must be _escaped_ by a preceding U+005C
394 character (`\`), or a single _escape_. It is equivalent to a `u8` unsigned
395 8-bit integer _number literal_.
396
397 ##### Byte string literals
398
399 A non-raw _byte string literal_ is a sequence of ASCII characters and _escapes_,
400 preceded by the characters `U+0062` (`b`) and `U+0022` (double-quote), and
401 followed by the character `U+0022`. If the character `U+0022` is present within
402 the literal, it must be _escaped_ by a preceding `U+005C` (`\`) character.
403 Alternatively, a byte string literal can be a _raw byte string literal_, defined
404 below. A byte string literal is equivalent to a `&'static [u8]` borrowed array
405 of unsigned 8-bit integers.
406
407 Some additional _escapes_ are available in either byte or non-raw byte string
408 literals. An escape starts with a `U+005C` (`\`) and continues with one of the
409 following forms:
410
411 * An _byte escape_ escape starts with `U+0078` (`x`) and is
412   followed by exactly two _hex digits_. It denotes the byte
413   equal to the provided hex value.
414 * A _whitespace escape_ is one of the characters `U+006E` (`n`), `U+0072`
415   (`r`), or `U+0074` (`t`), denoting the bytes values `0x0A` (ASCII LF),
416   `0x0D` (ASCII CR) or `0x09` (ASCII HT) respectively.
417 * The _backslash escape_ is the character `U+005C` (`\`) which must be
418   escaped in order to denote its ASCII encoding `0x5C`.
419
420 ##### Raw byte string literals
421
422 Raw byte string literals do not process any escapes. They start with the
423 character `U+0062` (`b`), followed by `U+0072` (`r`), followed by zero or more
424 of the character `U+0023` (`#`), and a `U+0022` (double-quote) character. The
425 _raw string body_ is not defined in the EBNF grammar above: it can contain any
426 sequence of ASCII characters and is terminated only by another `U+0022`
427 (double-quote) character, followed by the same number of `U+0023` (`#`)
428 characters that preceded the opening `U+0022` (double-quote) character. A raw
429 byte string literal can not contain any non-ASCII byte.
430
431 All characters contained in the raw string body represent their ASCII encoding,
432 the characters `U+0022` (double-quote) (except when followed by at least as
433 many `U+0023` (`#`) characters as were used to start the raw string literal) or
434 `U+005C` (`\`) do not have any special meaning.
435
436 Examples for byte string literals:
437
438 ```
439 b"foo"; br"foo";                     // foo
440 b"\"foo\""; br#""foo""#;             // "foo"
441
442 b"foo #\"# bar";
443 br##"foo #"# bar"##;                 // foo #"# bar
444
445 b"\x52"; b"R"; br"R";                // R
446 b"\\x52"; br"\x52";                  // \x52
447 ```
448
449 #### Number literals
450
451 ```{.ebnf .gram}
452 num_lit : nonzero_dec [ dec_digit | '_' ] * float_suffix ?
453         | '0' [       [ dec_digit | '_' ] * float_suffix ?
454               | 'b'   [ '1' | '0' | '_' ] +
455               | 'o'   [ oct_digit | '_' ] +
456               | 'x'   [ hex_digit | '_' ] +  ] ;
457
458 float_suffix : [ exponent | '.' dec_lit exponent ? ] ? ;
459
460 exponent : ['E' | 'e'] ['-' | '+' ] ? dec_lit ;
461 dec_lit : [ dec_digit | '_' ] + ;
462 ```
463
464 A _number literal_ is either an _integer literal_ or a _floating-point
465 literal_. The grammar for recognizing the two kinds of literals is mixed.
466
467 ##### Integer literals
468
469 An _integer literal_ has one of four forms:
470
471 * A _decimal literal_ starts with a *decimal digit* and continues with any
472   mixture of *decimal digits* and _underscores_.
473 * A _hex literal_ starts with the character sequence `U+0030` `U+0078`
474   (`0x`) and continues as any mixture of hex digits and underscores.
475 * An _octal literal_ starts with the character sequence `U+0030` `U+006F`
476   (`0o`) and continues as any mixture of octal digits and underscores.
477 * A _binary literal_ starts with the character sequence `U+0030` `U+0062`
478   (`0b`) and continues as any mixture of binary digits and underscores.
479
480 Like any literal, an integer literal may be followed (immediately,
481 without any spaces) by an _integer suffix_, which forcibly sets the
482 type of the literal. The integer suffix must be the name of one of the
483 integral types: `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`,
484 `isize`, or `usize`.
485
486 The type of an _unsuffixed_ integer literal is determined by type inference.
487 If an integer type can be _uniquely_ determined from the surrounding program
488 context, the unsuffixed integer literal has that type. If the program context
489 underconstrains the type, it defaults to the signed 32-bit integer `i32`; if
490 the program context overconstrains the type, it is considered a static type
491 error.
492
493 Examples of integer literals of various forms:
494
495 ```
496 123i32;                            // type i32
497 123u32;                            // type u32
498 123_u32;                           // type u32
499 0xff_u8;                           // type u8
500 0o70_i16;                          // type i16
501 0b1111_1111_1001_0000_i32;         // type i32
502 0usize;                            // type usize
503 ```
504
505 ##### Floating-point literals
506
507 A _floating-point literal_ has one of two forms:
508
509 * A _decimal literal_ followed by a period character `U+002E` (`.`). This is
510   optionally followed by another decimal literal, with an optional _exponent_.
511 * A single _decimal literal_ followed by an _exponent_.
512
513 By default, a floating-point literal has a generic type, and, like integer
514 literals, the type must be uniquely determined from the context. There are two valid
515 _floating-point suffixes_, `f32` and `f64` (the 32-bit and 64-bit floating point
516 types), which explicitly determine the type of the literal.
517
518 Examples of floating-point literals of various forms:
519
520 ```
521 123.0f64;        // type f64
522 0.1f64;          // type f64
523 0.1f32;          // type f32
524 12E+99_f64;      // type f64
525 let x: f64 = 2.; // type f64
526 ```
527
528 This last example is different because it is not possible to use the suffix
529 syntax with a floating point literal ending in a period. `2.f64` would attempt
530 to call a method named `f64` on `2`.
531
532 The representation semantics of floating-point numbers are described in
533 ["Machine Types"](#machine-types).
534
535 #### Boolean literals
536
537 The two values of the boolean type are written `true` and `false`.
538
539 ### Symbols
540
541 ```{.ebnf .gram}
542 symbol : "::" | "->"
543        | '#' | '[' | ']' | '(' | ')' | '{' | '}'
544        | ',' | ';' ;
545 ```
546
547 Symbols are a general class of printable [token](#tokens) that play structural
548 roles in a variety of grammar productions. They are catalogued here for
549 completeness as the set of remaining miscellaneous printable tokens that do not
550 otherwise appear as [unary operators](#unary-operator-expressions), [binary
551 operators](#binary-operator-expressions), or [keywords](#keywords).
552
553
554 ## Paths
555
556 ```{.ebnf .gram}
557 expr_path : [ "::" ] ident [ "::" expr_path_tail ] + ;
558 expr_path_tail : '<' type_expr [ ',' type_expr ] + '>'
559                | expr_path ;
560
561 type_path : ident [ type_path_tail ] + ;
562 type_path_tail : '<' type_expr [ ',' type_expr ] + '>'
563                | "::" type_path ;
564 ```
565
566 A _path_ is a sequence of one or more path components _logically_ separated by
567 a namespace qualifier (`::`). If a path consists of only one component, it may
568 refer to either an [item](#items) or a [variable](#variables) in a local control
569 scope. If a path has multiple components, it refers to an item.
570
571 Every item has a _canonical path_ within its crate, but the path naming an item
572 is only meaningful within a given crate. There is no global namespace across
573 crates; an item's canonical path merely identifies it within the crate.
574
575 Two examples of simple paths consisting of only identifier components:
576
577 ```{.ignore}
578 x;
579 x::y::z;
580 ```
581
582 Path components are usually [identifiers](#identifiers), but the trailing
583 component of a path may be an angle-bracket-enclosed list of type arguments. In
584 [expression](#expressions) context, the type argument list is given after a
585 final (`::`) namespace qualifier in order to disambiguate it from a relational
586 expression involving the less-than symbol (`<`). In type expression context,
587 the final namespace qualifier is omitted.
588
589 Two examples of paths with type arguments:
590
591 ```
592 # struct HashMap<K, V>(K,V);
593 # fn f() {
594 # fn id<T>(t: T) -> T { t }
595 type T = HashMap<i32,String>; // Type arguments used in a type expression
596 let x  = id::<i32>(10);       // Type arguments used in a call expression
597 # }
598 ```
599
600 Paths can be denoted with various leading qualifiers to change the meaning of
601 how it is resolved:
602
603 * Paths starting with `::` are considered to be global paths where the
604   components of the path start being resolved from the crate root. Each
605   identifier in the path must resolve to an item.
606
607 ```rust
608 mod a {
609     pub fn foo() {}
610 }
611 mod b {
612     pub fn foo() {
613         ::a::foo(); // call a's foo function
614     }
615 }
616 # fn main() {}
617 ```
618
619 * Paths starting with the keyword `super` begin resolution relative to the
620   parent module. Each further identifier must resolve to an item.
621
622 ```rust
623 mod a {
624     pub fn foo() {}
625 }
626 mod b {
627     pub fn foo() {
628         super::a::foo(); // call a's foo function
629     }
630 }
631 # fn main() {}
632 ```
633
634 * Paths starting with the keyword `self` begin resolution relative to the
635   current module. Each further identifier must resolve to an item.
636
637 ```rust
638 fn foo() {}
639 fn bar() {
640     self::foo();
641 }
642 # fn main() {}
643 ```
644
645 # Syntax extensions
646
647 A number of minor features of Rust are not central enough to have their own
648 syntax, and yet are not implementable as functions. Instead, they are given
649 names, and invoked through a consistent syntax: `some_extension!(...)`.
650
651 Users of `rustc` can define new syntax extensions in two ways:
652
653 * [Compiler plugins][plugin] can include arbitrary
654   Rust code that manipulates syntax trees at compile time.
655
656 * [Macros](book/macros.html) define new syntax in a higher-level,
657   declarative way.
658
659 ## Macros
660
661 ```{.ebnf .gram}
662 expr_macro_rules : "macro_rules" '!' ident '(' macro_rule * ')' ;
663 macro_rule : '(' matcher * ')' "=>" '(' transcriber * ')' ';' ;
664 matcher : '(' matcher * ')' | '[' matcher * ']'
665         | '{' matcher * '}' | '$' ident ':' ident
666         | '$' '(' matcher * ')' sep_token? [ '*' | '+' ]
667         | non_special_token ;
668 transcriber : '(' transcriber * ')' | '[' transcriber * ']'
669             | '{' transcriber * '}' | '$' ident
670             | '$' '(' transcriber * ')' sep_token? [ '*' | '+' ]
671             | non_special_token ;
672 ```
673
674 `macro_rules` allows users to define syntax extension in a declarative way.  We
675 call such extensions "macros by example" or simply "macros" â€” to be distinguished
676 from the "procedural macros" defined in [compiler plugins][plugin].
677
678 Currently, macros can expand to expressions, statements, items, or patterns.
679
680 (A `sep_token` is any token other than `*` and `+`. A `non_special_token` is
681 any token other than a delimiter or `$`.)
682
683 The macro expander looks up macro invocations by name, and tries each macro
684 rule in turn. It transcribes the first successful match. Matching and
685 transcription are closely related to each other, and we will describe them
686 together.
687
688 ### Macro By Example
689
690 The macro expander matches and transcribes every token that does not begin with
691 a `$` literally, including delimiters. For parsing reasons, delimiters must be
692 balanced, but they are otherwise not special.
693
694 In the matcher, `$` _name_ `:` _designator_ matches the nonterminal in the Rust
695 syntax named by _designator_. Valid designators are `item`, `block`, `stmt`,
696 `pat`, `expr`, `ty` (type), `ident`, `path`, `tt` (either side of the `=>`
697 in macro rules). In the transcriber, the designator is already known, and so
698 only the name of a matched nonterminal comes after the dollar sign.
699
700 In both the matcher and transcriber, the Kleene star-like operator indicates
701 repetition. The Kleene star operator consists of `$` and parens, optionally
702 followed by a separator token, followed by `*` or `+`. `*` means zero or more
703 repetitions, `+` means at least one repetition. The parens are not matched or
704 transcribed. On the matcher side, a name is bound to _all_ of the names it
705 matches, in a structure that mimics the structure of the repetition encountered
706 on a successful match. The job of the transcriber is to sort that structure
707 out.
708
709 The rules for transcription of these repetitions are called "Macro By Example".
710 Essentially, one "layer" of repetition is discharged at a time, and all of them
711 must be discharged by the time a name is transcribed. Therefore, `( $( $i:ident
712 ),* ) => ( $i )` is an invalid macro, but `( $( $i:ident ),* ) => ( $( $i:ident
713 ),*  )` is acceptable (if trivial).
714
715 When Macro By Example encounters a repetition, it examines all of the `$`
716 _name_ s that occur in its body. At the "current layer", they all must repeat
717 the same number of times, so ` ( $( $i:ident ),* ; $( $j:ident ),* ) => ( $(
718 ($i,$j) ),* )` is valid if given the argument `(a,b,c ; d,e,f)`, but not
719 `(a,b,c ; d,e)`. The repetition walks through the choices at that layer in
720 lockstep, so the former input transcribes to `( (a,d), (b,e), (c,f) )`.
721
722 Nested repetitions are allowed.
723
724 ### Parsing limitations
725
726 The parser used by the macro system is reasonably powerful, but the parsing of
727 Rust syntax is restricted in two ways:
728
729 1. The parser will always parse as much as possible. If it attempts to match
730    `$i:expr [ , ]` against `8 [ , ]`, it will attempt to parse `i` as an array
731    index operation and fail. Adding a separator can solve this problem.
732 2. The parser must have eliminated all ambiguity by the time it reaches a `$`
733    _name_ `:` _designator_. This requirement most often affects name-designator
734    pairs when they occur at the beginning of, or immediately after, a `$(...)*`;
735    requiring a distinctive token in front can solve the problem.
736
737 # Crates and source files
738
739 Rust is a *compiled* language. Its semantics obey a *phase distinction* between
740 compile-time and run-time. Those semantic rules that have a *static
741 interpretation* govern the success or failure of compilation. Those semantics
742 that have a *dynamic interpretation* govern the behavior of the program at
743 run-time.
744
745 The compilation model centers on artifacts called _crates_. Each compilation
746 processes a single crate in source form, and if successful, produces a single
747 crate in binary form: either an executable or a library.[^cratesourcefile]
748
749 [^cratesourcefile]: A crate is somewhat analogous to an *assembly* in the
750     ECMA-335 CLI model, a *library* in the SML/NJ Compilation Manager, a *unit*
751     in the Owens and Flatt module system, or a *configuration* in Mesa.
752
753 A _crate_ is a unit of compilation and linking, as well as versioning,
754 distribution and runtime loading. A crate contains a _tree_ of nested
755 [module](#modules) scopes. The top level of this tree is a module that is
756 anonymous (from the point of view of paths within the module) and any item
757 within a crate has a canonical [module path](#paths) denoting its location
758 within the crate's module tree.
759
760 The Rust compiler is always invoked with a single source file as input, and
761 always produces a single output crate. The processing of that source file may
762 result in other source files being loaded as modules. Source files have the
763 extension `.rs`.
764
765 A Rust source file describes a module, the name and location of which &mdash;
766 in the module tree of the current crate &mdash; are defined from outside the
767 source file: either by an explicit `mod_item` in a referencing source file, or
768 by the name of the crate itself.
769
770 Each source file contains a sequence of zero or more `item` definitions, and
771 may optionally begin with any number of `attributes` that apply to the
772 containing module. Attributes on the anonymous crate module define important
773 metadata that influences the behavior of the compiler.
774
775 ```no_run
776 // Crate name
777 #![crate_name = "projx"]
778
779 // Specify the output type
780 #![crate_type = "lib"]
781
782 // Turn on a warning
783 #![warn(non_camel_case_types)]
784 ```
785
786 A crate that contains a `main` function can be compiled to an executable. If a
787 `main` function is present, its return type must be [`unit`](#primitive-types)
788 and it must take no arguments.
789
790 # Items and attributes
791
792 Crates contain [items](#items), each of which may have some number of
793 [attributes](#attributes) attached to it.
794
795 ## Items
796
797 ```{.ebnf .gram}
798 item : extern_crate_decl | use_decl | mod_item | fn_item | type_item
799      | struct_item | enum_item | static_item | trait_item | impl_item
800      | extern_block ;
801 ```
802
803 An _item_ is a component of a crate. Items are organized within a crate by a
804 nested set of [modules](#modules). Every crate has a single "outermost"
805 anonymous module; all further items within the crate have [paths](#paths)
806 within the module tree of the crate.
807
808 Items are entirely determined at compile-time, generally remain fixed during
809 execution, and may reside in read-only memory.
810
811 There are several kinds of item:
812
813 * [`extern crate` declarations](#extern-crate-declarations)
814 * [`use` declarations](#use-declarations)
815 * [modules](#modules)
816 * [functions](#functions)
817 * [type definitions](#type-definitions)
818 * [structures](#structures)
819 * [enumerations](#enumerations)
820 * [static items](#static-items)
821 * [traits](#traits)
822 * [implementations](#implementations)
823
824 Some items form an implicit scope for the declaration of sub-items. In other
825 words, within a function or module, declarations of items can (in many cases)
826 be mixed with the statements, control blocks, and similar artifacts that
827 otherwise compose the item body. The meaning of these scoped items is the same
828 as if the item was declared outside the scope &mdash; it is still a static item
829 &mdash; except that the item's *path name* within the module namespace is
830 qualified by the name of the enclosing item, or is private to the enclosing
831 item (in the case of functions). The grammar specifies the exact locations in
832 which sub-item declarations may appear.
833
834 ### Type Parameters
835
836 All items except modules may be *parameterized* by type. Type parameters are
837 given as a comma-separated list of identifiers enclosed in angle brackets
838 (`<...>`), after the name of the item and before its definition. The type
839 parameters of an item are considered "part of the name", not part of the type
840 of the item. A referencing [path](#paths) must (in principle) provide type
841 arguments as a list of comma-separated types enclosed within angle brackets, in
842 order to refer to the type-parameterized item. In practice, the type-inference
843 system can usually infer such argument types from context. There are no
844 general type-parametric types, only type-parametric items. That is, Rust has
845 no notion of type abstraction: there are no first-class "forall" types.
846
847 ### Modules
848
849 ```{.ebnf .gram}
850 mod_item : "mod" ident ( ';' | '{' mod '}' );
851 mod : item * ;
852 ```
853
854 A module is a container for zero or more [items](#items).
855
856 A _module item_ is a module, surrounded in braces, named, and prefixed with the
857 keyword `mod`. A module item introduces a new, named module into the tree of
858 modules making up a crate. Modules can nest arbitrarily.
859
860 An example of a module:
861
862 ```
863 mod math {
864     type Complex = (f64, f64);
865     fn sin(f: f64) -> f64 {
866         /* ... */
867 # panic!();
868     }
869     fn cos(f: f64) -> f64 {
870         /* ... */
871 # panic!();
872     }
873     fn tan(f: f64) -> f64 {
874         /* ... */
875 # panic!();
876     }
877 }
878 ```
879
880 Modules and types share the same namespace. Declaring a named type with
881 the same name as a module in scope is forbidden: that is, a type definition,
882 trait, struct, enumeration, or type parameter can't shadow the name of a module
883 in scope, or vice versa.
884
885 A module without a body is loaded from an external file, by default with the
886 same name as the module, plus the `.rs` extension. When a nested submodule is
887 loaded from an external file, it is loaded from a subdirectory path that
888 mirrors the module hierarchy.
889
890 ```{.ignore}
891 // Load the `vec` module from `vec.rs`
892 mod vec;
893
894 mod thread {
895     // Load the `local_data` module from `thread/local_data.rs`
896     mod local_data;
897 }
898 ```
899
900 The directories and files used for loading external file modules can be
901 influenced with the `path` attribute.
902
903 ```{.ignore}
904 #[path = "thread_files"]
905 mod thread {
906     // Load the `local_data` module from `thread_files/tls.rs`
907     #[path = "tls.rs"]
908     mod local_data;
909 }
910 ```
911
912 ##### Extern crate declarations
913
914 ```{.ebnf .gram}
915 extern_crate_decl : "extern" "crate" crate_name
916 crate_name: ident | ( string_lit "as" ident )
917 ```
918
919 An _`extern crate` declaration_ specifies a dependency on an external crate.
920 The external crate is then bound into the declaring scope as the `ident`
921 provided in the `extern_crate_decl`.
922
923 The external crate is resolved to a specific `soname` at compile time, and a
924 runtime linkage requirement to that `soname` is passed to the linker for
925 loading at runtime. The `soname` is resolved at compile time by scanning the
926 compiler's library path and matching the optional `crateid` provided as a
927 string literal against the `crateid` attributes that were declared on the
928 external crate when it was compiled. If no `crateid` is provided, a default
929 `name` attribute is assumed, equal to the `ident` given in the
930 `extern_crate_decl`.
931
932 Three examples of `extern crate` declarations:
933
934 ```{.ignore}
935 extern crate pcre;
936
937 extern crate std; // equivalent to: extern crate std as std;
938
939 extern crate std as ruststd; // linking to 'std' under another name
940 ```
941
942 ##### Use declarations
943
944 ```{.ebnf .gram}
945 use_decl : "pub" ? "use" [ path "as" ident
946                           | path_glob ] ;
947
948 path_glob : ident [ "::" [ path_glob
949                           | '*' ] ] ?
950           | '{' path_item [ ',' path_item ] * '}' ;
951
952 path_item : ident | "self" ;
953 ```
954
955 A _use declaration_ creates one or more local name bindings synonymous with
956 some other [path](#paths). Usually a `use` declaration is used to shorten the
957 path required to refer to a module item. These declarations may appear at the
958 top of [modules](#modules) and [blocks](#blocks).
959
960 > **Note**: Unlike in many languages,
961 > `use` declarations in Rust do *not* declare linkage dependency with external crates.
962 > Rather, [`extern crate` declarations](#extern-crate-declarations) declare linkage dependencies.
963
964 Use declarations support a number of convenient shortcuts:
965
966 * Rebinding the target name as a new local name, using the syntax `use p::q::r as x;`
967 * Simultaneously binding a list of paths differing only in their final element,
968   using the glob-like brace syntax `use a::b::{c,d,e,f};`
969 * Binding all paths matching a given prefix, using the asterisk wildcard syntax
970   `use a::b::*;`
971 * Simultaneously binding a list of paths differing only in their final element
972   and their immediate parent module, using the `self` keyword, such as
973   `use a::b::{self, c, d};`
974
975 An example of `use` declarations:
976
977 ```rust
978 use std::option::Option::{Some, None};
979 use std::collections::hash_map::{self, HashMap};
980
981 fn foo<T>(_: T){}
982 fn bar(map1: HashMap<String, usize>, map2: hash_map::HashMap<String, usize>){}
983
984 fn main() {
985     // Equivalent to 'foo(vec![std::option::Option::Some(1.0f64),
986     // std::option::Option::None]);'
987     foo(vec![Some(1.0f64), None]);
988
989     // Both `hash_map` and `HashMap` are in scope.
990     let map1 = HashMap::new();
991     let map2 = hash_map::HashMap::new();
992     bar(map1, map2);
993 }
994 ```
995
996 Like items, `use` declarations are private to the containing module, by
997 default. Also like items, a `use` declaration can be public, if qualified by
998 the `pub` keyword. Such a `use` declaration serves to _re-export_ a name. A
999 public `use` declaration can therefore _redirect_ some public name to a
1000 different target definition: even a definition with a private canonical path,
1001 inside a different module. If a sequence of such redirections form a cycle or
1002 cannot be resolved unambiguously, they represent a compile-time error.
1003
1004 An example of re-exporting:
1005
1006 ```
1007 # fn main() { }
1008 mod quux {
1009     pub use quux::foo::{bar, baz};
1010
1011     pub mod foo {
1012         pub fn bar() { }
1013         pub fn baz() { }
1014     }
1015 }
1016 ```
1017
1018 In this example, the module `quux` re-exports two public names defined in
1019 `foo`.
1020
1021 Also note that the paths contained in `use` items are relative to the crate
1022 root. So, in the previous example, the `use` refers to `quux::foo::{bar,
1023 baz}`, and not simply to `foo::{bar, baz}`. This also means that top-level
1024 module declarations should be at the crate root if direct usage of the declared
1025 modules within `use` items is desired. It is also possible to use `self` and
1026 `super` at the beginning of a `use` item to refer to the current and direct
1027 parent modules respectively. All rules regarding accessing declared modules in
1028 `use` declarations applies to both module declarations and `extern crate`
1029 declarations.
1030
1031 An example of what will and will not work for `use` items:
1032
1033 ```
1034 # #![allow(unused_imports)]
1035 use foo::baz::foobaz;    // good: foo is at the root of the crate
1036
1037 mod foo {
1038
1039     mod example {
1040         pub mod iter {}
1041     }
1042
1043     use foo::example::iter; // good: foo is at crate root
1044 //  use example::iter;      // bad:  core is not at the crate root
1045     use self::baz::foobaz;  // good: self refers to module 'foo'
1046     use foo::bar::foobar;   // good: foo is at crate root
1047
1048     pub mod bar {
1049         pub fn foobar() { }
1050     }
1051
1052     pub mod baz {
1053         use super::bar::foobar; // good: super refers to module 'foo'
1054         pub fn foobaz() { }
1055     }
1056 }
1057
1058 fn main() {}
1059 ```
1060
1061 ### Functions
1062
1063 A _function item_ defines a sequence of [statements](#statements) and an
1064 optional final [expression](#expressions), along with a name and a set of
1065 parameters. Functions are declared with the keyword `fn`. Functions declare a
1066 set of *input* [*variables*](#variables) as parameters, through which the caller
1067 passes arguments into the function, and the *output* [*type*](#types)
1068 of the value the function will return to its caller on completion.
1069
1070 A function may also be copied into a first-class *value*, in which case the
1071 value has the corresponding [*function type*](#function-types), and can be used
1072 otherwise exactly as a function item (with a minor additional cost of calling
1073 the function indirectly).
1074
1075 Every control path in a function logically ends with a `return` expression or a
1076 diverging expression. If the outermost block of a function has a
1077 value-producing expression in its final-expression position, that expression is
1078 interpreted as an implicit `return` expression applied to the final-expression.
1079
1080 An example of a function:
1081
1082 ```
1083 fn add(x: i32, y: i32) -> i32 {
1084     return x + y;
1085 }
1086 ```
1087
1088 As with `let` bindings, function arguments are irrefutable patterns, so any
1089 pattern that is valid in a let binding is also valid as an argument.
1090
1091 ```
1092 fn first((value, _): (i32, i32)) -> i32 { value }
1093 ```
1094
1095
1096 #### Generic functions
1097
1098 A _generic function_ allows one or more _parameterized types_ to appear in its
1099 signature. Each type parameter must be explicitly declared, in an
1100 angle-bracket-enclosed, comma-separated list following the function name.
1101
1102 ```{.ignore}
1103 fn iter<T>(seq: &[T], f: |T|) {
1104     for elt in seq.iter() { f(elt); }
1105 }
1106 fn map<T, U>(seq: &[T], f: |T| -> U) -> Vec<U> {
1107     let mut acc = vec![];
1108     for elt in seq.iter() { acc.push(f(elt)); }
1109     acc
1110 }
1111 ```
1112
1113 Inside the function signature and body, the name of the type parameter can be
1114 used as a type name.
1115
1116 When a generic function is referenced, its type is instantiated based on the
1117 context of the reference. For example, calling the `iter` function defined
1118 above on `[1, 2]` will instantiate type parameter `T` with `i32`, and require
1119 the closure parameter to have type `fn(i32)`.
1120
1121 The type parameters can also be explicitly supplied in a trailing
1122 [path](#paths) component after the function name. This might be necessary if
1123 there is not sufficient context to determine the type parameters. For example,
1124 `mem::size_of::<u32>() == 4`.
1125
1126 Since a parameter type is opaque to the generic function, the set of operations
1127 that can be performed on it is limited. Values of parameter type can only be
1128 moved, not copied.
1129
1130 ```
1131 fn id<T>(x: T) -> T { x }
1132 ```
1133
1134 Similarly, [trait](#traits) bounds can be specified for type parameters to
1135 allow methods with that trait to be called on values of that type.
1136
1137 #### Unsafety
1138
1139 Unsafe operations are those that potentially violate the memory-safety
1140 guarantees of Rust's static semantics.
1141
1142 The following language level features cannot be used in the safe subset of
1143 Rust:
1144
1145 - Dereferencing a [raw pointer](#pointer-types).
1146 - Reading or writing a [mutable static variable](#mutable-statics).
1147 - Calling an unsafe function (including an intrinsic or foreign function).
1148
1149 ##### Unsafe functions
1150
1151 Unsafe functions are functions that are not safe in all contexts and/or for all
1152 possible inputs. Such a function must be prefixed with the keyword `unsafe` and
1153 can only be called from an `unsafe` block or another `unsafe` function.
1154
1155 ##### Unsafe blocks
1156
1157 A block of code can be prefixed with the `unsafe` keyword, to permit calling
1158 `unsafe` functions or dereferencing raw pointers within a safe function.
1159
1160 When a programmer has sufficient conviction that a sequence of potentially
1161 unsafe operations is actually safe, they can encapsulate that sequence (taken
1162 as a whole) within an `unsafe` block. The compiler will consider uses of such
1163 code safe, in the surrounding context.
1164
1165 Unsafe blocks are used to wrap foreign libraries, make direct use of hardware
1166 or implement features not directly present in the language. For example, Rust
1167 provides the language features necessary to implement memory-safe concurrency
1168 in the language but the implementation of threads and message passing is in the
1169 standard library.
1170
1171 Rust's type system is a conservative approximation of the dynamic safety
1172 requirements, so in some cases there is a performance cost to using safe code.
1173 For example, a doubly-linked list is not a tree structure and can only be
1174 represented with reference-counted pointers in safe code. By using `unsafe`
1175 blocks to represent the reverse links as raw pointers, it can be implemented
1176 with only boxes.
1177
1178 ##### Behavior considered undefined
1179
1180 The following is a list of behavior which is forbidden in all Rust code,
1181 including within `unsafe` blocks and `unsafe` functions. Type checking provides
1182 the guarantee that these issues are never caused by safe code.
1183
1184 * Data races
1185 * Dereferencing a null/dangling raw pointer
1186 * Reads of [undef](http://llvm.org/docs/LangRef.html#undefined-values)
1187   (uninitialized) memory
1188 * Breaking the [pointer aliasing
1189   rules](http://llvm.org/docs/LangRef.html#pointer-aliasing-rules)
1190   with raw pointers (a subset of the rules used by C)
1191 * `&mut` and `&` follow LLVM’s scoped [noalias] model, except if the `&T`
1192   contains an `UnsafeCell<U>`. Unsafe code must not violate these aliasing
1193   guarantees.
1194 * Mutating an immutable value/reference without `UnsafeCell<U>`
1195 * Invoking undefined behavior via compiler intrinsics:
1196   * Indexing outside of the bounds of an object with `std::ptr::offset`
1197     (`offset` intrinsic), with
1198     the exception of one byte past the end which is permitted.
1199   * Using `std::ptr::copy_nonoverlapping_memory` (`memcpy32`/`memcpy64`
1200     intrinsics) on overlapping buffers
1201 * Invalid values in primitive types, even in private fields/locals:
1202   * Dangling/null references or boxes
1203   * A value other than `false` (0) or `true` (1) in a `bool`
1204   * A discriminant in an `enum` not included in the type definition
1205   * A value in a `char` which is a surrogate or above `char::MAX`
1206   * Non-UTF-8 byte sequences in a `str`
1207 * Unwinding into Rust from foreign code or unwinding from Rust into foreign
1208   code. Rust's failure system is not compatible with exception handling in
1209   other languages. Unwinding must be caught and handled at FFI boundaries.
1210
1211 [noalias]: http://llvm.org/docs/LangRef.html#noalias
1212
1213 ##### Behaviour not considered unsafe
1214
1215 This is a list of behaviour not considered *unsafe* in Rust terms, but that may
1216 be undesired.
1217
1218 * Deadlocks
1219 * Reading data from private fields (`std::repr`)
1220 * Leaks due to reference count cycles, even in the global heap
1221 * Exiting without calling destructors
1222 * Sending signals
1223 * Accessing/modifying the file system
1224 * Unsigned integer overflow (well-defined as wrapping)
1225 * Signed integer overflow (well-defined as two’s complement representation
1226   wrapping)
1227
1228 #### Diverging functions
1229
1230 A special kind of function can be declared with a `!` character where the
1231 output type would normally be. For example:
1232
1233 ```
1234 fn my_err(s: &str) -> ! {
1235     println!("{}", s);
1236     panic!();
1237 }
1238 ```
1239
1240 We call such functions "diverging" because they never return a value to the
1241 caller. Every control path in a diverging function must end with a `panic!()` or
1242 a call to another diverging function on every control path. The `!` annotation
1243 does *not* denote a type.
1244
1245 It might be necessary to declare a diverging function because as mentioned
1246 previously, the typechecker checks that every control path in a function ends
1247 with a [`return`](#return-expressions) or diverging expression. So, if `my_err`
1248 were declared without the `!` annotation, the following code would not
1249 typecheck:
1250
1251 ```
1252 # fn my_err(s: &str) -> ! { panic!() }
1253
1254 fn f(i: i32) -> i32 {
1255    if i == 42 {
1256      return 42;
1257    }
1258    else {
1259      my_err("Bad number!");
1260    }
1261 }
1262 ```
1263
1264 This will not compile without the `!` annotation on `my_err`, since the `else`
1265 branch of the conditional in `f` does not return an `i32`, as required by the
1266 signature of `f`. Adding the `!` annotation to `my_err` informs the
1267 typechecker that, should control ever enter `my_err`, no further type judgments
1268 about `f` need to hold, since control will never resume in any context that
1269 relies on those judgments. Thus the return type on `f` only needs to reflect
1270 the `if` branch of the conditional.
1271
1272 #### Extern functions
1273
1274 Extern functions are part of Rust's foreign function interface, providing the
1275 opposite functionality to [external blocks](#external-blocks). Whereas
1276 external blocks allow Rust code to call foreign code, extern functions with
1277 bodies defined in Rust code _can be called by foreign code_. They are defined
1278 in the same way as any other Rust function, except that they have the `extern`
1279 modifier.
1280
1281 ```
1282 // Declares an extern fn, the ABI defaults to "C"
1283 extern fn new_i32() -> i32 { 0 }
1284
1285 // Declares an extern fn with "stdcall" ABI
1286 extern "stdcall" fn new_i32_stdcall() -> i32 { 0 }
1287 ```
1288
1289 Unlike normal functions, extern fns have an `extern "ABI" fn()`. This is the
1290 same type as the functions declared in an extern block.
1291
1292 ```
1293 # extern fn new_i32() -> i32 { 0 }
1294 let fptr: extern "C" fn() -> i32 = new_i32;
1295 ```
1296
1297 Extern functions may be called directly from Rust code as Rust uses large,
1298 contiguous stack segments like C.
1299
1300 ### Type aliases
1301
1302 A _type alias_ defines a new name for an existing [type](#types). Type
1303 aliases are declared with the keyword `type`. Every value has a single,
1304 specific type, but may implement several different traits, or be compatible with
1305 several different type constraints.
1306
1307 For example, the following defines the type `Point` as a synonym for the type
1308 `(u8, u8)`, the type of pairs of unsigned 8 bit integers.:
1309
1310 ```
1311 type Point = (u8, u8);
1312 let p: Point = (41, 68);
1313 ```
1314
1315 ### Structures
1316
1317 A _structure_ is a nominal [structure type](#structure-types) defined with the
1318 keyword `struct`.
1319
1320 An example of a `struct` item and its use:
1321
1322 ```
1323 struct Point {x: i32, y: i32}
1324 let p = Point {x: 10, y: 11};
1325 let px: i32 = p.x;
1326 ```
1327
1328 A _tuple structure_ is a nominal [tuple type](#tuple-types), also defined with
1329 the keyword `struct`. For example:
1330
1331 ```
1332 struct Point(i32, i32);
1333 let p = Point(10, 11);
1334 let px: i32 = match p { Point(x, _) => x };
1335 ```
1336
1337 A _unit-like struct_ is a structure without any fields, defined by leaving off
1338 the list of fields entirely. Such types will have a single value, just like
1339 the [unit value `()`](#unit-and-boolean-literals) of the unit type. For
1340 example:
1341
1342 ```
1343 struct Cookie;
1344 let c = [Cookie, Cookie, Cookie, Cookie];
1345 ```
1346
1347 The precise memory layout of a structure is not specified. One can specify a
1348 particular layout using the [`repr` attribute](#ffi-attributes).
1349
1350 ### Enumerations
1351
1352 An _enumeration_ is a simultaneous definition of a nominal [enumerated
1353 type](#enumerated-types) as well as a set of *constructors*, that can be used
1354 to create or pattern-match values of the corresponding enumerated type.
1355
1356 Enumerations are declared with the keyword `enum`.
1357
1358 An example of an `enum` item and its use:
1359
1360 ```
1361 enum Animal {
1362   Dog,
1363   Cat
1364 }
1365
1366 let mut a: Animal = Animal::Dog;
1367 a = Animal::Cat;
1368 ```
1369
1370 Enumeration constructors can have either named or unnamed fields:
1371
1372 ```rust
1373 enum Animal {
1374     Dog (String, f64),
1375     Cat { name: String, weight: f64 }
1376 }
1377
1378 let mut a: Animal = Animal::Dog("Cocoa".to_string(), 37.2);
1379 a = Animal::Cat { name: "Spotty".to_string(), weight: 2.7 };
1380 ```
1381
1382 In this example, `Cat` is a _struct-like enum variant_,
1383 whereas `Dog` is simply called an enum variant.
1384
1385 Enums have a discriminant. You can assign them explicitly:
1386
1387 ```
1388 enum Foo {
1389     Bar = 123,
1390 }
1391 ```
1392
1393 If a discriminant isn't assigned, they start at zero, and add one for each
1394 variant, in order.
1395
1396 You can cast an enum to get this value:
1397
1398 ```
1399 # enum Foo { Bar = 123 }
1400 let x = Foo::Bar as u32; // x is now 123u32
1401 ```
1402
1403 This only works as long as none of the variants have data attached. If
1404 it were `Bar(i32)`, this is disallowed.
1405
1406 ### Constant items
1407
1408 ```{.ebnf .gram}
1409 const_item : "const" ident ':' type '=' expr ';' ;
1410 ```
1411
1412 A *constant item* is a named _constant value_ which is not associated with a
1413 specific memory location in the program. Constants are essentially inlined
1414 wherever they are used, meaning that they are copied directly into the relevant
1415 context when used. References to the same constant are not necessarily
1416 guaranteed to refer to the same memory address.
1417
1418 Constant values must not have destructors, and otherwise permit most forms of
1419 data. Constants may refer to the address of other constants, in which case the
1420 address will have the `static` lifetime. The compiler is, however, still at
1421 liberty to translate the constant many times, so the address referred to may not
1422 be stable.
1423
1424 Constants must be explicitly typed. The type may be `bool`, `char`, a number, or
1425 a type derived from those primitive types. The derived types are references with
1426 the `static` lifetime, fixed-size arrays, tuples, enum variants, and structs.
1427
1428 ```
1429 const BIT1: u32 = 1 << 0;
1430 const BIT2: u32 = 1 << 1;
1431
1432 const BITS: [u32; 2] = [BIT1, BIT2];
1433 const STRING: &'static str = "bitstring";
1434
1435 struct BitsNStrings<'a> {
1436     mybits: [u32; 2],
1437     mystring: &'a str
1438 }
1439
1440 const BITS_N_STRINGS: BitsNStrings<'static> = BitsNStrings {
1441     mybits: BITS,
1442     mystring: STRING
1443 };
1444 ```
1445
1446 ### Static items
1447
1448 ```{.ebnf .gram}
1449 static_item : "static" ident ':' type '=' expr ';' ;
1450 ```
1451
1452 A *static item* is similar to a *constant*, except that it represents a precise
1453 memory location in the program. A static is never "inlined" at the usage site,
1454 and all references to it refer to the same memory location. Static items have
1455 the `static` lifetime, which outlives all other lifetimes in a Rust program.
1456 Static items may be placed in read-only memory if they do not contain any
1457 interior mutability.
1458
1459 Statics may contain interior mutability through the `UnsafeCell` language item.
1460 All access to a static is safe, but there are a number of restrictions on
1461 statics:
1462
1463 * Statics may not contain any destructors.
1464 * The types of static values must ascribe to `Sync` to allow threadsafe access.
1465 * Statics may not refer to other statics by value, only by reference.
1466 * Constants cannot refer to statics.
1467
1468 Constants should in general be preferred over statics, unless large amounts of
1469 data are being stored, or single-address and mutability properties are required.
1470
1471 #### Mutable statics
1472
1473 If a static item is declared with the `mut` keyword, then it is allowed to
1474 be modified by the program. One of Rust's goals is to make concurrency bugs
1475 hard to run into, and this is obviously a very large source of race conditions
1476 or other bugs. For this reason, an `unsafe` block is required when either
1477 reading or writing a mutable static variable. Care should be taken to ensure
1478 that modifications to a mutable static are safe with respect to other threads
1479 running in the same process.
1480
1481 Mutable statics are still very useful, however. They can be used with C
1482 libraries and can also be bound from C libraries (in an `extern` block).
1483
1484 ```
1485 # fn atomic_add(_: &mut u32, _: u32) -> u32 { 2 }
1486
1487 static mut LEVELS: u32 = 0;
1488
1489 // This violates the idea of no shared state, and this doesn't internally
1490 // protect against races, so this function is `unsafe`
1491 unsafe fn bump_levels_unsafe1() -> u32 {
1492     let ret = LEVELS;
1493     LEVELS += 1;
1494     return ret;
1495 }
1496
1497 // Assuming that we have an atomic_add function which returns the old value,
1498 // this function is "safe" but the meaning of the return value may not be what
1499 // callers expect, so it's still marked as `unsafe`
1500 unsafe fn bump_levels_unsafe2() -> u32 {
1501     return atomic_add(&mut LEVELS, 1);
1502 }
1503 ```
1504
1505 Mutable statics have the same restrictions as normal statics, except that the
1506 type of the value is not required to ascribe to `Sync`.
1507
1508 ### Traits
1509
1510 A _trait_ describes a set of method types.
1511
1512 Traits can include default implementations of methods, written in terms of some
1513 unknown [`self` type](#self-types); the `self` type may either be completely
1514 unspecified, or constrained by some other trait.
1515
1516 Traits are implemented for specific types through separate
1517 [implementations](#implementations).
1518
1519 ```
1520 # type Surface = i32;
1521 # type BoundingBox = i32;
1522 trait Shape {
1523     fn draw(&self, Surface);
1524     fn bounding_box(&self) -> BoundingBox;
1525 }
1526 ```
1527
1528 This defines a trait with two methods. All values that have
1529 [implementations](#implementations) of this trait in scope can have their
1530 `draw` and `bounding_box` methods called, using `value.bounding_box()`
1531 [syntax](#method-call-expressions).
1532
1533 Type parameters can be specified for a trait to make it generic. These appear
1534 after the trait name, using the same syntax used in [generic
1535 functions](#generic-functions).
1536
1537 ```
1538 trait Seq<T> {
1539    fn len(&self) -> u32;
1540    fn elt_at(&self, n: u32) -> T;
1541    fn iter<F>(&self, F) where F: Fn(T);
1542 }
1543 ```
1544
1545 Generic functions may use traits as _bounds_ on their type parameters. This
1546 will have two effects: only types that have the trait may instantiate the
1547 parameter, and within the generic function, the methods of the trait can be
1548 called on values that have the parameter's type. For example:
1549
1550 ```
1551 # type Surface = i32;
1552 # trait Shape { fn draw(&self, Surface); }
1553 fn draw_twice<T: Shape>(surface: Surface, sh: T) {
1554     sh.draw(surface);
1555     sh.draw(surface);
1556 }
1557 ```
1558
1559 Traits also define an [object type](#object-types) with the same name as the
1560 trait. Values of this type are created by [casting](#type-cast-expressions)
1561 pointer values (pointing to a type for which an implementation of the given
1562 trait is in scope) to pointers to the trait name, used as a type.
1563
1564 ```
1565 # trait Shape { fn dummy(&self) { } }
1566 # impl Shape for i32 { }
1567 # let mycircle = 0i32;
1568 let myshape: Box<Shape> = Box::new(mycircle) as Box<Shape>;
1569 ```
1570
1571 The resulting value is a box containing the value that was cast, along with
1572 information that identifies the methods of the implementation that was used.
1573 Values with a trait type can have [methods called](#method-call-expressions) on
1574 them, for any method in the trait, and can be used to instantiate type
1575 parameters that are bounded by the trait.
1576
1577 Trait methods may be static, which means that they lack a `self` argument.
1578 This means that they can only be called with function call syntax (`f(x)`) and
1579 not method call syntax (`obj.f()`). The way to refer to the name of a static
1580 method is to qualify it with the trait name, treating the trait name like a
1581 module. For example:
1582
1583 ```
1584 trait Num {
1585     fn from_i32(n: i32) -> Self;
1586 }
1587 impl Num for f64 {
1588     fn from_i32(n: i32) -> f64 { n as f64 }
1589 }
1590 let x: f64 = Num::from_i32(42);
1591 ```
1592
1593 Traits may inherit from other traits. For example, in
1594
1595 ```
1596 trait Shape { fn area(&self) -> f64; }
1597 trait Circle : Shape { fn radius(&self) -> f64; }
1598 ```
1599
1600 the syntax `Circle : Shape` means that types that implement `Circle` must also
1601 have an implementation for `Shape`. Multiple supertraits are separated by `+`,
1602 `trait Circle : Shape + PartialEq { }`. In an implementation of `Circle` for a
1603 given type `T`, methods can refer to `Shape` methods, since the typechecker
1604 checks that any type with an implementation of `Circle` also has an
1605 implementation of `Shape`.
1606
1607 In type-parameterized functions, methods of the supertrait may be called on
1608 values of subtrait-bound type parameters. Referring to the previous example of
1609 `trait Circle : Shape`:
1610
1611 ```
1612 # trait Shape { fn area(&self) -> f64; }
1613 # trait Circle : Shape { fn radius(&self) -> f64; }
1614 fn radius_times_area<T: Circle>(c: T) -> f64 {
1615     // `c` is both a Circle and a Shape
1616     c.radius() * c.area()
1617 }
1618 ```
1619
1620 Likewise, supertrait methods may also be called on trait objects.
1621
1622 ```{.ignore}
1623 # trait Shape { fn area(&self) -> f64; }
1624 # trait Circle : Shape { fn radius(&self) -> f64; }
1625 # impl Shape for i32 { fn area(&self) -> f64 { 0.0 } }
1626 # impl Circle for i32 { fn radius(&self) -> f64 { 0.0 } }
1627 # let mycircle = 0i32;
1628 let mycircle = Box::new(mycircle) as Box<Circle>;
1629 let nonsense = mycircle.radius() * mycircle.area();
1630 ```
1631
1632 ### Implementations
1633
1634 An _implementation_ is an item that implements a [trait](#traits) for a
1635 specific type.
1636
1637 Implementations are defined with the keyword `impl`.
1638
1639 ```
1640 # #[derive(Copy, Clone)]
1641 # struct Point {x: f64, y: f64};
1642 # type Surface = i32;
1643 # struct BoundingBox {x: f64, y: f64, width: f64, height: f64};
1644 # trait Shape { fn draw(&self, Surface); fn bounding_box(&self) -> BoundingBox; }
1645 # fn do_draw_circle(s: Surface, c: Circle) { }
1646 struct Circle {
1647     radius: f64,
1648     center: Point,
1649 }
1650
1651 impl Copy for Circle {}
1652
1653 impl Clone for Circle {
1654     fn clone(&self) -> Circle { *self }
1655 }
1656
1657 impl Shape for Circle {
1658     fn draw(&self, s: Surface) { do_draw_circle(s, *self); }
1659     fn bounding_box(&self) -> BoundingBox {
1660         let r = self.radius;
1661         BoundingBox{x: self.center.x - r, y: self.center.y - r,
1662          width: 2.0 * r, height: 2.0 * r}
1663     }
1664 }
1665 ```
1666
1667 It is possible to define an implementation without referring to a trait. The
1668 methods in such an implementation can only be used as direct calls on the
1669 values of the type that the implementation targets. In such an implementation,
1670 the trait type and `for` after `impl` are omitted. Such implementations are
1671 limited to nominal types (enums, structs), and the implementation must appear
1672 in the same module or a sub-module as the `self` type:
1673
1674 ```
1675 struct Point {x: i32, y: i32}
1676
1677 impl Point {
1678     fn log(&self) {
1679         println!("Point is at ({}, {})", self.x, self.y);
1680     }
1681 }
1682
1683 let my_point = Point {x: 10, y:11};
1684 my_point.log();
1685 ```
1686
1687 When a trait _is_ specified in an `impl`, all methods declared as part of the
1688 trait must be implemented, with matching types and type parameter counts.
1689
1690 An implementation can take type parameters, which can be different from the
1691 type parameters taken by the trait it implements. Implementation parameters
1692 are written after the `impl` keyword.
1693
1694 ```
1695 # trait Seq<T> { fn dummy(&self, _: T) { } }
1696 impl<T> Seq<T> for Vec<T> {
1697    /* ... */
1698 }
1699 impl Seq<bool> for u32 {
1700    /* Treat the integer as a sequence of bits */
1701 }
1702 ```
1703
1704 ### External blocks
1705
1706 ```{.ebnf .gram}
1707 extern_block_item : "extern" '{' extern_block '}' ;
1708 extern_block : [ foreign_fn ] * ;
1709 ```
1710
1711 External blocks form the basis for Rust's foreign function interface.
1712 Declarations in an external block describe symbols in external, non-Rust
1713 libraries.
1714
1715 Functions within external blocks are declared in the same way as other Rust
1716 functions, with the exception that they may not have a body and are instead
1717 terminated by a semicolon.
1718
1719 Functions within external blocks may be called by Rust code, just like
1720 functions defined in Rust. The Rust compiler automatically translates between
1721 the Rust ABI and the foreign ABI.
1722
1723 A number of [attributes](#attributes) control the behavior of external blocks.
1724
1725 By default external blocks assume that the library they are calling uses the
1726 standard C "cdecl" ABI. Other ABIs may be specified using an `abi` string, as
1727 shown here:
1728
1729 ```ignore
1730 // Interface to the Windows API
1731 extern "stdcall" { }
1732 ```
1733
1734 The `link` attribute allows the name of the library to be specified. When
1735 specified the compiler will attempt to link against the native library of the
1736 specified name.
1737
1738 ```{.ignore}
1739 #[link(name = "crypto")]
1740 extern { }
1741 ```
1742
1743 The type of a function declared in an extern block is `extern "abi" fn(A1, ...,
1744 An) -> R`, where `A1...An` are the declared types of its arguments and `R` is
1745 the declared return type.
1746
1747 ## Visibility and Privacy
1748
1749 These two terms are often used interchangeably, and what they are attempting to
1750 convey is the answer to the question "Can this item be used at this location?"
1751
1752 Rust's name resolution operates on a global hierarchy of namespaces. Each level
1753 in the hierarchy can be thought of as some item. The items are one of those
1754 mentioned above, but also include external crates. Declaring or defining a new
1755 module can be thought of as inserting a new tree into the hierarchy at the
1756 location of the definition.
1757
1758 To control whether interfaces can be used across modules, Rust checks each use
1759 of an item to see whether it should be allowed or not. This is where privacy
1760 warnings are generated, or otherwise "you used a private item of another module
1761 and weren't allowed to."
1762
1763 By default, everything in Rust is *private*, with one exception. Enum variants
1764 in a `pub` enum are also public by default. You are allowed to alter this
1765 default visibility with the `priv` keyword. When an item is declared as `pub`,
1766 it can be thought of as being accessible to the outside world. For example:
1767
1768 ```
1769 # fn main() {}
1770 // Declare a private struct
1771 struct Foo;
1772
1773 // Declare a public struct with a private field
1774 pub struct Bar {
1775     field: i32
1776 }
1777
1778 // Declare a public enum with two public variants
1779 pub enum State {
1780     PubliclyAccessibleState,
1781     PubliclyAccessibleState2,
1782 }
1783 ```
1784
1785 With the notion of an item being either public or private, Rust allows item
1786 accesses in two cases:
1787
1788 1. If an item is public, then it can be used externally through any of its
1789    public ancestors.
1790 2. If an item is private, it may be accessed by the current module and its
1791    descendants.
1792
1793 These two cases are surprisingly powerful for creating module hierarchies
1794 exposing public APIs while hiding internal implementation details. To help
1795 explain, here's a few use cases and what they would entail:
1796
1797 * A library developer needs to expose functionality to crates which link
1798   against their library. As a consequence of the first case, this means that
1799   anything which is usable externally must be `pub` from the root down to the
1800   destination item. Any private item in the chain will disallow external
1801   accesses.
1802
1803 * A crate needs a global available "helper module" to itself, but it doesn't
1804   want to expose the helper module as a public API. To accomplish this, the
1805   root of the crate's hierarchy would have a private module which then
1806   internally has a "public api". Because the entire crate is a descendant of
1807   the root, then the entire local crate can access this private module through
1808   the second case.
1809
1810 * When writing unit tests for a module, it's often a common idiom to have an
1811   immediate child of the module to-be-tested named `mod test`. This module
1812   could access any items of the parent module through the second case, meaning
1813   that internal implementation details could also be seamlessly tested from the
1814   child module.
1815
1816 In the second case, it mentions that a private item "can be accessed" by the
1817 current module and its descendants, but the exact meaning of accessing an item
1818 depends on what the item is. Accessing a module, for example, would mean
1819 looking inside of it (to import more items). On the other hand, accessing a
1820 function would mean that it is invoked. Additionally, path expressions and
1821 import statements are considered to access an item in the sense that the
1822 import/expression is only valid if the destination is in the current visibility
1823 scope.
1824
1825 Here's an example of a program which exemplifies the three cases outlined
1826 above:
1827
1828 ```
1829 // This module is private, meaning that no external crate can access this
1830 // module. Because it is private at the root of this current crate, however, any
1831 // module in the crate may access any publicly visible item in this module.
1832 mod crate_helper_module {
1833
1834     // This function can be used by anything in the current crate
1835     pub fn crate_helper() {}
1836
1837     // This function *cannot* be used by anything else in the crate. It is not
1838     // publicly visible outside of the `crate_helper_module`, so only this
1839     // current module and its descendants may access it.
1840     fn implementation_detail() {}
1841 }
1842
1843 // This function is "public to the root" meaning that it's available to external
1844 // crates linking against this one.
1845 pub fn public_api() {}
1846
1847 // Similarly to 'public_api', this module is public so external crates may look
1848 // inside of it.
1849 pub mod submodule {
1850     use crate_helper_module;
1851
1852     pub fn my_method() {
1853         // Any item in the local crate may invoke the helper module's public
1854         // interface through a combination of the two rules above.
1855         crate_helper_module::crate_helper();
1856     }
1857
1858     // This function is hidden to any module which is not a descendant of
1859     // `submodule`
1860     fn my_implementation() {}
1861
1862     #[cfg(test)]
1863     mod test {
1864
1865         #[test]
1866         fn test_my_implementation() {
1867             // Because this module is a descendant of `submodule`, it's allowed
1868             // to access private items inside of `submodule` without a privacy
1869             // violation.
1870             super::my_implementation();
1871         }
1872     }
1873 }
1874
1875 # fn main() {}
1876 ```
1877
1878 For a rust program to pass the privacy checking pass, all paths must be valid
1879 accesses given the two rules above. This includes all use statements,
1880 expressions, types, etc.
1881
1882 ### Re-exporting and Visibility
1883
1884 Rust allows publicly re-exporting items through a `pub use` directive. Because
1885 this is a public directive, this allows the item to be used in the current
1886 module through the rules above. It essentially allows public access into the
1887 re-exported item. For example, this program is valid:
1888
1889 ```
1890 pub use self::implementation::api;
1891
1892 mod implementation {
1893     pub mod api {
1894         pub fn f() {}
1895     }
1896 }
1897
1898 # fn main() {}
1899 ```
1900
1901 This means that any external crate referencing `implementation::api::f` would
1902 receive a privacy violation, while the path `api::f` would be allowed.
1903
1904 When re-exporting a private item, it can be thought of as allowing the "privacy
1905 chain" being short-circuited through the reexport instead of passing through
1906 the namespace hierarchy as it normally would.
1907
1908 ## Attributes
1909
1910 ```{.ebnf .gram}
1911 attribute : '#' '!' ? '[' meta_item ']' ;
1912 meta_item : ident [ '=' literal
1913                   | '(' meta_seq ')' ] ? ;
1914 meta_seq : meta_item [ ',' meta_seq ] ? ;
1915 ```
1916
1917 Any item declaration may have an _attribute_ applied to it. Attributes in Rust
1918 are modeled on Attributes in ECMA-335, with the syntax coming from ECMA-334
1919 (C#). An attribute is a general, free-form metadatum that is interpreted
1920 according to name, convention, and language and compiler version. Attributes
1921 may appear as any of:
1922
1923 * A single identifier, the attribute name
1924 * An identifier followed by the equals sign '=' and a literal, providing a
1925   key/value pair
1926 * An identifier followed by a parenthesized list of sub-attribute arguments
1927
1928 Attributes with a bang ("!") after the hash ("#") apply to the item that the
1929 attribute is declared within. Attributes that do not have a bang after the hash
1930 apply to the item that follows the attribute.
1931
1932 An example of attributes:
1933
1934 ```{.rust}
1935 // General metadata applied to the enclosing module or crate.
1936 #![crate_type = "lib"]
1937
1938 // A function marked as a unit test
1939 #[test]
1940 fn test_foo() {
1941   /* ... */
1942 }
1943
1944 // A conditionally-compiled module
1945 #[cfg(target_os="linux")]
1946 mod bar {
1947   /* ... */
1948 }
1949
1950 // A lint attribute used to suppress a warning/error
1951 #[allow(non_camel_case_types)]
1952 type int8_t = i8;
1953 ```
1954
1955 > **Note:** At some point in the future, the compiler will distinguish between
1956 > language-reserved and user-available attributes. Until then, there is
1957 > effectively no difference between an attribute handled by a loadable syntax
1958 > extension and the compiler.
1959
1960 ### Crate-only attributes
1961
1962 - `crate_name` - specify the this crate's crate name.
1963 - `crate_type` - see [linkage](#linkage).
1964 - `feature` - see [compiler features](#compiler-features).
1965 - `no_builtins` - disable optimizing certain code patterns to invocations of
1966                   library functions that are assumed to exist
1967 - `no_main` - disable emitting the `main` symbol. Useful when some other
1968    object being linked to defines `main`.
1969 - `no_start` - disable linking to the `native` crate, which specifies the
1970   "start" language item.
1971 - `no_std` - disable linking to the `std` crate.
1972 - `plugin` â€” load a list of named crates as compiler plugins, e.g.
1973              `#![plugin(foo, bar)]`. Optional arguments for each plugin,
1974              i.e. `#![plugin(foo(... args ...))]`, are provided to the plugin's
1975              registrar function.  The `plugin` feature gate is required to use
1976              this attribute.
1977
1978 ### Module-only attributes
1979
1980 - `no_implicit_prelude` - disable injecting `use std::prelude::*` in this
1981   module.
1982 - `path` - specifies the file to load the module from. `#[path="foo.rs"] mod
1983   bar;` is equivalent to `mod bar { /* contents of foo.rs */ }`. The path is
1984   taken relative to the directory that the current module is in.
1985
1986 ### Function-only attributes
1987
1988 - `main` - indicates that this function should be passed to the entry point,
1989   rather than the function in the crate root named `main`.
1990 - `plugin_registrar` - mark this function as the registration point for
1991   [compiler plugins][plugin], such as loadable syntax extensions.
1992 - `start` - indicates that this function should be used as the entry point,
1993   overriding the "start" language item. See the "start" [language
1994   item](#language-items) for more details.
1995 - `test` - indicates that this function is a test function, to only be compiled
1996   in case of `--test`.
1997 - `should_panic` - indicates that this test function should panic, inverting the success condition.
1998 - `cold` - The function is unlikely to be executed, so optimize it (and calls
1999   to it) differently.
2000
2001 ### Static-only attributes
2002
2003 - `thread_local` - on a `static mut`, this signals that the value of this
2004   static may change depending on the current thread. The exact consequences of
2005   this are implementation-defined.
2006
2007 ### FFI attributes
2008
2009 On an `extern` block, the following attributes are interpreted:
2010
2011 - `link_args` - specify arguments to the linker, rather than just the library
2012   name and type. This is feature gated and the exact behavior is
2013   implementation-defined (due to variety of linker invocation syntax).
2014 - `link` - indicate that a native library should be linked to for the
2015   declarations in this block to be linked correctly. `link` supports an optional `kind`
2016   key with three possible values: `dylib`, `static`, and `framework`. See [external blocks](#external-blocks) for more about external blocks. Two
2017   examples: `#[link(name = "readline")]` and
2018   `#[link(name = "CoreFoundation", kind = "framework")]`.
2019
2020 On declarations inside an `extern` block, the following attributes are
2021 interpreted:
2022
2023 - `link_name` - the name of the symbol that this function or static should be
2024   imported as.
2025 - `linkage` - on a static, this specifies the [linkage
2026   type](http://llvm.org/docs/LangRef.html#linkage-types).
2027
2028 On `enum`s:
2029
2030 - `repr` - on C-like enums, this sets the underlying type used for
2031   representation. Takes one argument, which is the primitive
2032   type this enum should be represented for, or `C`, which specifies that it
2033   should be the default `enum` size of the C ABI for that platform. Note that
2034   enum representation in C is undefined, and this may be incorrect when the C
2035   code is compiled with certain flags.
2036
2037 On `struct`s:
2038
2039 - `repr` - specifies the representation to use for this struct. Takes a list
2040   of options. The currently accepted ones are `C` and `packed`, which may be
2041   combined. `C` will use a C ABI compatible struct layout, and `packed` will
2042   remove any padding between fields (note that this is very fragile and may
2043   break platforms which require aligned access).
2044
2045 ### Macro-related attributes
2046
2047 - `macro_use` on a `mod` â€” macros defined in this module will be visible in the
2048   module's parent, after this module has been included.
2049
2050 - `macro_use` on an `extern crate` â€” load macros from this crate.  An optional
2051   list of names `#[macro_use(foo, bar)]` restricts the import to just those
2052   macros named.  The `extern crate` must appear at the crate root, not inside
2053   `mod`, which ensures proper function of the [`$crate` macro
2054   variable](book/macros.html#the-variable-$crate).
2055
2056 - `macro_reexport` on an `extern crate` â€” re-export the named macros.
2057
2058 - `macro_export` - export a macro for cross-crate usage.
2059
2060 - `no_link` on an `extern crate` â€” even if we load this crate for macros, don't
2061   link it into the output.
2062
2063 See the [macros section of the
2064 book](book/macros.html#scoping-and-macro-import/export) for more information on
2065 macro scope.
2066
2067
2068 ### Miscellaneous attributes
2069
2070 - `export_name` - on statics and functions, this determines the name of the
2071   exported symbol.
2072 - `link_section` - on statics and functions, this specifies the section of the
2073   object file that this item's contents will be placed into.
2074 - `no_mangle` - on any item, do not apply the standard name mangling. Set the
2075   symbol for this item to its identifier.
2076 - `packed` - on structs or enums, eliminate any padding that would be used to
2077   align fields.
2078 - `simd` - on certain tuple structs, derive the arithmetic operators, which
2079   lower to the target's SIMD instructions, if any; the `simd` feature gate
2080   is necessary to use this attribute.
2081 - `static_assert` - on statics whose type is `bool`, terminates compilation
2082   with an error if it is not initialized to `true`.
2083 - `unsafe_destructor` - allow implementations of the "drop" language item
2084   where the type it is implemented for does not implement the "send" language
2085   item; the `unsafe_destructor` feature gate is needed to use this attribute
2086 - `unsafe_no_drop_flag` - on structs, remove the flag that prevents
2087   destructors from being run twice. Destructors might be run multiple times on
2088   the same object with this attribute.
2089 - `doc` - Doc comments such as `/// foo` are equivalent to `#[doc = "foo"]`.
2090 - `rustc_on_unimplemented` - Write a custom note to be shown along with the error
2091    when the trait is found to be unimplemented on a type.
2092    You may use format arguments like `{T}`, `{A}` to correspond to the
2093    types at the point of use corresponding to the type parameters of the
2094    trait of the same name. `{Self}` will be replaced with the type that is supposed
2095    to implement the trait but doesn't. To use this, the `on_unimplemented` feature gate
2096    must be enabled.
2097
2098 ### Conditional compilation
2099
2100 Sometimes one wants to have different compiler outputs from the same code,
2101 depending on build target, such as targeted operating system, or to enable
2102 release builds.
2103
2104 There are two kinds of configuration options, one that is either defined or not
2105 (`#[cfg(foo)]`), and the other that contains a string that can be checked
2106 against (`#[cfg(bar = "baz")]` (currently only compiler-defined configuration
2107 options can have the latter form).
2108
2109 ```
2110 // The function is only included in the build when compiling for OSX
2111 #[cfg(target_os = "macos")]
2112 fn macos_only() {
2113   // ...
2114 }
2115
2116 // This function is only included when either foo or bar is defined
2117 #[cfg(any(foo, bar))]
2118 fn needs_foo_or_bar() {
2119   // ...
2120 }
2121
2122 // This function is only included when compiling for a unixish OS with a 32-bit
2123 // architecture
2124 #[cfg(all(unix, target_pointer_width = "32"))]
2125 fn on_32bit_unix() {
2126   // ...
2127 }
2128
2129 // This function is only included when foo is not defined
2130 #[cfg(not(foo))]
2131 fn needs_not_foo() {
2132   // ...
2133 }
2134 ```
2135
2136 This illustrates some conditional compilation can be achieved using the
2137 `#[cfg(...)]` attribute. `any`, `all` and `not` can be used to assemble
2138 arbitrarily complex configurations through nesting.
2139
2140 The following configurations must be defined by the implementation:
2141
2142 * `target_arch = "..."`. Target CPU architecture, such as `"x86"`, `"x86_64"`
2143   `"mips"`, `"powerpc"`, `"arm"`, or `"aarch64"`.
2144 * `target_endian = "..."`. Endianness of the target CPU, either `"little"` or
2145   `"big"`.
2146 * `target_family = "..."`. Operating system family of the target, e. g.
2147   `"unix"` or `"windows"`. The value of this configuration option is defined
2148   as a configuration itself, like `unix` or `windows`.
2149 * `target_os = "..."`. Operating system of the target, examples include
2150   `"win32"`, `"macos"`, `"linux"`, `"android"`, `"freebsd"`, `"dragonfly"`,
2151   `"bitrig"` or `"openbsd"`.
2152 * `target_pointer_width = "..."`. Target pointer width in bits. This is set
2153   to `"32"` for targets with 32-bit pointers, and likewise set to `"64"` for
2154   64-bit pointers.
2155 * `unix`. See `target_family`.
2156 * `windows`. See `target_family`.
2157
2158 You can also set another attribute based on a `cfg` variable with `cfg_attr`:
2159
2160 ```rust,ignore
2161 #[cfg_attr(a, b)]
2162 ```
2163
2164 Will be the same as `#[b]` if `a` is set by `cfg`, and nothing otherwise.
2165
2166 ### Lint check attributes
2167
2168 A lint check names a potentially undesirable coding pattern, such as
2169 unreachable code or omitted documentation, for the static entity to which the
2170 attribute applies.
2171
2172 For any lint check `C`:
2173
2174 * `allow(C)` overrides the check for `C` so that violations will go
2175    unreported,
2176 * `deny(C)` signals an error after encountering a violation of `C`,
2177 * `forbid(C)` is the same as `deny(C)`, but also forbids changing the lint
2178    level afterwards,
2179 * `warn(C)` warns about violations of `C` but continues compilation.
2180
2181 The lint checks supported by the compiler can be found via `rustc -W help`,
2182 along with their default settings.  [Compiler
2183 plugins](book/plugins.html#lint-plugins) can provide additional lint checks.
2184
2185 ```{.ignore}
2186 mod m1 {
2187     // Missing documentation is ignored here
2188     #[allow(missing_docs)]
2189     pub fn undocumented_one() -> i32 { 1 }
2190
2191     // Missing documentation signals a warning here
2192     #[warn(missing_docs)]
2193     pub fn undocumented_too() -> i32 { 2 }
2194
2195     // Missing documentation signals an error here
2196     #[deny(missing_docs)]
2197     pub fn undocumented_end() -> i32 { 3 }
2198 }
2199 ```
2200
2201 This example shows how one can use `allow` and `warn` to toggle a particular
2202 check on and off:
2203
2204 ```{.ignore}
2205 #[warn(missing_docs)]
2206 mod m2{
2207     #[allow(missing_docs)]
2208     mod nested {
2209         // Missing documentation is ignored here
2210         pub fn undocumented_one() -> i32 { 1 }
2211
2212         // Missing documentation signals a warning here,
2213         // despite the allow above.
2214         #[warn(missing_docs)]
2215         pub fn undocumented_two() -> i32 { 2 }
2216     }
2217
2218     // Missing documentation signals a warning here
2219     pub fn undocumented_too() -> i32 { 3 }
2220 }
2221 ```
2222
2223 This example shows how one can use `forbid` to disallow uses of `allow` for
2224 that lint check:
2225
2226 ```{.ignore}
2227 #[forbid(missing_docs)]
2228 mod m3 {
2229     // Attempting to toggle warning signals an error here
2230     #[allow(missing_docs)]
2231     /// Returns 2.
2232     pub fn undocumented_too() -> i32 { 2 }
2233 }
2234 ```
2235
2236 ### Language items
2237
2238 Some primitive Rust operations are defined in Rust code, rather than being
2239 implemented directly in C or assembly language. The definitions of these
2240 operations have to be easy for the compiler to find. The `lang` attribute
2241 makes it possible to declare these operations. For example, the `str` module
2242 in the Rust standard library defines the string equality function:
2243
2244 ```{.ignore}
2245 #[lang="str_eq"]
2246 pub fn eq_slice(a: &str, b: &str) -> bool {
2247     // details elided
2248 }
2249 ```
2250
2251 The name `str_eq` has a special meaning to the Rust compiler, and the presence
2252 of this definition means that it will use this definition when generating calls
2253 to the string equality function.
2254
2255 A complete list of the built-in language items will be added in the future.
2256
2257 ### Inline attributes
2258
2259 The inline attribute is used to suggest to the compiler to perform an inline
2260 expansion and place a copy of the function or static in the caller rather than
2261 generating code to call the function or access the static where it is defined.
2262
2263 The compiler automatically inlines functions based on internal heuristics.
2264 Incorrectly inlining functions can actually making the program slower, so it
2265 should be used with care.
2266
2267 Immutable statics are always considered inlineable unless marked with
2268 `#[inline(never)]`. It is undefined whether two different inlineable statics
2269 have the same memory address. In other words, the compiler is free to collapse
2270 duplicate inlineable statics together.
2271
2272 `#[inline]` and `#[inline(always)]` always causes the function to be serialized
2273 into crate metadata to allow cross-crate inlining.
2274
2275 There are three different types of inline attributes:
2276
2277 * `#[inline]` hints the compiler to perform an inline expansion.
2278 * `#[inline(always)]` asks the compiler to always perform an inline expansion.
2279 * `#[inline(never)]` asks the compiler to never perform an inline expansion.
2280
2281 ### `derive`
2282
2283 The `derive` attribute allows certain traits to be automatically implemented
2284 for data structures. For example, the following will create an `impl` for the
2285 `PartialEq` and `Clone` traits for `Foo`, the type parameter `T` will be given
2286 the `PartialEq` or `Clone` constraints for the appropriate `impl`:
2287
2288 ```
2289 #[derive(PartialEq, Clone)]
2290 struct Foo<T> {
2291     a: i32,
2292     b: T
2293 }
2294 ```
2295
2296 The generated `impl` for `PartialEq` is equivalent to
2297
2298 ```
2299 # struct Foo<T> { a: i32, b: T }
2300 impl<T: PartialEq> PartialEq for Foo<T> {
2301     fn eq(&self, other: &Foo<T>) -> bool {
2302         self.a == other.a && self.b == other.b
2303     }
2304
2305     fn ne(&self, other: &Foo<T>) -> bool {
2306         self.a != other.a || self.b != other.b
2307     }
2308 }
2309 ```
2310
2311 ### Compiler Features
2312
2313 Certain aspects of Rust may be implemented in the compiler, but they're not
2314 necessarily ready for every-day use. These features are often of "prototype
2315 quality" or "almost production ready", but may not be stable enough to be
2316 considered a full-fledged language feature.
2317
2318 For this reason, Rust recognizes a special crate-level attribute of the form:
2319
2320 ```{.ignore}
2321 #![feature(feature1, feature2, feature3)]
2322 ```
2323
2324 This directive informs the compiler that the feature list: `feature1`,
2325 `feature2`, and `feature3` should all be enabled. This is only recognized at a
2326 crate-level, not at a module-level. Without this directive, all features are
2327 considered off, and using the features will result in a compiler error.
2328
2329 The currently implemented features of the reference compiler are:
2330
2331 * `advanced_slice_patterns` - See the [match expressions](#match-expressions)
2332                               section for discussion; the exact semantics of
2333                               slice patterns are subject to change, so some types
2334                               are still unstable.
2335
2336 * `slice_patterns` - OK, actually, slice patterns are just scary and
2337                      completely unstable.
2338
2339 * `asm` - The `asm!` macro provides a means for inline assembly. This is often
2340           useful, but the exact syntax for this feature along with its
2341           semantics are likely to change, so this macro usage must be opted
2342           into.
2343
2344 * `associated_types` - Allows type aliases in traits. Experimental.
2345
2346 * `box_patterns` - Allows `box` patterns, the exact semantics of which
2347                    is subject to change.
2348
2349 * `box_syntax` - Allows use of `box` expressions, the exact semantics of which
2350                  is subject to change.
2351
2352 * `concat_idents` - Allows use of the `concat_idents` macro, which is in many
2353                     ways insufficient for concatenating identifiers, and may be
2354                     removed entirely for something more wholesome.
2355
2356 * `custom_attribute` - Allows the usage of attributes unknown to the compiler
2357                        so that new attributes can be added in a backwards compatible
2358                        manner (RFC 572).
2359
2360 * `custom_derive` - Allows the use of `#[derive(Foo,Bar)]` as sugar for
2361                     `#[derive_Foo] #[derive_Bar]`, which can be user-defined syntax
2362                     extensions.
2363
2364 * `intrinsics` - Allows use of the "rust-intrinsics" ABI. Compiler intrinsics
2365                  are inherently unstable and no promise about them is made.
2366
2367 * `lang_items` - Allows use of the `#[lang]` attribute. Like `intrinsics`,
2368                  lang items are inherently unstable and no promise about them
2369                  is made.
2370
2371 * `link_args` - This attribute is used to specify custom flags to the linker,
2372                 but usage is strongly discouraged. The compiler's usage of the
2373                 system linker is not guaranteed to continue in the future, and
2374                 if the system linker is not used then specifying custom flags
2375                 doesn't have much meaning.
2376
2377 * `link_llvm_intrinsics` â€“ Allows linking to LLVM intrinsics via
2378                            `#[link_name="llvm.*"]`.
2379
2380 * `linkage` - Allows use of the `linkage` attribute, which is not portable.
2381
2382 * `log_syntax` - Allows use of the `log_syntax` macro attribute, which is a
2383                  nasty hack that will certainly be removed.
2384
2385 * `main` - Allows use of the `#[main]` attribute, which changes the entry point
2386            into a Rust program. This capability is subject to change.
2387
2388 * `macro_reexport` - Allows macros to be re-exported from one crate after being imported
2389                      from another. This feature was originally designed with the sole
2390                      use case of the Rust standard library in mind, and is subject to
2391                      change.
2392
2393 * `non_ascii_idents` - The compiler supports the use of non-ascii identifiers,
2394                        but the implementation is a little rough around the
2395                        edges, so this can be seen as an experimental feature
2396                        for now until the specification of identifiers is fully
2397                        fleshed out.
2398
2399 * `no_std` - Allows the `#![no_std]` crate attribute, which disables the implicit
2400              `extern crate std`. This typically requires use of the unstable APIs
2401              behind the libstd "facade", such as libcore and libcollections. It
2402              may also cause problems when using syntax extensions, including
2403              `#[derive]`.
2404
2405 * `on_unimplemented` - Allows the `#[rustc_on_unimplemented]` attribute, which allows
2406                        trait definitions to add specialized notes to error messages
2407                        when an implementation was expected but not found.
2408
2409 * `optin_builtin_traits` - Allows the definition of default and negative trait
2410                            implementations. Experimental.
2411
2412 * `plugin` - Usage of [compiler plugins][plugin] for custom lints or syntax extensions.
2413              These depend on compiler internals and are subject to change.
2414
2415 * `plugin_registrar` - Indicates that a crate provides [compiler plugins][plugin].
2416
2417 * `quote` - Allows use of the `quote_*!` family of macros, which are
2418             implemented very poorly and will likely change significantly
2419             with a proper implementation.
2420
2421 * `rustc_attrs` - Gates internal `#[rustc_*]` attributes which may be
2422                   for internal use only or have meaning added to them in the future.
2423
2424 * `rustc_diagnostic_macros`- A mysterious feature, used in the implementation
2425                              of rustc, not meant for mortals.
2426
2427 * `simd` - Allows use of the `#[simd]` attribute, which is overly simple and
2428            not the SIMD interface we want to expose in the long term.
2429
2430 * `simd_ffi` - Allows use of SIMD vectors in signatures for foreign functions.
2431                The SIMD interface is subject to change.
2432
2433 * `staged_api` - Allows usage of stability markers and `#![staged_api]` in a
2434                  crate. Stability markers are also attributes: `#[stable]`,
2435                  `#[unstable]`, and `#[deprecated]` are the three levels.
2436
2437 * `static_assert` - The `#[static_assert]` functionality is experimental and
2438                     unstable. The attribute can be attached to a `static` of
2439                     type `bool` and the compiler will error if the `bool` is
2440                     `false` at compile time. This version of this functionality
2441                     is unintuitive and suboptimal.
2442
2443 * `start` - Allows use of the `#[start]` attribute, which changes the entry point
2444             into a Rust program. This capability, especially the signature for the
2445             annotated function, is subject to change.
2446
2447 * `struct_inherit` - Allows using struct inheritance, which is barely
2448                      implemented and will probably be removed. Don't use this.
2449
2450 * `struct_variant` - Structural enum variants (those with named fields). It is
2451                      currently unknown whether this style of enum variant is as
2452                      fully supported as the tuple-forms, and it's not certain
2453                      that this style of variant should remain in the language.
2454                      For now this style of variant is hidden behind a feature
2455                      flag.
2456
2457 * `thread_local` - The usage of the `#[thread_local]` attribute is experimental
2458                    and should be seen as unstable. This attribute is used to
2459                    declare a `static` as being unique per-thread leveraging
2460                    LLVM's implementation which works in concert with the kernel
2461                    loader and dynamic linker. This is not necessarily available
2462                    on all platforms, and usage of it is discouraged.
2463
2464 * `trace_macros` - Allows use of the `trace_macros` macro, which is a nasty
2465                    hack that will certainly be removed.
2466
2467 * `unboxed_closures` - Rust's new closure design, which is currently a work in
2468                        progress feature with many known bugs.
2469
2470 * `unsafe_destructor` - Allows use of the `#[unsafe_destructor]` attribute,
2471                         which is considered wildly unsafe and will be
2472                         obsoleted by language improvements.
2473
2474 * `unsafe_no_drop_flag` - Allows use of the `#[unsafe_no_drop_flag]` attribute,
2475                           which removes hidden flag added to a type that
2476                           implements the `Drop` trait. The design for the
2477                           `Drop` flag is subject to change, and this feature
2478                           may be removed in the future.
2479
2480 * `unmarked_api` - Allows use of items within a `#![staged_api]` crate
2481                    which have not been marked with a stability marker.
2482                    Such items should not be allowed by the compiler to exist,
2483                    so if you need this there probably is a compiler bug.
2484
2485 * `visible_private_types` - Allows public APIs to expose otherwise private
2486                             types, e.g. as the return type of a public function.
2487                             This capability may be removed in the future.
2488
2489 * `allow_internal_unstable` - Allows `macro_rules!` macros to be tagged with the
2490                               `#[allow_internal_unstable]` attribute, designed
2491                               to allow `std` macros to call
2492                               `#[unstable]`/feature-gated functionality
2493                               internally without imposing on callers
2494                               (i.e. making them behave like function calls in
2495                               terms of encapsulation).
2496
2497 If a feature is promoted to a language feature, then all existing programs will
2498 start to receive compilation warnings about #[feature] directives which enabled
2499 the new feature (because the directive is no longer necessary). However, if a
2500 feature is decided to be removed from the language, errors will be issued (if
2501 there isn't a parser error first). The directive in this case is no longer
2502 necessary, and it's likely that existing code will break if the feature isn't
2503 removed.
2504
2505 If an unknown feature is found in a directive, it results in a compiler error.
2506 An unknown feature is one which has never been recognized by the compiler.
2507
2508 # Statements and expressions
2509
2510 Rust is _primarily_ an expression language. This means that most forms of
2511 value-producing or effect-causing evaluation are directed by the uniform syntax
2512 category of _expressions_. Each kind of expression can typically _nest_ within
2513 each other kind of expression, and rules for evaluation of expressions involve
2514 specifying both the value produced by the expression and the order in which its
2515 sub-expressions are themselves evaluated.
2516
2517 In contrast, statements in Rust serve _mostly_ to contain and explicitly
2518 sequence expression evaluation.
2519
2520 ## Statements
2521
2522 A _statement_ is a component of a block, which is in turn a component of an
2523 outer [expression](#expressions) or [function](#functions).
2524
2525 Rust has two kinds of statement: [declaration
2526 statements](#declaration-statements) and [expression
2527 statements](#expression-statements).
2528
2529 ### Declaration statements
2530
2531 A _declaration statement_ is one that introduces one or more *names* into the
2532 enclosing statement block. The declared names may denote new variables or new
2533 items.
2534
2535 #### Item declarations
2536
2537 An _item declaration statement_ has a syntactic form identical to an
2538 [item](#items) declaration within a module. Declaring an item &mdash; a
2539 function, enumeration, structure, type, static, trait, implementation or module
2540 &mdash; locally within a statement block is simply a way of restricting its
2541 scope to a narrow region containing all of its uses; it is otherwise identical
2542 in meaning to declaring the item outside the statement block.
2543
2544 > **Note**: there is no implicit capture of the function's dynamic environment when
2545 > declaring a function-local item.
2546
2547 #### Variable declarations
2548
2549 ```{.ebnf .gram}
2550 let_decl : "let" pat [':' type ] ? [ init ] ? ';' ;
2551 init : [ '=' ] expr ;
2552 ```
2553
2554 A _variable declaration_ introduces a new set of variable, given by a pattern. The
2555 pattern may be followed by a type annotation, and/or an initializer expression.
2556 When no type annotation is given, the compiler will infer the type, or signal
2557 an error if insufficient type information is available for definite inference.
2558 Any variables introduced by a variable declaration are visible from the point of
2559 declaration until the end of the enclosing block scope.
2560
2561 ### Expression statements
2562
2563 An _expression statement_ is one that evaluates an [expression](#expressions)
2564 and ignores its result. The type of an expression statement `e;` is always
2565 `()`, regardless of the type of `e`. As a rule, an expression statement's
2566 purpose is to trigger the effects of evaluating its expression.
2567
2568 ## Expressions
2569
2570 An expression may have two roles: it always produces a *value*, and it may have
2571 *effects* (otherwise known as "side effects"). An expression *evaluates to* a
2572 value, and has effects during *evaluation*. Many expressions contain
2573 sub-expressions (operands). The meaning of each kind of expression dictates
2574 several things:
2575
2576 * Whether or not to evaluate the sub-expressions when evaluating the expression
2577 * The order in which to evaluate the sub-expressions
2578 * How to combine the sub-expressions' values to obtain the value of the expression
2579
2580 In this way, the structure of expressions dictates the structure of execution.
2581 Blocks are just another kind of expression, so blocks, statements, expressions,
2582 and blocks again can recursively nest inside each other to an arbitrary depth.
2583
2584 #### Lvalues, rvalues and temporaries
2585
2586 Expressions are divided into two main categories: _lvalues_ and _rvalues_.
2587 Likewise within each expression, sub-expressions may occur in _lvalue context_
2588 or _rvalue context_. The evaluation of an expression depends both on its own
2589 category and the context it occurs within.
2590
2591 An lvalue is an expression that represents a memory location. These expressions
2592 are [paths](#path-expressions) (which refer to local variables, function and
2593 method arguments, or static variables), dereferences (`*expr`), [indexing
2594 expressions](#index-expressions) (`expr[expr]`), and [field
2595 references](#field-expressions) (`expr.f`). All other expressions are rvalues.
2596
2597 The left operand of an [assignment](#assignment-expressions) or
2598 [compound-assignment](#compound-assignment-expressions) expression is an lvalue
2599 context, as is the single operand of a unary
2600 [borrow](#unary-operator-expressions). All other expression contexts are
2601 rvalue contexts.
2602
2603 When an lvalue is evaluated in an _lvalue context_, it denotes a memory
2604 location; when evaluated in an _rvalue context_, it denotes the value held _in_
2605 that memory location.
2606
2607 When an rvalue is used in an lvalue context, a temporary un-named lvalue is
2608 created and used instead. A temporary's lifetime equals the largest lifetime
2609 of any reference that points to it.
2610
2611 #### Moved and copied types
2612
2613 When a [local variable](#variables) is used as an
2614 [rvalue](#lvalues,-rvalues-and-temporaries) the variable will either be moved
2615 or copied, depending on its type. All values whose type implements `Copy` are
2616 copied, all others are moved.
2617
2618 ### Literal expressions
2619
2620 A _literal expression_ consists of one of the [literal](#literals) forms
2621 described earlier. It directly describes a number, character, string, boolean
2622 value, or the unit value.
2623
2624 ```{.literals}
2625 ();        // unit type
2626 "hello";   // string type
2627 '5';       // character type
2628 5;         // integer type
2629 ```
2630
2631 ### Path expressions
2632
2633 A [path](#paths) used as an expression context denotes either a local variable
2634 or an item. Path expressions are [lvalues](#lvalues,-rvalues-and-temporaries).
2635
2636 ### Tuple expressions
2637
2638 Tuples are written by enclosing zero or more comma-separated expressions in
2639 parentheses. They are used to create [tuple-typed](#tuple-types) values.
2640
2641 ```{.tuple}
2642 (0,);
2643 (0.0, 4.5);
2644 ("a", 4us, true);
2645 ```
2646
2647 ### Unit expressions
2648
2649 The expression `()` denotes the _unit value_, the only value of the type with
2650 the same name.
2651
2652 ### Structure expressions
2653
2654 ```{.ebnf .gram}
2655 struct_expr : expr_path '{' ident ':' expr
2656                       [ ',' ident ':' expr ] *
2657                       [ ".." expr ] '}' |
2658               expr_path '(' expr
2659                       [ ',' expr ] * ')' |
2660               expr_path ;
2661 ```
2662
2663 There are several forms of structure expressions. A _structure expression_
2664 consists of the [path](#paths) of a [structure item](#structures), followed by
2665 a brace-enclosed list of one or more comma-separated name-value pairs,
2666 providing the field values of a new instance of the structure. A field name
2667 can be any identifier, and is separated from its value expression by a colon.
2668 The location denoted by a structure field is mutable if and only if the
2669 enclosing structure is mutable.
2670
2671 A _tuple structure expression_ consists of the [path](#paths) of a [structure
2672 item](#structures), followed by a parenthesized list of one or more
2673 comma-separated expressions (in other words, the path of a structure item
2674 followed by a tuple expression). The structure item must be a tuple structure
2675 item.
2676
2677 A _unit-like structure expression_ consists only of the [path](#paths) of a
2678 [structure item](#structures).
2679
2680 The following are examples of structure expressions:
2681
2682 ```
2683 # struct Point { x: f64, y: f64 }
2684 # struct TuplePoint(f64, f64);
2685 # mod game { pub struct User<'a> { pub name: &'a str, pub age: u32, pub score: usize } }
2686 # struct Cookie; fn some_fn<T>(t: T) {}
2687 Point {x: 10.0, y: 20.0};
2688 TuplePoint(10.0, 20.0);
2689 let u = game::User {name: "Joe", age: 35, score: 100_000};
2690 some_fn::<Cookie>(Cookie);
2691 ```
2692
2693 A structure expression forms a new value of the named structure type. Note
2694 that for a given *unit-like* structure type, this will always be the same
2695 value.
2696
2697 A structure expression can terminate with the syntax `..` followed by an
2698 expression to denote a functional update. The expression following `..` (the
2699 base) must have the same structure type as the new structure type being formed.
2700 The entire expression denotes the result of constructing a new structure (with
2701 the same type as the base expression) with the given values for the fields that
2702 were explicitly specified and the values in the base expression for all other
2703 fields.
2704
2705 ```
2706 # struct Point3d { x: i32, y: i32, z: i32 }
2707 let base = Point3d {x: 1, y: 2, z: 3};
2708 Point3d {y: 0, z: 10, .. base};
2709 ```
2710
2711 ### Block expressions
2712
2713 ```{.ebnf .gram}
2714 block_expr : '{' [ stmt ';' | item ] *
2715                  [ expr ] '}' ;
2716 ```
2717
2718 A _block expression_ is similar to a module in terms of the declarations that
2719 are possible. Each block conceptually introduces a new namespace scope. Use
2720 items can bring new names into scopes and declared items are in scope for only
2721 the block itself.
2722
2723 A block will execute each statement sequentially, and then execute the
2724 expression (if given). If the block ends in a statement, its value is `()`:
2725
2726 ```
2727 let x: () = { println!("Hello."); };
2728 ```
2729
2730 If it ends in an expression, its value and type are that of the expression:
2731
2732 ```
2733 let x: i32 = { println!("Hello."); 5 };
2734
2735 assert_eq!(5, x);
2736 ```
2737
2738 ### Method-call expressions
2739
2740 ```{.ebnf .gram}
2741 method_call_expr : expr '.' ident paren_expr_list ;
2742 ```
2743
2744 A _method call_ consists of an expression followed by a single dot, an
2745 identifier, and a parenthesized expression-list. Method calls are resolved to
2746 methods on specific traits, either statically dispatching to a method if the
2747 exact `self`-type of the left-hand-side is known, or dynamically dispatching if
2748 the left-hand-side expression is an indirect [object type](#object-types).
2749
2750 ### Field expressions
2751
2752 ```{.ebnf .gram}
2753 field_expr : expr '.' ident ;
2754 ```
2755
2756 A _field expression_ consists of an expression followed by a single dot and an
2757 identifier, when not immediately followed by a parenthesized expression-list
2758 (the latter is a [method call expression](#method-call-expressions)). A field
2759 expression denotes a field of a [structure](#structure-types).
2760
2761 ```{.ignore .field}
2762 mystruct.myfield;
2763 foo().x;
2764 (Struct {a: 10, b: 20}).a;
2765 ```
2766
2767 A field access is an [lvalue](#lvalues,-rvalues-and-temporaries) referring to
2768 the value of that field. When the type providing the field inherits mutability,
2769 it can be [assigned](#assignment-expressions) to.
2770
2771 Also, if the type of the expression to the left of the dot is a pointer, it is
2772 automatically dereferenced to make the field access possible.
2773
2774 ### Array expressions
2775
2776 ```{.ebnf .gram}
2777 array_expr : '[' "mut" ? array_elems? ']' ;
2778
2779 array_elems : [expr [',' expr]*] | [expr ';' expr] ;
2780 ```
2781
2782 An [array](#array,-and-slice-types) _expression_ is written by enclosing zero
2783 or more comma-separated expressions of uniform type in square brackets.
2784
2785 In the `[expr ';' expr]` form, the expression after the `';'` must be a
2786 constant expression that can be evaluated at compile time, such as a
2787 [literal](#literals) or a [static item](#static-items).
2788
2789 ```
2790 [1, 2, 3, 4];
2791 ["a", "b", "c", "d"];
2792 [0; 128];              // array with 128 zeros
2793 [0u8, 0u8, 0u8, 0u8];
2794 ```
2795
2796 ### Index expressions
2797
2798 ```{.ebnf .gram}
2799 idx_expr : expr '[' expr ']' ;
2800 ```
2801
2802 [Array](#array,-and-slice-types)-typed expressions can be indexed by
2803 writing a square-bracket-enclosed expression (the index) after them. When the
2804 array is mutable, the resulting [lvalue](#lvalues,-rvalues-and-temporaries) can
2805 be assigned to.
2806
2807 Indices are zero-based, and may be of any integral type. Vector access is
2808 bounds-checked at run-time. When the check fails, it will put the thread in a
2809 _panicked state_.
2810
2811 ```{should-fail}
2812 ([1, 2, 3, 4])[0];
2813 (["a", "b"])[10]; // panics
2814 ```
2815
2816 ### Unary operator expressions
2817
2818 Rust defines three unary operators. They are all written as prefix operators,
2819 before the expression they apply to.
2820
2821 * `-`
2822   : Negation. May only be applied to numeric types.
2823 * `*`
2824   : Dereference. When applied to a [pointer](#pointer-types) it denotes the
2825     pointed-to location. For pointers to mutable locations, the resulting
2826     [lvalue](#lvalues,-rvalues-and-temporaries) can be assigned to.
2827     On non-pointer types, it calls the `deref` method of the `std::ops::Deref`
2828     trait, or the `deref_mut` method of the `std::ops::DerefMut` trait (if
2829     implemented by the type and required for an outer expression that will or
2830     could mutate the dereference), and produces the result of dereferencing the
2831     `&` or `&mut` borrowed pointer returned from the overload method.
2832
2833 * `!`
2834   : Logical negation. On the boolean type, this flips between `true` and
2835     `false`. On integer types, this inverts the individual bits in the
2836     two's complement representation of the value.
2837
2838 ### Binary operator expressions
2839
2840 ```{.ebnf .gram}
2841 binop_expr : expr binop expr ;
2842 ```
2843
2844 Binary operators expressions are given in terms of [operator
2845 precedence](#operator-precedence).
2846
2847 #### Arithmetic operators
2848
2849 Binary arithmetic expressions are syntactic sugar for calls to built-in traits,
2850 defined in the `std::ops` module of the `std` library. This means that
2851 arithmetic operators can be overridden for user-defined types. The default
2852 meaning of the operators on standard types is given here.
2853
2854 * `+`
2855   : Addition and array/string concatenation.
2856     Calls the `add` method on the `std::ops::Add` trait.
2857 * `-`
2858   : Subtraction.
2859     Calls the `sub` method on the `std::ops::Sub` trait.
2860 * `*`
2861   : Multiplication.
2862     Calls the `mul` method on the `std::ops::Mul` trait.
2863 * `/`
2864   : Quotient.
2865     Calls the `div` method on the `std::ops::Div` trait.
2866 * `%`
2867   : Remainder.
2868     Calls the `rem` method on the `std::ops::Rem` trait.
2869
2870 #### Bitwise operators
2871
2872 Like the [arithmetic operators](#arithmetic-operators), bitwise operators are
2873 syntactic sugar for calls to methods of built-in traits. This means that
2874 bitwise operators can be overridden for user-defined types. The default
2875 meaning of the operators on standard types is given here.
2876
2877 * `&`
2878   : And.
2879     Calls the `bitand` method of the `std::ops::BitAnd` trait.
2880 * `|`
2881   : Inclusive or.
2882     Calls the `bitor` method of the `std::ops::BitOr` trait.
2883 * `^`
2884   : Exclusive or.
2885     Calls the `bitxor` method of the `std::ops::BitXor` trait.
2886 * `<<`
2887   : Left shift.
2888     Calls the `shl` method of the `std::ops::Shl` trait.
2889 * `>>`
2890   : Right shift.
2891     Calls the `shr` method of the `std::ops::Shr` trait.
2892
2893 #### Lazy boolean operators
2894
2895 The operators `||` and `&&` may be applied to operands of boolean type. The
2896 `||` operator denotes logical 'or', and the `&&` operator denotes logical
2897 'and'. They differ from `|` and `&` in that the right-hand operand is only
2898 evaluated when the left-hand operand does not already determine the result of
2899 the expression. That is, `||` only evaluates its right-hand operand when the
2900 left-hand operand evaluates to `false`, and `&&` only when it evaluates to
2901 `true`.
2902
2903 #### Comparison operators
2904
2905 Comparison operators are, like the [arithmetic
2906 operators](#arithmetic-operators), and [bitwise operators](#bitwise-operators),
2907 syntactic sugar for calls to built-in traits. This means that comparison
2908 operators can be overridden for user-defined types. The default meaning of the
2909 operators on standard types is given here.
2910
2911 * `==`
2912   : Equal to.
2913     Calls the `eq` method on the `std::cmp::PartialEq` trait.
2914 * `!=`
2915   : Unequal to.
2916     Calls the `ne` method on the `std::cmp::PartialEq` trait.
2917 * `<`
2918   : Less than.
2919     Calls the `lt` method on the `std::cmp::PartialOrd` trait.
2920 * `>`
2921   : Greater than.
2922     Calls the `gt` method on the `std::cmp::PartialOrd` trait.
2923 * `<=`
2924   : Less than or equal.
2925     Calls the `le` method on the `std::cmp::PartialOrd` trait.
2926 * `>=`
2927   : Greater than or equal.
2928     Calls the `ge` method on the `std::cmp::PartialOrd` trait.
2929
2930 #### Type cast expressions
2931
2932 A type cast expression is denoted with the binary operator `as`.
2933
2934 Executing an `as` expression casts the value on the left-hand side to the type
2935 on the right-hand side.
2936
2937 An example of an `as` expression:
2938
2939 ```
2940 # fn sum(v: &[f64]) -> f64 { 0.0 }
2941 # fn len(v: &[f64]) -> i32 { 0 }
2942
2943 fn avg(v: &[f64]) -> f64 {
2944   let sum: f64 = sum(v);
2945   let sz: f64 = len(v) as f64;
2946   return sum / sz;
2947 }
2948 ```
2949
2950 #### Assignment expressions
2951
2952 An _assignment expression_ consists of an
2953 [lvalue](#lvalues,-rvalues-and-temporaries) expression followed by an equals
2954 sign (`=`) and an [rvalue](#lvalues,-rvalues-and-temporaries) expression.
2955
2956 Evaluating an assignment expression [either copies or
2957 moves](#moved-and-copied-types) its right-hand operand to its left-hand
2958 operand.
2959
2960 ```
2961 # let mut x = 0;
2962 # let y = 0;
2963
2964 x = y;
2965 ```
2966
2967 #### Compound assignment expressions
2968
2969 The `+`, `-`, `*`, `/`, `%`, `&`, `|`, `^`, `<<`, and `>>` operators may be
2970 composed with the `=` operator. The expression `lval OP= val` is equivalent to
2971 `lval = lval OP val`. For example, `x = x + 1` may be written as `x += 1`.
2972
2973 Any such expression always has the [`unit`](#primitive-types) type.
2974
2975 #### Operator precedence
2976
2977 The precedence of Rust binary operators is ordered as follows, going from
2978 strong to weak:
2979
2980 ```{.text .precedence}
2981 as
2982 * / %
2983 + -
2984 << >>
2985 &
2986 ^
2987 |
2988 == != < > <= >=
2989 &&
2990 ||
2991 = ..
2992 ```
2993
2994 Operators at the same precedence level are evaluated left-to-right. [Unary
2995 operators](#unary-operator-expressions) have the same precedence level and are
2996 stronger than any of the binary operators.
2997
2998 ### Grouped expressions
2999
3000 An expression enclosed in parentheses evaluates to the result of the enclosed
3001 expression. Parentheses can be used to explicitly specify evaluation order
3002 within an expression.
3003
3004 ```{.ebnf .gram}
3005 paren_expr : '(' expr ')' ;
3006 ```
3007
3008 An example of a parenthesized expression:
3009
3010 ```
3011 let x: i32 = (2 + 3) * 4;
3012 ```
3013
3014
3015 ### Call expressions
3016
3017 ```{.ebnf .gram}
3018 expr_list : [ expr [ ',' expr ]* ] ? ;
3019 paren_expr_list : '(' expr_list ')' ;
3020 call_expr : expr paren_expr_list ;
3021 ```
3022
3023 A _call expression_ invokes a function, providing zero or more input variables
3024 and an optional location to move the function's output into. If the function
3025 eventually returns, then the expression completes.
3026
3027 Some examples of call expressions:
3028
3029 ```
3030 # fn add(x: i32, y: i32) -> i32 { 0 }
3031
3032 let x: i32 = add(1i32, 2i32);
3033 let pi: Result<f32, _> = "3.14".parse();
3034 ```
3035
3036 ### Lambda expressions
3037
3038 ```{.ebnf .gram}
3039 ident_list : [ ident [ ',' ident ]* ] ? ;
3040 lambda_expr : '|' ident_list '|' expr ;
3041 ```
3042
3043 A _lambda expression_ (sometimes called an "anonymous function expression")
3044 defines a function and denotes it as a value, in a single expression. A lambda
3045 expression is a pipe-symbol-delimited (`|`) list of identifiers followed by an
3046 expression.
3047
3048 A lambda expression denotes a function that maps a list of parameters
3049 (`ident_list`) onto the expression that follows the `ident_list`. The
3050 identifiers in the `ident_list` are the parameters to the function. These
3051 parameters' types need not be specified, as the compiler infers them from
3052 context.
3053
3054 Lambda expressions are most useful when passing functions as arguments to other
3055 functions, as an abbreviation for defining and capturing a separate function.
3056
3057 Significantly, lambda expressions _capture their environment_, which regular
3058 [function definitions](#functions) do not. The exact type of capture depends
3059 on the [function type](#function-types) inferred for the lambda expression. In
3060 the simplest and least-expensive form (analogous to a ```|| { }``` expression),
3061 the lambda expression captures its environment by reference, effectively
3062 borrowing pointers to all outer variables mentioned inside the function.
3063 Alternately, the compiler may infer that a lambda expression should copy or
3064 move values (depending on their type) from the environment into the lambda
3065 expression's captured environment.
3066
3067 In this example, we define a function `ten_times` that takes a higher-order
3068 function argument, and call it with a lambda expression as an argument:
3069
3070 ```
3071 fn ten_times<F>(f: F) where F: Fn(i32) {
3072     let mut i = 0i32;
3073     while i < 10 {
3074         f(i);
3075         i += 1;
3076     }
3077 }
3078
3079 ten_times(|j| println!("hello, {}", j));
3080 ```
3081
3082 ### While loops
3083
3084 ```{.ebnf .gram}
3085 while_expr : [ lifetime ':' ] "while" no_struct_literal_expr '{' block '}' ;
3086 ```
3087
3088 A `while` loop begins by evaluating the boolean loop conditional expression.
3089 If the loop conditional expression evaluates to `true`, the loop body block
3090 executes and control returns to the loop conditional expression. If the loop
3091 conditional expression evaluates to `false`, the `while` expression completes.
3092
3093 An example:
3094
3095 ```
3096 let mut i = 0;
3097
3098 while i < 10 {
3099     println!("hello");
3100     i = i + 1;
3101 }
3102 ```
3103
3104 ### Infinite loops
3105
3106 A `loop` expression denotes an infinite loop.
3107
3108 ```{.ebnf .gram}
3109 loop_expr : [ lifetime ':' ] "loop" '{' block '}';
3110 ```
3111
3112 A `loop` expression may optionally have a _label_. If a label is present, then
3113 labeled `break` and `continue` expressions nested within this loop may exit out
3114 of this loop or return control to its head. See [Break
3115 expressions](#break-expressions) and [Continue
3116 expressions](#continue-expressions).
3117
3118 ### Break expressions
3119
3120 ```{.ebnf .gram}
3121 break_expr : "break" [ lifetime ];
3122 ```
3123
3124 A `break` expression has an optional _label_. If the label is absent, then
3125 executing a `break` expression immediately terminates the innermost loop
3126 enclosing it. It is only permitted in the body of a loop. If the label is
3127 present, then `break foo` terminates the loop with label `foo`, which need not
3128 be the innermost label enclosing the `break` expression, but must enclose it.
3129
3130 ### Continue expressions
3131
3132 ```{.ebnf .gram}
3133 continue_expr : "continue" [ lifetime ];
3134 ```
3135
3136 A `continue` expression has an optional _label_. If the label is absent, then
3137 executing a `continue` expression immediately terminates the current iteration
3138 of the innermost loop enclosing it, returning control to the loop *head*. In
3139 the case of a `while` loop, the head is the conditional expression controlling
3140 the loop. In the case of a `for` loop, the head is the call-expression
3141 controlling the loop. If the label is present, then `continue foo` returns
3142 control to the head of the loop with label `foo`, which need not be the
3143 innermost label enclosing the `break` expression, but must enclose it.
3144
3145 A `continue` expression is only permitted in the body of a loop.
3146
3147 ### For expressions
3148
3149 ```{.ebnf .gram}
3150 for_expr : [ lifetime ':' ] "for" pat "in" no_struct_literal_expr '{' block '}' ;
3151 ```
3152
3153 A `for` expression is a syntactic construct for looping over elements provided
3154 by an implementation of `std::iter::Iterator`.
3155
3156 An example of a for loop over the contents of an array:
3157
3158 ```
3159 # type Foo = i32;
3160 # fn bar(f: Foo) { }
3161 # let a = 0;
3162 # let b = 0;
3163 # let c = 0;
3164
3165 let v: &[Foo] = &[a, b, c];
3166
3167 for e in v.iter() {
3168     bar(*e);
3169 }
3170 ```
3171
3172 An example of a for loop over a series of integers:
3173
3174 ```
3175 # fn bar(b:usize) { }
3176 for i in 0..256 {
3177     bar(i);
3178 }
3179 ```
3180
3181 ### If expressions
3182
3183 ```{.ebnf .gram}
3184 if_expr : "if" no_struct_literal_expr '{' block '}'
3185           else_tail ? ;
3186
3187 else_tail : "else" [ if_expr | if_let_expr
3188                    | '{' block '}' ] ;
3189 ```
3190
3191 An `if` expression is a conditional branch in program control. The form of an
3192 `if` expression is a condition expression, followed by a consequent block, any
3193 number of `else if` conditions and blocks, and an optional trailing `else`
3194 block. The condition expressions must have type `bool`. If a condition
3195 expression evaluates to `true`, the consequent block is executed and any
3196 subsequent `else if` or `else` block is skipped. If a condition expression
3197 evaluates to `false`, the consequent block is skipped and any subsequent `else
3198 if` condition is evaluated. If all `if` and `else if` conditions evaluate to
3199 `false` then any `else` block is executed.
3200
3201 ### Match expressions
3202
3203 ```{.ebnf .gram}
3204 match_expr : "match" no_struct_literal_expr '{' match_arm * '}' ;
3205
3206 match_arm : attribute * match_pat "=>" [ expr "," | '{' block '}' ] ;
3207
3208 match_pat : pat [ '|' pat ] * [ "if" expr ] ? ;
3209 ```
3210
3211 A `match` expression branches on a *pattern*. The exact form of matching that
3212 occurs depends on the pattern. Patterns consist of some combination of
3213 literals, destructured arrays or enum constructors, structures and tuples,
3214 variable binding specifications, wildcards (`..`), and placeholders (`_`). A
3215 `match` expression has a *head expression*, which is the value to compare to
3216 the patterns. The type of the patterns must equal the type of the head
3217 expression.
3218
3219 In a pattern whose head expression has an `enum` type, a placeholder (`_`)
3220 stands for a *single* data field, whereas a wildcard `..` stands for *all* the
3221 fields of a particular variant.
3222
3223 A `match` behaves differently depending on whether or not the head expression
3224 is an [lvalue or an rvalue](#lvalues,-rvalues-and-temporaries). If the head
3225 expression is an rvalue, it is first evaluated into a temporary location, and
3226 the resulting value is sequentially compared to the patterns in the arms until
3227 a match is found. The first arm with a matching pattern is chosen as the branch
3228 target of the `match`, any variables bound by the pattern are assigned to local
3229 variables in the arm's block, and control enters the block.
3230
3231 When the head expression is an lvalue, the match does not allocate a temporary
3232 location (however, a by-value binding may copy or move from the lvalue). When
3233 possible, it is preferable to match on lvalues, as the lifetime of these
3234 matches inherits the lifetime of the lvalue, rather than being restricted to
3235 the inside of the match.
3236
3237 An example of a `match` expression:
3238
3239 ```
3240 let x = 1;
3241
3242 match x {
3243     1 => println!("one"),
3244     2 => println!("two"),
3245     3 => println!("three"),
3246     4 => println!("four"),
3247     5 => println!("five"),
3248     _ => println!("something else"),
3249 }
3250 ```
3251
3252 Patterns that bind variables default to binding to a copy or move of the
3253 matched value (depending on the matched value's type). This can be changed to
3254 bind to a reference by using the `ref` keyword, or to a mutable reference using
3255 `ref mut`.
3256
3257 Subpatterns can also be bound to variables by the use of the syntax `variable @
3258 subpattern`. For example:
3259
3260 ```
3261 let x = 1;
3262
3263 match x {
3264     e @ 1 ... 5 => println!("got a range element {}", e),
3265     _ => println!("anything"),
3266 }
3267 ```
3268
3269 Patterns can also dereference pointers by using the `&`, `&mut` and `box`
3270 symbols, as appropriate. For example, these two matches on `x: &i32` are
3271 equivalent:
3272
3273 ```
3274 # let x = &3;
3275 let y = match *x { 0 => "zero", _ => "some" };
3276 let z = match x { &0 => "zero", _ => "some" };
3277
3278 assert_eq!(y, z);
3279 ```
3280
3281 A pattern that's just an identifier, like `Nil` in the previous example, could
3282 either refer to an enum variant that's in scope, or bind a new variable. The
3283 compiler resolves this ambiguity by forbidding variable bindings that occur in
3284 `match` patterns from shadowing names of variants that are in scope. For
3285 example, wherever `List` is in scope, a `match` pattern would not be able to
3286 bind `Nil` as a new name. The compiler interprets a variable pattern `x` as a
3287 binding _only_ if there is no variant named `x` in scope. A convention you can
3288 use to avoid conflicts is simply to name variants with upper-case letters, and
3289 local variables with lower-case letters.
3290
3291 Multiple match patterns may be joined with the `|` operator. A range of values
3292 may be specified with `...`. For example:
3293
3294 ```
3295 # let x = 2;
3296
3297 let message = match x {
3298   0 | 1  => "not many",
3299   2 ... 9 => "a few",
3300   _      => "lots"
3301 };
3302 ```
3303
3304 Range patterns only work on scalar types (like integers and characters; not
3305 like arrays and structs, which have sub-components). A range pattern may not
3306 be a sub-range of another range pattern inside the same `match`.
3307
3308 Finally, match patterns can accept *pattern guards* to further refine the
3309 criteria for matching a case. Pattern guards appear after the pattern and
3310 consist of a bool-typed expression following the `if` keyword. A pattern guard
3311 may refer to the variables bound within the pattern they follow.
3312
3313 ```
3314 # let maybe_digit = Some(0);
3315 # fn process_digit(i: i32) { }
3316 # fn process_other(i: i32) { }
3317
3318 let message = match maybe_digit {
3319   Some(x) if x < 10 => process_digit(x),
3320   Some(x) => process_other(x),
3321   None => panic!()
3322 };
3323 ```
3324
3325 ### If let expressions
3326
3327 ```{.ebnf .gram}
3328 if_let_expr : "if" "let" pat '=' expr '{' block '}'
3329                else_tail ? ;
3330 else_tail : "else" [ if_expr | if_let_expr | '{' block '}' ] ;
3331 ```
3332
3333 An `if let` expression is semantically identical to an `if` expression but in place
3334 of a condition expression it expects a refutable let statement. If the value of the
3335 expression on the right hand side of the let statement matches the pattern, the corresponding
3336 block will execute, otherwise flow proceeds to the first `else` block that follows.
3337
3338 ### While let loops
3339
3340 ```{.ebnf .gram}
3341 while_let_expr : "while" "let" pat '=' expr '{' block '}' ;
3342 ```
3343
3344 A `while let` loop is semantically identical to a `while` loop but in place of a
3345 condition expression it expects a refutable let statement. If the value of the
3346 expression on the right hand side of the let statement matches the pattern, the
3347 loop body block executes and control returns to the pattern matching statement.
3348 Otherwise, the while expression completes.
3349
3350 ### Return expressions
3351
3352 ```{.ebnf .gram}
3353 return_expr : "return" expr ? ;
3354 ```
3355
3356 Return expressions are denoted with the keyword `return`. Evaluating a `return`
3357 expression moves its argument into the designated output location for the
3358 current function call, destroys the current function activation frame, and
3359 transfers control to the caller frame.
3360
3361 An example of a `return` expression:
3362
3363 ```
3364 fn max(a: i32, b: i32) -> i32 {
3365    if a > b {
3366       return a;
3367    }
3368    return b;
3369 }
3370 ```
3371
3372 # Type system
3373
3374 ## Types
3375
3376 Every variable, item and value in a Rust program has a type. The _type_ of a
3377 *value* defines the interpretation of the memory holding it.
3378
3379 Built-in types and type-constructors are tightly integrated into the language,
3380 in nontrivial ways that are not possible to emulate in user-defined types.
3381 User-defined types have limited capabilities.
3382
3383 ### Primitive types
3384
3385 The primitive types are the following:
3386
3387 * The "unit" type `()`, having the single "unit" value `()` (occasionally called
3388   "nil"). [^unittype]
3389 * The boolean type `bool` with values `true` and `false`.
3390 * The machine types.
3391 * The machine-dependent integer and floating-point types.
3392
3393 [^unittype]: The "unit" value `()` is *not* a sentinel "null pointer" value for
3394     reference variables; the "unit" type is the implicit return type from functions
3395     otherwise lacking a return type, and can be used in other contexts (such as
3396     message-sending or type-parametric code) as a zero-size type.]
3397
3398 #### Machine types
3399
3400 The machine types are the following:
3401
3402 * The unsigned word types `u8`, `u16`, `u32` and `u64`, with values drawn from
3403   the integer intervals [0, 2^8 - 1], [0, 2^16 - 1], [0, 2^32 - 1] and
3404   [0, 2^64 - 1] respectively.
3405
3406 * The signed two's complement word types `i8`, `i16`, `i32` and `i64`, with
3407   values drawn from the integer intervals [-(2^(7)), 2^7 - 1],
3408   [-(2^(15)), 2^15 - 1], [-(2^(31)), 2^31 - 1], [-(2^(63)), 2^63 - 1]
3409   respectively.
3410
3411 * The IEEE 754-2008 `binary32` and `binary64` floating-point types: `f32` and
3412   `f64`, respectively.
3413
3414 #### Machine-dependent integer types
3415
3416 The `usize` type is an unsigned integer type with the same number of bits as the
3417 platform's pointer type. It can represent every memory address in the process.
3418
3419 The `isize` type is a signed integer type with the same number of bits as the
3420 platform's pointer type. The theoretical upper bound on object and array size
3421 is the maximum `isize` value. This ensures that `isize` can be used to calculate
3422 differences between pointers into an object or array and can address every byte
3423 within an object along with one byte past the end.
3424
3425 ### Textual types
3426
3427 The types `char` and `str` hold textual data.
3428
3429 A value of type `char` is a [Unicode scalar value](
3430 http://www.unicode.org/glossary/#unicode_scalar_value) (i.e. a code point that
3431 is not a surrogate), represented as a 32-bit unsigned word in the 0x0000 to
3432 0xD7FF or 0xE000 to 0x10FFFF range. A `[char]` array is effectively an UCS-4 /
3433 UTF-32 string.
3434
3435 A value of type `str` is a Unicode string, represented as an array of 8-bit
3436 unsigned bytes holding a sequence of UTF-8 codepoints. Since `str` is of
3437 unknown size, it is not a _first-class_ type, but can only be instantiated
3438 through a pointer type, such as `&str` or `String`.
3439
3440 ### Tuple types
3441
3442 A tuple *type* is a heterogeneous product of other types, called the *elements*
3443 of the tuple. It has no nominal name and is instead structurally typed.
3444
3445 Tuple types and values are denoted by listing the types or values of their
3446 elements, respectively, in a parenthesized, comma-separated list.
3447
3448 Because tuple elements don't have a name, they can only be accessed by
3449 pattern-matching or by using `N` directly as a field to access the
3450 `N`th element.
3451
3452 An example of a tuple type and its use:
3453
3454 ```
3455 type Pair<'a> = (i32, &'a str);
3456 let p: Pair<'static> = (10, "hello");
3457 let (a, b) = p;
3458 assert!(b != "world");
3459 assert!(p.0 == 10);
3460 ```
3461
3462 ### Array, and Slice types
3463
3464 Rust has two different types for a list of items:
3465
3466 * `[T; N]`, an 'array'.
3467 * `&[T]`, a 'slice'.
3468
3469 An array has a fixed size, and can be allocated on either the stack or the
3470 heap.
3471
3472 A slice is a 'view' into an array. It doesn't own the data it points
3473 to, it borrows it.
3474
3475 An example of each kind:
3476
3477 ```{rust}
3478 let vec: Vec<i32> = vec![1, 2, 3];
3479 let arr: [i32; 3] = [1, 2, 3];
3480 let s: &[i32] = &vec[..];
3481 ```
3482
3483 As you can see, the `vec!` macro allows you to create a `Vec<T>` easily. The
3484 `vec!` macro is also part of the standard library, rather than the language.
3485
3486 All in-bounds elements of arrays, and slices are always initialized, and access
3487 to an array or slice is always bounds-checked.
3488
3489 ### Structure types
3490
3491 A `struct` *type* is a heterogeneous product of other types, called the
3492 *fields* of the type.[^structtype]
3493
3494 [^structtype]: `struct` types are analogous `struct` types in C,
3495     the *record* types of the ML family,
3496     or the *structure* types of the Lisp family.
3497
3498 New instances of a `struct` can be constructed with a [struct
3499 expression](#structure-expressions).
3500
3501 The memory layout of a `struct` is undefined by default to allow for compiler
3502 optimizations like field reordering, but it can be fixed with the
3503 `#[repr(...)]` attribute. In either case, fields may be given in any order in
3504 a corresponding struct *expression*; the resulting `struct` value will always
3505 have the same memory layout.
3506
3507 The fields of a `struct` may be qualified by [visibility
3508 modifiers](#re-exporting-and-visibility), to allow access to data in a
3509 structure outside a module.
3510
3511 A _tuple struct_ type is just like a structure type, except that the fields are
3512 anonymous.
3513
3514 A _unit-like struct_ type is like a structure type, except that it has no
3515 fields. The one value constructed by the associated [structure
3516 expression](#structure-expressions) is the only value that inhabits such a
3517 type.
3518
3519 ### Enumerated types
3520
3521 An *enumerated type* is a nominal, heterogeneous disjoint union type, denoted
3522 by the name of an [`enum` item](#enumerations). [^enumtype]
3523
3524 [^enumtype]: The `enum` type is analogous to a `data` constructor declaration in
3525              ML, or a *pick ADT* in Limbo.
3526
3527 An [`enum` item](#enumerations) declares both the type and a number of *variant
3528 constructors*, each of which is independently named and takes an optional tuple
3529 of arguments.
3530
3531 New instances of an `enum` can be constructed by calling one of the variant
3532 constructors, in a [call expression](#call-expressions).
3533
3534 Any `enum` value consumes as much memory as the largest variant constructor for
3535 its corresponding `enum` type.
3536
3537 Enum types cannot be denoted *structurally* as types, but must be denoted by
3538 named reference to an [`enum` item](#enumerations).
3539
3540 ### Recursive types
3541
3542 Nominal types &mdash; [enumerations](#enumerated-types) and
3543 [structures](#structure-types) &mdash; may be recursive. That is, each `enum`
3544 constructor or `struct` field may refer, directly or indirectly, to the
3545 enclosing `enum` or `struct` type itself. Such recursion has restrictions:
3546
3547 * Recursive types must include a nominal type in the recursion
3548   (not mere [type definitions](#type-definitions),
3549    or other structural types such as [arrays](#array,-and-slice-types) or [tuples](#tuple-types)).
3550 * A recursive `enum` item must have at least one non-recursive constructor
3551   (in order to give the recursion a basis case).
3552 * The size of a recursive type must be finite;
3553   in other words the recursive fields of the type must be [pointer types](#pointer-types).
3554 * Recursive type definitions can cross module boundaries, but not module *visibility* boundaries,
3555   or crate boundaries (in order to simplify the module system and type checker).
3556
3557 An example of a *recursive* type and its use:
3558
3559 ```
3560 enum List<T> {
3561     Nil,
3562     Cons(T, Box<List<T>>)
3563 }
3564
3565 let a: List<i32> = List::Cons(7, Box::new(List::Cons(13, Box::new(List::Nil))));
3566 ```
3567
3568 ### Pointer types
3569
3570 All pointers in Rust are explicit first-class values. They can be copied,
3571 stored into data structures, and returned from functions. There are two
3572 varieties of pointer in Rust:
3573
3574 * References (`&`)
3575   : These point to memory _owned by some other value_.
3576     A reference type is written `&type` for some lifetime-variable `f`,
3577     or just `&'a type` when you need an explicit lifetime.
3578     Copying a reference is a "shallow" operation:
3579     it involves only copying the pointer itself.
3580     Releasing a reference typically has no effect on the value it points to,
3581     with the exception of temporary values, which are released when the last
3582     reference to them is released.
3583
3584 * Raw pointers (`*`)
3585   : Raw pointers are pointers without safety or liveness guarantees.
3586     Raw pointers are written as `*const T` or `*mut T`,
3587     for example `*const int` means a raw pointer to an integer.
3588     Copying or dropping a raw pointer has no effect on the lifecycle of any
3589     other value. Dereferencing a raw pointer or converting it to any other
3590     pointer type is an [`unsafe` operation](#unsafe-functions).
3591     Raw pointers are generally discouraged in Rust code;
3592     they exist to support interoperability with foreign code,
3593     and writing performance-critical or low-level functions.
3594
3595 The standard library contains additional 'smart pointer' types beyond references
3596 and raw pointers.
3597
3598 ### Function types
3599
3600 The function type constructor `fn` forms new function types. A function type
3601 consists of a possibly-empty set of function-type modifiers (such as `unsafe`
3602 or `extern`), a sequence of input types and an output type.
3603
3604 An example of a `fn` type:
3605
3606 ```
3607 fn add(x: i32, y: i32) -> i32 {
3608   return x + y;
3609 }
3610
3611 let mut x = add(5,7);
3612
3613 type Binop = fn(i32, i32) -> i32;
3614 let bo: Binop = add;
3615 x = bo(5,7);
3616 ```
3617
3618 ### Closure types
3619
3620 ```{.ebnf .notation}
3621 closure_type := [ 'unsafe' ] [ '<' lifetime-list '>' ] '|' arg-list '|'
3622                 [ ':' bound-list ] [ '->' type ]
3623 lifetime-list := lifetime | lifetime ',' lifetime-list
3624 arg-list := ident ':' type | ident ':' type ',' arg-list
3625 bound-list := bound | bound '+' bound-list
3626 bound := path | lifetime
3627 ```
3628
3629 The type of a closure mapping an input of type `A` to an output of type `B` is
3630 `|A| -> B`. A closure with no arguments or return values has type `||`.
3631
3632 An example of creating and calling a closure:
3633
3634 ```rust
3635 let captured_var = 10;
3636
3637 let closure_no_args = || println!("captured_var={}", captured_var);
3638
3639 let closure_args = |arg: i32| -> i32 {
3640   println!("captured_var={}, arg={}", captured_var, arg);
3641   arg // Note lack of semicolon after 'arg'
3642 };
3643
3644 fn call_closure<F: Fn(), G: Fn(i32) -> i32>(c1: F, c2: G) {
3645   c1();
3646   c2(2);
3647 }
3648
3649 call_closure(closure_no_args, closure_args);
3650
3651 ```
3652
3653 ### Object types
3654
3655 Every trait item (see [traits](#traits)) defines a type with the same name as
3656 the trait. This type is called the _object type_ of the trait. Object types
3657 permit "late binding" of methods, dispatched using _virtual method tables_
3658 ("vtables"). Whereas most calls to trait methods are "early bound" (statically
3659 resolved) to specific implementations at compile time, a call to a method on an
3660 object type is only resolved to a vtable entry at compile time. The actual
3661 implementation for each vtable entry can vary on an object-by-object basis.
3662
3663 Given a pointer-typed expression `E` of type `&T` or `Box<T>`, where `T`
3664 implements trait `R`, casting `E` to the corresponding pointer type `&R` or
3665 `Box<R>` results in a value of the _object type_ `R`. This result is
3666 represented as a pair of pointers: the vtable pointer for the `T`
3667 implementation of `R`, and the pointer value of `E`.
3668
3669 An example of an object type:
3670
3671 ```
3672 trait Printable {
3673   fn stringify(&self) -> String;
3674 }
3675
3676 impl Printable for i32 {
3677   fn stringify(&self) -> String { self.to_string() }
3678 }
3679
3680 fn print(a: Box<Printable>) {
3681    println!("{}", a.stringify());
3682 }
3683
3684 fn main() {
3685    print(Box::new(10) as Box<Printable>);
3686 }
3687 ```
3688
3689 In this example, the trait `Printable` occurs as an object type in both the
3690 type signature of `print`, and the cast expression in `main`.
3691
3692 ### Type parameters
3693
3694 Within the body of an item that has type parameter declarations, the names of
3695 its type parameters are types:
3696
3697 ```ignore
3698 fn map<A: Clone, B: Clone>(f: |A| -> B, xs: &[A]) -> Vec<B> {
3699     if xs.is_empty() {
3700        return vec![];
3701     }
3702     let first: B = f(xs[0].clone());
3703     let mut rest: Vec<B> = map(f, xs.slice(1, xs.len()));
3704     rest.insert(0, first);
3705     return rest;
3706 }
3707 ```
3708
3709 Here, `first` has type `B`, referring to `map`'s `B` type parameter; and `rest`
3710 has type `Vec<B>`, a vector type with element type `B`.
3711
3712 ### Self types
3713
3714 The special type `self` has a meaning within methods inside an impl item. It
3715 refers to the type of the implicit `self` argument. For example, in:
3716
3717 ```
3718 trait Printable {
3719   fn make_string(&self) -> String;
3720 }
3721
3722 impl Printable for String {
3723     fn make_string(&self) -> String {
3724         (*self).clone()
3725     }
3726 }
3727 ```
3728
3729 `self` refers to the value of type `String` that is the receiver for a call to
3730 the method `make_string`.
3731
3732 # Special traits
3733
3734 Several traits define special evaluation behavior.
3735
3736 ## The `Copy` trait
3737
3738 The `Copy` trait changes the semantics of a type implementing it. Values whose
3739 type implements `Copy` are copied rather than moved upon assignment.
3740
3741 ## The `Sized` trait
3742
3743 The `Sized` trait indicates that the size of this type is known at compile-time.
3744
3745 ## The `Drop` trait
3746
3747 The `Drop` trait provides a destructor, to be run whenever a value of this type
3748 is to be destroyed.
3749
3750 # Memory model
3751
3752 A Rust program's memory consists of a static set of *items* and a *heap*.
3753 Immutable portions of the heap may be safely shared between threads, mutable
3754 portions may not be safely shared, but several mechanisms for effectively-safe
3755 sharing of mutable values, built on unsafe code but enforcing a safe locking
3756 discipline, exist in the standard library.
3757
3758 Allocations in the stack consist of *variables*, and allocations in the heap
3759 consist of *boxes*.
3760
3761 ### Memory allocation and lifetime
3762
3763 The _items_ of a program are those functions, modules and types that have their
3764 value calculated at compile-time and stored uniquely in the memory image of the
3765 rust process. Items are neither dynamically allocated nor freed.
3766
3767 The _heap_ is a general term that describes boxes.  The lifetime of an
3768 allocation in the heap depends on the lifetime of the box values pointing to
3769 it. Since box values may themselves be passed in and out of frames, or stored
3770 in the heap, heap allocations may outlive the frame they are allocated within.
3771
3772 ### Memory ownership
3773
3774 When a stack frame is exited, its local allocations are all released, and its
3775 references to boxes are dropped.
3776
3777 ### Variables
3778
3779 A _variable_ is a component of a stack frame, either a named function parameter,
3780 an anonymous [temporary](#lvalues,-rvalues-and-temporaries), or a named local
3781 variable.
3782
3783 A _local variable_ (or *stack-local* allocation) holds a value directly,
3784 allocated within the stack's memory. The value is a part of the stack frame.
3785
3786 Local variables are immutable unless declared otherwise like: `let mut x = ...`.
3787
3788 Function parameters are immutable unless declared with `mut`. The `mut` keyword
3789 applies only to the following parameter (so `|mut x, y|` and `fn f(mut x:
3790 Box<i32>, y: Box<i32>)` declare one mutable variable `x` and one immutable
3791 variable `y`).
3792
3793 Methods that take either `self` or `Box<Self>` can optionally place them in a
3794 mutable variable by prefixing them with `mut` (similar to regular arguments):
3795
3796 ```
3797 trait Changer {
3798     fn change(mut self) -> Self;
3799     fn modify(mut self: Box<Self>) -> Box<Self>;
3800 }
3801 ```
3802
3803 Local variables are not initialized when allocated; the entire frame worth of
3804 local variables are allocated at once, on frame-entry, in an uninitialized
3805 state. Subsequent statements within a function may or may not initialize the
3806 local variables. Local variables can be used only after they have been
3807 initialized; this is enforced by the compiler.
3808
3809 # Linkage
3810
3811 The Rust compiler supports various methods to link crates together both
3812 statically and dynamically. This section will explore the various methods to
3813 link Rust crates together, and more information about native libraries can be
3814 found in the [ffi section of the book][ffi].
3815
3816 In one session of compilation, the compiler can generate multiple artifacts
3817 through the usage of either command line flags or the `crate_type` attribute.
3818 If one or more command line flag is specified, all `crate_type` attributes will
3819 be ignored in favor of only building the artifacts specified by command line.
3820
3821 * `--crate-type=bin`, `#[crate_type = "bin"]` - A runnable executable will be
3822   produced. This requires that there is a `main` function in the crate which
3823   will be run when the program begins executing. This will link in all Rust and
3824   native dependencies, producing a distributable binary.
3825
3826 * `--crate-type=lib`, `#[crate_type = "lib"]` - A Rust library will be produced.
3827   This is an ambiguous concept as to what exactly is produced because a library
3828   can manifest itself in several forms. The purpose of this generic `lib` option
3829   is to generate the "compiler recommended" style of library. The output library
3830   will always be usable by rustc, but the actual type of library may change from
3831   time-to-time. The remaining output types are all different flavors of
3832   libraries, and the `lib` type can be seen as an alias for one of them (but the
3833   actual one is compiler-defined).
3834
3835 * `--crate-type=dylib`, `#[crate_type = "dylib"]` - A dynamic Rust library will
3836   be produced. This is different from the `lib` output type in that this forces
3837   dynamic library generation. The resulting dynamic library can be used as a
3838   dependency for other libraries and/or executables. This output type will
3839   create `*.so` files on linux, `*.dylib` files on osx, and `*.dll` files on
3840   windows.
3841
3842 * `--crate-type=staticlib`, `#[crate_type = "staticlib"]` - A static system
3843   library will be produced. This is different from other library outputs in that
3844   the Rust compiler will never attempt to link to `staticlib` outputs. The
3845   purpose of this output type is to create a static library containing all of
3846   the local crate's code along with all upstream dependencies. The static
3847   library is actually a `*.a` archive on linux and osx and a `*.lib` file on
3848   windows. This format is recommended for use in situations such as linking
3849   Rust code into an existing non-Rust application because it will not have
3850   dynamic dependencies on other Rust code.
3851
3852 * `--crate-type=rlib`, `#[crate_type = "rlib"]` - A "Rust library" file will be
3853   produced. This is used as an intermediate artifact and can be thought of as a
3854   "static Rust library". These `rlib` files, unlike `staticlib` files, are
3855   interpreted by the Rust compiler in future linkage. This essentially means
3856   that `rustc` will look for metadata in `rlib` files like it looks for metadata
3857   in dynamic libraries. This form of output is used to produce statically linked
3858   executables as well as `staticlib` outputs.
3859
3860 Note that these outputs are stackable in the sense that if multiple are
3861 specified, then the compiler will produce each form of output at once without
3862 having to recompile. However, this only applies for outputs specified by the
3863 same method. If only `crate_type` attributes are specified, then they will all
3864 be built, but if one or more `--crate-type` command line flag is specified,
3865 then only those outputs will be built.
3866
3867 With all these different kinds of outputs, if crate A depends on crate B, then
3868 the compiler could find B in various different forms throughout the system. The
3869 only forms looked for by the compiler, however, are the `rlib` format and the
3870 dynamic library format. With these two options for a dependent library, the
3871 compiler must at some point make a choice between these two formats. With this
3872 in mind, the compiler follows these rules when determining what format of
3873 dependencies will be used:
3874
3875 1. If a static library is being produced, all upstream dependencies are
3876    required to be available in `rlib` formats. This requirement stems from the
3877    reason that a dynamic library cannot be converted into a static format.
3878
3879    Note that it is impossible to link in native dynamic dependencies to a static
3880    library, and in this case warnings will be printed about all unlinked native
3881    dynamic dependencies.
3882
3883 2. If an `rlib` file is being produced, then there are no restrictions on what
3884    format the upstream dependencies are available in. It is simply required that
3885    all upstream dependencies be available for reading metadata from.
3886
3887    The reason for this is that `rlib` files do not contain any of their upstream
3888    dependencies. It wouldn't be very efficient for all `rlib` files to contain a
3889    copy of `libstd.rlib`!
3890
3891 3. If an executable is being produced and the `-C prefer-dynamic` flag is not
3892    specified, then dependencies are first attempted to be found in the `rlib`
3893    format. If some dependencies are not available in an rlib format, then
3894    dynamic linking is attempted (see below).
3895
3896 4. If a dynamic library or an executable that is being dynamically linked is
3897    being produced, then the compiler will attempt to reconcile the available
3898    dependencies in either the rlib or dylib format to create a final product.
3899
3900    A major goal of the compiler is to ensure that a library never appears more
3901    than once in any artifact. For example, if dynamic libraries B and C were
3902    each statically linked to library A, then a crate could not link to B and C
3903    together because there would be two copies of A. The compiler allows mixing
3904    the rlib and dylib formats, but this restriction must be satisfied.
3905
3906    The compiler currently implements no method of hinting what format a library
3907    should be linked with. When dynamically linking, the compiler will attempt to
3908    maximize dynamic dependencies while still allowing some dependencies to be
3909    linked in via an rlib.
3910
3911    For most situations, having all libraries available as a dylib is recommended
3912    if dynamically linking. For other situations, the compiler will emit a
3913    warning if it is unable to determine which formats to link each library with.
3914
3915 In general, `--crate-type=bin` or `--crate-type=lib` should be sufficient for
3916 all compilation needs, and the other options are just available if more
3917 fine-grained control is desired over the output format of a Rust crate.
3918
3919 # Appendix: Rationales and design tradeoffs
3920
3921 *TODO*.
3922
3923 # Appendix: Influences
3924
3925 Rust is not a particularly original language, with design elements coming from
3926 a wide range of sources. Some of these are listed below (including elements
3927 that have since been removed):
3928
3929 * SML, OCaml: algebraic datatypes, pattern matching, type inference,
3930   semicolon statement separation
3931 * C++: references, RAII, smart pointers, move semantics, monomorphisation,
3932   memory model
3933 * ML Kit, Cyclone: region based memory management
3934 * Haskell (GHC): typeclasses, type families
3935 * Newsqueak, Alef, Limbo: channels, concurrency
3936 * Erlang: message passing, task failure, ~~linked task failure~~,
3937   ~~lightweight concurrency~~
3938 * Swift: optional bindings
3939 * Scheme: hygienic macros
3940 * C#: attributes
3941 * Ruby: ~~block syntax~~
3942 * NIL, Hermes: ~~typestate~~
3943 * [Unicode Annex #31](http://www.unicode.org/reports/tr31/): identifier and
3944   pattern syntax
3945
3946 [ffi]: book/ffi.html
3947 [plugin]: book/plugins.html