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