Auto merge of #28220 - steveklabnik:rollup, r=steveklabnik
- Successful merges: #28167, #28202, #28203, #28204, #28205, #28207, #28208, #28209, #28210, #28212, #28213, #28214, #28215, #28216 - Failed merges:
This commit is contained in:
commit
35b14544e1
31 changed files with 97 additions and 110 deletions
|
@ -281,7 +281,7 @@ type_path_tail : '<' type_expr [ ',' type_expr ] + '>'
|
||||||
## Macros
|
## Macros
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
expr_macro_rules : "macro_rules" '!' ident '(' macro_rule * ')' ';'
|
expr_macro_rules : "macro_rules" '!' ident '(' macro_rule * ')' ';'
|
||||||
| "macro_rules" '!' ident '{' macro_rule * '}' ;
|
| "macro_rules" '!' ident '{' macro_rule * '}' ;
|
||||||
macro_rule : '(' matcher * ')' "=>" '(' transcriber * ')' ';' ;
|
macro_rule : '(' matcher * ')' "=>" '(' transcriber * ')' ';' ;
|
||||||
matcher : '(' matcher * ')' | '[' matcher * ']'
|
matcher : '(' matcher * ')' | '[' matcher * ']'
|
||||||
|
@ -306,7 +306,7 @@ transcriber : '(' transcriber * ')' | '[' transcriber * ']'
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
item : vis ? mod_item | fn_item | type_item | struct_item | enum_item
|
item : vis ? mod_item | fn_item | type_item | struct_item | enum_item
|
||||||
| const_item | static_item | trait_item | impl_item | extern_block ;
|
| const_item | static_item | trait_item | impl_item | extern_block_item ;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Type Parameters
|
### Type Parameters
|
||||||
|
@ -636,31 +636,31 @@ lambda_expr : '|' ident_list '|' expr ;
|
||||||
### While loops
|
### While loops
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
while_expr : [ lifetime ':' ] "while" no_struct_literal_expr '{' block '}' ;
|
while_expr : [ lifetime ':' ] ? "while" no_struct_literal_expr '{' block '}' ;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Infinite loops
|
### Infinite loops
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
loop_expr : [ lifetime ':' ] "loop" '{' block '}';
|
loop_expr : [ lifetime ':' ] ? "loop" '{' block '}';
|
||||||
```
|
```
|
||||||
|
|
||||||
### Break expressions
|
### Break expressions
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
break_expr : "break" [ lifetime ];
|
break_expr : "break" [ lifetime ] ?;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Continue expressions
|
### Continue expressions
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
continue_expr : "continue" [ lifetime ];
|
continue_expr : "continue" [ lifetime ] ?;
|
||||||
```
|
```
|
||||||
|
|
||||||
### For expressions
|
### For expressions
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
for_expr : [ lifetime ':' ] "for" pat "in" no_struct_literal_expr '{' block '}' ;
|
for_expr : [ lifetime ':' ] ? "for" pat "in" no_struct_literal_expr '{' block '}' ;
|
||||||
```
|
```
|
||||||
|
|
||||||
### If expressions
|
### If expressions
|
||||||
|
@ -688,13 +688,12 @@ match_pat : pat [ '|' pat ] * [ "if" expr ] ? ;
|
||||||
```antlr
|
```antlr
|
||||||
if_let_expr : "if" "let" pat '=' expr '{' block '}'
|
if_let_expr : "if" "let" pat '=' expr '{' block '}'
|
||||||
else_tail ? ;
|
else_tail ? ;
|
||||||
else_tail : "else" [ if_expr | if_let_expr | '{' block '}' ] ;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### While let loops
|
### While let loops
|
||||||
|
|
||||||
```antlr
|
```antlr
|
||||||
while_let_expr : "while" "let" pat '=' expr '{' block '}' ;
|
while_let_expr : [ lifetime ':' ] ? "while" "let" pat '=' expr '{' block '}' ;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Return expressions
|
### Return expressions
|
||||||
|
@ -754,8 +753,6 @@ return_expr : "return" expr ? ;
|
||||||
```antlr
|
```antlr
|
||||||
closure_type := [ 'unsafe' ] [ '<' lifetime-list '>' ] '|' arg-list '|'
|
closure_type := [ 'unsafe' ] [ '<' lifetime-list '>' ] '|' arg-list '|'
|
||||||
[ ':' bound-list ] [ '->' type ]
|
[ ':' bound-list ] [ '->' type ]
|
||||||
procedure_type := 'proc' [ '<' lifetime-list '>' ] '(' arg-list ')'
|
|
||||||
[ ':' bound-list ] [ '->' type ]
|
|
||||||
lifetime-list := lifetime | lifetime ',' lifetime-list
|
lifetime-list := lifetime | lifetime ',' lifetime-list
|
||||||
arg-list := ident ':' type | ident ':' type ',' arg-list
|
arg-list := ident ':' type | ident ':' type ',' arg-list
|
||||||
bound-list := bound | bound '+' bound-list
|
bound-list := bound | bound '+' bound-list
|
||||||
|
|
|
@ -3200,16 +3200,6 @@ let z = match x { &0 => "zero", _ => "some" };
|
||||||
assert_eq!(y, z);
|
assert_eq!(y, z);
|
||||||
```
|
```
|
||||||
|
|
||||||
A pattern that's just an identifier, like `Nil` in the previous example, could
|
|
||||||
either refer to an enum variant that's in scope, or bind a new variable. The
|
|
||||||
compiler resolves this ambiguity by forbidding variable bindings that occur in
|
|
||||||
`match` patterns from shadowing names of variants that are in scope. For
|
|
||||||
example, wherever `List` is in scope, a `match` pattern would not be able to
|
|
||||||
bind `Nil` as a new name. The compiler interprets a variable pattern `x` as a
|
|
||||||
binding _only_ if there is no variant named `x` in scope. A convention you can
|
|
||||||
use to avoid conflicts is simply to name variants with upper-case letters, and
|
|
||||||
local variables with lower-case letters.
|
|
||||||
|
|
||||||
Multiple match patterns may be joined with the `|` operator. A range of values
|
Multiple match patterns may be joined with the `|` operator. A range of values
|
||||||
may be specified with `...`. For example:
|
may be specified with `...`. For example:
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
% Choosing your Guarantees
|
% Choosing your Guarantees
|
||||||
|
|
||||||
One important feature of Rust as language is that it lets us control the costs and guarantees
|
One important feature of Rust is that it lets us control the costs and guarantees
|
||||||
of a program.
|
of a program.
|
||||||
|
|
||||||
There are various “wrapper type” abstractions in the Rust standard library which embody
|
There are various “wrapper type” abstractions in the Rust standard library which embody
|
||||||
|
@ -18,9 +18,9 @@ Before proceeding, it is highly recommended that one reads about [ownership][own
|
||||||
|
|
||||||
## `Box<T>`
|
## `Box<T>`
|
||||||
|
|
||||||
[`Box<T>`][box] is pointer which is “owned”, or a “box”. While it can hand
|
[`Box<T>`][box] is an “owned” pointer, or a “box”. While it can hand
|
||||||
out references to the contained data, it is the only owner of the data. In particular, when
|
out references to the contained data, it is the only owner of the data. In particular, consider
|
||||||
something like the following occurs:
|
the following:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let x = Box::new(1);
|
let x = Box::new(1);
|
||||||
|
@ -40,7 +40,7 @@ allowed to share references to this by the regular borrowing rules, checked at c
|
||||||
|
|
||||||
[box]: ../std/boxed/struct.Box.html
|
[box]: ../std/boxed/struct.Box.html
|
||||||
|
|
||||||
## `&T` and `&mut T`
|
## `&T` and `&mut T`
|
||||||
|
|
||||||
These are immutable and mutable references respectively. They follow the “read-write lock”
|
These are immutable and mutable references respectively. They follow the “read-write lock”
|
||||||
pattern, such that one may either have only one mutable reference to some data, or any number of
|
pattern, such that one may either have only one mutable reference to some data, or any number of
|
||||||
|
@ -243,7 +243,7 @@ Many of the types above cannot be used in a threadsafe manner. Particularly, `Rc
|
||||||
`RefCell<T>`, which both use non-atomic reference counts (_atomic_ reference counts are those which
|
`RefCell<T>`, which both use non-atomic reference counts (_atomic_ reference counts are those which
|
||||||
can be incremented from multiple threads without causing a data race), cannot be used this way. This
|
can be incremented from multiple threads without causing a data race), cannot be used this way. This
|
||||||
makes them cheaper to use, but we need thread safe versions of these too. They exist, in the form of
|
makes them cheaper to use, but we need thread safe versions of these too. They exist, in the form of
|
||||||
`Arc<T>` and `Mutex<T>`/`RWLock<T>`
|
`Arc<T>` and `Mutex<T>`/`RwLock<T>`
|
||||||
|
|
||||||
Note that the non-threadsafe types _cannot_ be sent between threads, and this is checked at compile
|
Note that the non-threadsafe types _cannot_ be sent between threads, and this is checked at compile
|
||||||
time.
|
time.
|
||||||
|
|
|
@ -89,8 +89,8 @@ Vectors can `Deref` to a slice.
|
||||||
|
|
||||||
## Deref and method calls
|
## Deref and method calls
|
||||||
|
|
||||||
`Deref` will also kick in when calling a method. In other words, these are
|
`Deref` will also kick in when calling a method. Consider the following
|
||||||
the same two things in Rust:
|
example.
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
@ -99,13 +99,13 @@ impl Foo {
|
||||||
fn foo(&self) { println!("Foo"); }
|
fn foo(&self) { println!("Foo"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
let f = Foo;
|
let f = &&Foo;
|
||||||
|
|
||||||
f.foo();
|
f.foo();
|
||||||
```
|
```
|
||||||
|
|
||||||
Even though `f` isn’t a reference, and `foo` takes `&self`, this works.
|
Even though `f` is a `&&Foo` and `foo` takes `&self`, this works. That’s
|
||||||
That’s because these things are the same:
|
because these things are the same:
|
||||||
|
|
||||||
```rust,ignore
|
```rust,ignore
|
||||||
f.foo();
|
f.foo();
|
||||||
|
|
|
@ -38,7 +38,7 @@ local variables and some other information. This is called a ‘stack frame’,
|
||||||
for the purpose of this tutorial, we’re going to ignore the extra information
|
for the purpose of this tutorial, we’re going to ignore the extra information
|
||||||
and just consider the local variables we’re allocating. So in this case, when
|
and just consider the local variables we’re allocating. So in this case, when
|
||||||
`main()` is run, we’ll allocate a single 32-bit integer for our stack frame.
|
`main()` is run, we’ll allocate a single 32-bit integer for our stack frame.
|
||||||
This is automatically handled for you, as you can see, we didn’t have to write
|
This is automatically handled for you, as you can see; we didn’t have to write
|
||||||
any special Rust code or anything.
|
any special Rust code or anything.
|
||||||
|
|
||||||
When the function is over, its stack frame gets deallocated. This happens
|
When the function is over, its stack frame gets deallocated. This happens
|
||||||
|
@ -51,7 +51,7 @@ we’ll throw them all away at the same time as well, we can get rid of it very
|
||||||
fast too.
|
fast too.
|
||||||
|
|
||||||
The downside is that we can’t keep values around if we need them for longer
|
The downside is that we can’t keep values around if we need them for longer
|
||||||
than a single function. We also haven’t talked about what that name, ‘stack’
|
than a single function. We also haven’t talked about what the word, ‘stack’,
|
||||||
means. To do that, we need a slightly more complicated example:
|
means. To do that, we need a slightly more complicated example:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
|
|
@ -13,8 +13,8 @@ tokens {
|
||||||
BINOPEQ, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
|
BINOPEQ, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
|
||||||
MOD_SEP, RARROW, FAT_ARROW, LPAREN, RPAREN, LBRACKET, RBRACKET,
|
MOD_SEP, RARROW, FAT_ARROW, LPAREN, RPAREN, LBRACKET, RBRACKET,
|
||||||
LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR, LIT_BYTE,
|
LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR, LIT_BYTE,
|
||||||
LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BINARY,
|
LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BYTE_STR,
|
||||||
LIT_BINARY_RAW, QUESTION, IDENT, LIFETIME, WHITESPACE, DOC_COMMENT,
|
LIT_BYTE_STR_RAW, QUESTION, IDENT, LIFETIME, WHITESPACE, DOC_COMMENT,
|
||||||
COMMENT, SHEBANG, UTF8_BOM
|
COMMENT, SHEBANG, UTF8_BOM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,8 +148,8 @@ LIT_STR
|
||||||
: '"' ('\\\n' | '\\\r\n' | '\\' CHAR_ESCAPE | .)*? '"' SUFFIX?
|
: '"' ('\\\n' | '\\\r\n' | '\\' CHAR_ESCAPE | .)*? '"' SUFFIX?
|
||||||
;
|
;
|
||||||
|
|
||||||
LIT_BINARY : 'b' LIT_STR ;
|
LIT_BYTE_STR : 'b' LIT_STR ;
|
||||||
LIT_BINARY_RAW : 'b' LIT_STR_RAW ;
|
LIT_BYTE_STR_RAW : 'b' LIT_STR_RAW ;
|
||||||
|
|
||||||
/* this is a bit messy */
|
/* this is a bit messy */
|
||||||
|
|
||||||
|
|
|
@ -200,7 +200,7 @@ while { return WHILE; }
|
||||||
<ltorchar><<EOF>> { BEGIN(INITIAL); return -1; }
|
<ltorchar><<EOF>> { BEGIN(INITIAL); return -1; }
|
||||||
|
|
||||||
b\x22 { BEGIN(bytestr); yymore(); }
|
b\x22 { BEGIN(bytestr); yymore(); }
|
||||||
<bytestr>\x22 { BEGIN(suffix); return LIT_BINARY; }
|
<bytestr>\x22 { BEGIN(suffix); return LIT_BYTE_STR; }
|
||||||
|
|
||||||
<bytestr><<EOF>> { return -1; }
|
<bytestr><<EOF>> { return -1; }
|
||||||
<bytestr>\\[n\nrt\\\x27\x220] { yymore(); }
|
<bytestr>\\[n\nrt\\\x27\x220] { yymore(); }
|
||||||
|
@ -210,7 +210,7 @@ b\x22 { BEGIN(bytestr); yymore(); }
|
||||||
<bytestr>(.|\n) { yymore(); }
|
<bytestr>(.|\n) { yymore(); }
|
||||||
|
|
||||||
br\x22 { BEGIN(rawbytestr_nohash); yymore(); }
|
br\x22 { BEGIN(rawbytestr_nohash); yymore(); }
|
||||||
<rawbytestr_nohash>\x22 { BEGIN(suffix); return LIT_BINARY_RAW; }
|
<rawbytestr_nohash>\x22 { BEGIN(suffix); return LIT_BYTE_STR_RAW; }
|
||||||
<rawbytestr_nohash>(.|\n) { yymore(); }
|
<rawbytestr_nohash>(.|\n) { yymore(); }
|
||||||
<rawbytestr_nohash><<EOF>> { return -1; }
|
<rawbytestr_nohash><<EOF>> { return -1; }
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ br/# {
|
||||||
end_hashes++;
|
end_hashes++;
|
||||||
if (end_hashes == num_hashes) {
|
if (end_hashes == num_hashes) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
return LIT_BINARY_RAW;
|
return LIT_BYTE_STR_RAW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
yymore();
|
yymore();
|
||||||
|
@ -237,7 +237,7 @@ br/# {
|
||||||
end_hashes = 1;
|
end_hashes = 1;
|
||||||
if (end_hashes == num_hashes) {
|
if (end_hashes == num_hashes) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
return LIT_BINARY_RAW;
|
return LIT_BYTE_STR_RAW;
|
||||||
}
|
}
|
||||||
yymore();
|
yymore();
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,8 @@ extern char *yytext;
|
||||||
%token LIT_FLOAT
|
%token LIT_FLOAT
|
||||||
%token LIT_STR
|
%token LIT_STR
|
||||||
%token LIT_STR_RAW
|
%token LIT_STR_RAW
|
||||||
%token LIT_BINARY
|
%token LIT_BYTE_STR
|
||||||
%token LIT_BINARY_RAW
|
%token LIT_BYTE_STR_RAW
|
||||||
%token IDENT
|
%token IDENT
|
||||||
%token UNDERSCORE
|
%token UNDERSCORE
|
||||||
%token LIFETIME
|
%token LIFETIME
|
||||||
|
@ -1772,8 +1772,8 @@ lit
|
||||||
str
|
str
|
||||||
: LIT_STR { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("CookedStr")); }
|
: LIT_STR { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("CookedStr")); }
|
||||||
| LIT_STR_RAW { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("RawStr")); }
|
| LIT_STR_RAW { $$ = mk_node("LitStr", 1, mk_atom(yytext), mk_atom("RawStr")); }
|
||||||
| LIT_BINARY { $$ = mk_node("LitBinary", 1, mk_atom(yytext), mk_atom("BinaryStr")); }
|
| LIT_BYTE_STR { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("ByteStr")); }
|
||||||
| LIT_BINARY_RAW { $$ = mk_node("LitBinary", 1, mk_atom(yytext), mk_atom("RawBinaryStr")); }
|
| LIT_BYTE_STR_RAW { $$ = mk_node("LitByteStr", 1, mk_atom(yytext), mk_atom("RawByteStr")); }
|
||||||
;
|
;
|
||||||
|
|
||||||
maybe_ident
|
maybe_ident
|
||||||
|
@ -1815,8 +1815,8 @@ unpaired_token
|
||||||
| LIT_FLOAT { $$ = mk_atom(yytext); }
|
| LIT_FLOAT { $$ = mk_atom(yytext); }
|
||||||
| LIT_STR { $$ = mk_atom(yytext); }
|
| LIT_STR { $$ = mk_atom(yytext); }
|
||||||
| LIT_STR_RAW { $$ = mk_atom(yytext); }
|
| LIT_STR_RAW { $$ = mk_atom(yytext); }
|
||||||
| LIT_BINARY { $$ = mk_atom(yytext); }
|
| LIT_BYTE_STR { $$ = mk_atom(yytext); }
|
||||||
| LIT_BINARY_RAW { $$ = mk_atom(yytext); }
|
| LIT_BYTE_STR_RAW { $$ = mk_atom(yytext); }
|
||||||
| IDENT { $$ = mk_atom(yytext); }
|
| IDENT { $$ = mk_atom(yytext); }
|
||||||
| UNDERSCORE { $$ = mk_atom(yytext); }
|
| UNDERSCORE { $$ = mk_atom(yytext); }
|
||||||
| LIFETIME { $$ = mk_atom(yytext); }
|
| LIFETIME { $$ = mk_atom(yytext); }
|
||||||
|
|
|
@ -38,8 +38,8 @@ enum Token {
|
||||||
LIT_FLOAT,
|
LIT_FLOAT,
|
||||||
LIT_STR,
|
LIT_STR,
|
||||||
LIT_STR_RAW,
|
LIT_STR_RAW,
|
||||||
LIT_BINARY,
|
LIT_BYTE_STR,
|
||||||
LIT_BINARY_RAW,
|
LIT_BYTE_STR_RAW,
|
||||||
IDENT,
|
IDENT,
|
||||||
UNDERSCORE,
|
UNDERSCORE,
|
||||||
LIFETIME,
|
LIFETIME,
|
||||||
|
|
|
@ -107,8 +107,8 @@ fn parse_token_list(file: &str) -> HashMap<String, token::Token> {
|
||||||
"OR" => token::BinOp(token::Or),
|
"OR" => token::BinOp(token::Or),
|
||||||
"GT" => token::Gt,
|
"GT" => token::Gt,
|
||||||
"LE" => token::Le,
|
"LE" => token::Le,
|
||||||
"LIT_BINARY" => token::Literal(token::Binary(Name(0)), None),
|
"LIT_BYTE_STR" => token::Literal(token::ByteStr(Name(0)), None),
|
||||||
"LIT_BINARY_RAW" => token::Literal(token::BinaryRaw(Name(0), 0), None),
|
"LIT_BYTE_STR_RAW" => token::Literal(token::ByteStrRaw(Name(0), 0), None),
|
||||||
"QUESTION" => token::Question,
|
"QUESTION" => token::Question,
|
||||||
"SHEBANG" => token::Shebang(Name(0)),
|
"SHEBANG" => token::Shebang(Name(0)),
|
||||||
_ => continue,
|
_ => continue,
|
||||||
|
@ -137,8 +137,8 @@ fn str_to_binop(s: &str) -> token::BinOpToken {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Assuming a string/binary literal, strip out the leading/trailing
|
/// Assuming a string/byte string literal, strip out the leading/trailing
|
||||||
/// hashes and surrounding quotes/raw/binary prefix.
|
/// hashes and surrounding quotes/raw/byte prefix.
|
||||||
fn fix(mut lit: &str) -> ast::Name {
|
fn fix(mut lit: &str) -> ast::Name {
|
||||||
if lit.char_at(0) == 'r' {
|
if lit.char_at(0) == 'r' {
|
||||||
if lit.char_at(1) == 'b' {
|
if lit.char_at(1) == 'b' {
|
||||||
|
@ -205,8 +205,8 @@ fn parse_antlr_token(s: &str, tokens: &HashMap<String, token::Token>, surrogate_
|
||||||
token::DocComment(..) => token::DocComment(nm),
|
token::DocComment(..) => token::DocComment(nm),
|
||||||
token::Literal(token::Integer(..), n) => token::Literal(token::Integer(nm), n),
|
token::Literal(token::Integer(..), n) => token::Literal(token::Integer(nm), n),
|
||||||
token::Literal(token::Float(..), n) => token::Literal(token::Float(nm), n),
|
token::Literal(token::Float(..), n) => token::Literal(token::Float(nm), n),
|
||||||
token::Literal(token::Binary(..), n) => token::Literal(token::Binary(nm), n),
|
token::Literal(token::ByteStr(..), n) => token::Literal(token::ByteStr(nm), n),
|
||||||
token::Literal(token::BinaryRaw(..), n) => token::Literal(token::BinaryRaw(fix(content),
|
token::Literal(token::ByteStrRaw(..), n) => token::Literal(token::ByteStrRaw(fix(content),
|
||||||
count(content)), n),
|
count(content)), n),
|
||||||
token::Ident(..) => token::Ident(ast::Ident { name: nm, ctxt: 0 },
|
token::Ident(..) => token::Ident(ast::Ident { name: nm, ctxt: 0 },
|
||||||
token::ModName),
|
token::ModName),
|
||||||
|
@ -340,8 +340,8 @@ fn main() {
|
||||||
token::Literal(token::Float(..), _),
|
token::Literal(token::Float(..), _),
|
||||||
token::Literal(token::Str_(..), _),
|
token::Literal(token::Str_(..), _),
|
||||||
token::Literal(token::StrRaw(..), _),
|
token::Literal(token::StrRaw(..), _),
|
||||||
token::Literal(token::Binary(..), _),
|
token::Literal(token::ByteStr(..), _),
|
||||||
token::Literal(token::BinaryRaw(..), _),
|
token::Literal(token::ByteStrRaw(..), _),
|
||||||
token::Ident(..),
|
token::Ident(..),
|
||||||
token::Lifetime(..),
|
token::Lifetime(..),
|
||||||
token::Interpolated(..),
|
token::Interpolated(..),
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
//! fn main() {
|
//! fn main() {
|
||||||
//! // Create a reference counted Owner.
|
//! // Create a reference counted Owner.
|
||||||
//! let gadget_owner : Rc<Owner> = Rc::new(
|
//! let gadget_owner : Rc<Owner> = Rc::new(
|
||||||
//! Owner { name: String::from("Gadget Man") }
|
//! Owner { name: String::from("Gadget Man") }
|
||||||
//! );
|
//! );
|
||||||
//!
|
//!
|
||||||
//! // Create Gadgets belonging to gadget_owner. To increment the reference
|
//! // Create Gadgets belonging to gadget_owner. To increment the reference
|
||||||
|
@ -102,13 +102,13 @@
|
||||||
//!
|
//!
|
||||||
//! struct Owner {
|
//! struct Owner {
|
||||||
//! name: String,
|
//! name: String,
|
||||||
//! gadgets: RefCell<Vec<Weak<Gadget>>>
|
//! gadgets: RefCell<Vec<Weak<Gadget>>>,
|
||||||
//! // ...other fields
|
//! // ...other fields
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
//! struct Gadget {
|
//! struct Gadget {
|
||||||
//! id: i32,
|
//! id: i32,
|
||||||
//! owner: Rc<Owner>
|
//! owner: Rc<Owner>,
|
||||||
//! // ...other fields
|
//! // ...other fields
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
|
@ -117,10 +117,10 @@
|
||||||
//! // Owner's vector of Gadgets inside a RefCell so that we can mutate it
|
//! // Owner's vector of Gadgets inside a RefCell so that we can mutate it
|
||||||
//! // through a shared reference.
|
//! // through a shared reference.
|
||||||
//! let gadget_owner : Rc<Owner> = Rc::new(
|
//! let gadget_owner : Rc<Owner> = Rc::new(
|
||||||
//! Owner {
|
//! Owner {
|
||||||
//! name: "Gadget Man".to_string(),
|
//! name: "Gadget Man".to_string(),
|
||||||
//! gadgets: RefCell::new(Vec::new())
|
//! gadgets: RefCell::new(Vec::new()),
|
||||||
//! }
|
//! }
|
||||||
//! );
|
//! );
|
||||||
//!
|
//!
|
||||||
//! // Create Gadgets belonging to gadget_owner as before.
|
//! // Create Gadgets belonging to gadget_owner as before.
|
||||||
|
|
|
@ -269,7 +269,7 @@ pub enum ConstVal {
|
||||||
Int(i64),
|
Int(i64),
|
||||||
Uint(u64),
|
Uint(u64),
|
||||||
Str(InternedString),
|
Str(InternedString),
|
||||||
Binary(Rc<Vec<u8>>),
|
ByteStr(Rc<Vec<u8>>),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
Struct(ast::NodeId),
|
Struct(ast::NodeId),
|
||||||
Tuple(ast::NodeId),
|
Tuple(ast::NodeId),
|
||||||
|
@ -283,7 +283,7 @@ impl ConstVal {
|
||||||
Int(_) => "positive integer",
|
Int(_) => "positive integer",
|
||||||
Uint(_) => "unsigned integer",
|
Uint(_) => "unsigned integer",
|
||||||
Str(_) => "string literal",
|
Str(_) => "string literal",
|
||||||
Binary(_) => "binary array",
|
ByteStr(_) => "byte string literal",
|
||||||
Bool(_) => "boolean",
|
Bool(_) => "boolean",
|
||||||
Struct(_) => "struct",
|
Struct(_) => "struct",
|
||||||
Tuple(_) => "tuple",
|
Tuple(_) => "tuple",
|
||||||
|
@ -1175,8 +1175,8 @@ fn cast_const<'tcx>(tcx: &ty::ctxt<'tcx>, val: ConstVal, ty: Ty) -> CastResult {
|
||||||
fn lit_to_const(lit: &hir::Lit, ty_hint: Option<Ty>) -> ConstVal {
|
fn lit_to_const(lit: &hir::Lit, ty_hint: Option<Ty>) -> ConstVal {
|
||||||
match lit.node {
|
match lit.node {
|
||||||
hir::LitStr(ref s, _) => Str((*s).clone()),
|
hir::LitStr(ref s, _) => Str((*s).clone()),
|
||||||
hir::LitBinary(ref data) => {
|
hir::LitByteStr(ref data) => {
|
||||||
Binary(data.clone())
|
ByteStr(data.clone())
|
||||||
}
|
}
|
||||||
hir::LitByte(n) => Uint(n as u64),
|
hir::LitByte(n) => Uint(n as u64),
|
||||||
hir::LitChar(n) => Uint(n as u64),
|
hir::LitChar(n) => Uint(n as u64),
|
||||||
|
@ -1214,7 +1214,7 @@ pub fn compare_const_vals(a: &ConstVal, b: &ConstVal) -> Option<Ordering> {
|
||||||
}
|
}
|
||||||
(&Str(ref a), &Str(ref b)) => a.cmp(b),
|
(&Str(ref a), &Str(ref b)) => a.cmp(b),
|
||||||
(&Bool(a), &Bool(b)) => a.cmp(&b),
|
(&Bool(a), &Bool(b)) => a.cmp(&b),
|
||||||
(&Binary(ref a), &Binary(ref b)) => a.cmp(b),
|
(&ByteStr(ref a), &ByteStr(ref b)) => a.cmp(b),
|
||||||
_ => return None
|
_ => return None
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -838,7 +838,7 @@ pub enum Lit_ {
|
||||||
/// A string literal (`"foo"`)
|
/// A string literal (`"foo"`)
|
||||||
LitStr(InternedString, StrStyle),
|
LitStr(InternedString, StrStyle),
|
||||||
/// A byte string (`b"foo"`)
|
/// A byte string (`b"foo"`)
|
||||||
LitBinary(Rc<Vec<u8>>),
|
LitByteStr(Rc<Vec<u8>>),
|
||||||
/// A byte char (`b'f'`)
|
/// A byte char (`b'f'`)
|
||||||
LitByte(u8),
|
LitByte(u8),
|
||||||
/// A character literal (`'a'`)
|
/// A character literal (`'a'`)
|
||||||
|
|
|
@ -664,7 +664,7 @@ pub fn lower_lit(l: &Lit) -> hir::Lit {
|
||||||
Spanned {
|
Spanned {
|
||||||
node: match l.node {
|
node: match l.node {
|
||||||
LitStr(ref i, s) => hir::LitStr(i.clone(), lower_string_style(s)),
|
LitStr(ref i, s) => hir::LitStr(i.clone(), lower_string_style(s)),
|
||||||
LitBinary(ref b) => hir::LitBinary(b.clone()),
|
LitByteStr(ref b) => hir::LitByteStr(b.clone()),
|
||||||
LitByte(u) => hir::LitByte(u),
|
LitByte(u) => hir::LitByte(u),
|
||||||
LitChar(c) => hir::LitChar(c),
|
LitChar(c) => hir::LitChar(c),
|
||||||
LitInt(u, ref t) => hir::LitInt(u, lower_lit_int_type(t)),
|
LitInt(u, ref t) => hir::LitInt(u, lower_lit_int_type(t)),
|
||||||
|
@ -680,7 +680,7 @@ pub fn unlower_lit(l: &hir::Lit) -> Lit {
|
||||||
Spanned {
|
Spanned {
|
||||||
node: match l.node {
|
node: match l.node {
|
||||||
hir::LitStr(ref i, s) => LitStr(i.clone(), unlower_string_style(s)),
|
hir::LitStr(ref i, s) => LitStr(i.clone(), unlower_string_style(s)),
|
||||||
hir::LitBinary(ref b) => LitBinary(b.clone()),
|
hir::LitByteStr(ref b) => LitByteStr(b.clone()),
|
||||||
hir::LitByte(u) => LitByte(u),
|
hir::LitByte(u) => LitByte(u),
|
||||||
hir::LitChar(c) => LitChar(c),
|
hir::LitChar(c) => LitChar(c),
|
||||||
hir::LitInt(u, ref t) => LitInt(u, unlower_lit_int_type(t)),
|
hir::LitInt(u, ref t) => LitInt(u, unlower_lit_int_type(t)),
|
||||||
|
|
|
@ -2549,7 +2549,7 @@ impl<'a> State<'a> {
|
||||||
hir::LitBool(val) => {
|
hir::LitBool(val) => {
|
||||||
if val { word(&mut self.s, "true") } else { word(&mut self.s, "false") }
|
if val { word(&mut self.s, "true") } else { word(&mut self.s, "false") }
|
||||||
}
|
}
|
||||||
hir::LitBinary(ref v) => {
|
hir::LitByteStr(ref v) => {
|
||||||
let mut escaped: String = String::new();
|
let mut escaped: String = String::new();
|
||||||
for &ch in v.iter() {
|
for &ch in v.iter() {
|
||||||
escaped.extend(ascii::escape_default(ch)
|
escaped.extend(ascii::escape_default(ch)
|
||||||
|
|
|
@ -94,8 +94,8 @@ pub fn const_lit(cx: &CrateContext, e: &hir::Expr, lit: &hir::Lit)
|
||||||
}
|
}
|
||||||
hir::LitBool(b) => C_bool(cx, b),
|
hir::LitBool(b) => C_bool(cx, b),
|
||||||
hir::LitStr(ref s, _) => C_str_slice(cx, (*s).clone()),
|
hir::LitStr(ref s, _) => C_str_slice(cx, (*s).clone()),
|
||||||
hir::LitBinary(ref data) => {
|
hir::LitByteStr(ref data) => {
|
||||||
addr_of(cx, C_bytes(cx, &data[..]), "binary")
|
addr_of(cx, C_bytes(cx, &data[..]), "byte_str")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ pub fn check_pat<'a, 'tcx>(pcx: &pat_ctxt<'a, 'tcx>,
|
||||||
// They can denote both statically and dynamically sized byte arrays
|
// They can denote both statically and dynamically sized byte arrays
|
||||||
let mut pat_ty = expr_ty;
|
let mut pat_ty = expr_ty;
|
||||||
if let hir::ExprLit(ref lt) = lt.node {
|
if let hir::ExprLit(ref lt) = lt.node {
|
||||||
if let hir::LitBinary(_) = lt.node {
|
if let hir::LitByteStr(_) = lt.node {
|
||||||
let expected_ty = structurally_resolved_type(fcx, pat.span, expected);
|
let expected_ty = structurally_resolved_type(fcx, pat.span, expected);
|
||||||
if let ty::TyRef(_, mt) = expected_ty.sty {
|
if let ty::TyRef(_, mt) = expected_ty.sty {
|
||||||
if let ty::TySlice(_) = mt.ty.sty {
|
if let ty::TySlice(_) = mt.ty.sty {
|
||||||
|
|
|
@ -2633,7 +2633,7 @@ fn check_lit<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
||||||
|
|
||||||
match lit.node {
|
match lit.node {
|
||||||
hir::LitStr(..) => tcx.mk_static_str(),
|
hir::LitStr(..) => tcx.mk_static_str(),
|
||||||
hir::LitBinary(ref v) => {
|
hir::LitByteStr(ref v) => {
|
||||||
tcx.mk_imm_ref(tcx.mk_region(ty::ReStatic),
|
tcx.mk_imm_ref(tcx.mk_region(ty::ReStatic),
|
||||||
tcx.mk_array(tcx.types.u8, v.len()))
|
tcx.mk_array(tcx.types.u8, v.len()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -2518,7 +2518,7 @@ impl ToSource for syntax::codemap::Span {
|
||||||
fn lit_to_string(lit: &hir::Lit) -> String {
|
fn lit_to_string(lit: &hir::Lit) -> String {
|
||||||
match lit.node {
|
match lit.node {
|
||||||
hir::LitStr(ref st, _) => st.to_string(),
|
hir::LitStr(ref st, _) => st.to_string(),
|
||||||
hir::LitBinary(ref data) => format!("{:?}", data),
|
hir::LitByteStr(ref data) => format!("{:?}", data),
|
||||||
hir::LitByte(b) => {
|
hir::LitByte(b) => {
|
||||||
let mut res = String::from("b'");
|
let mut res = String::from("b'");
|
||||||
for c in (b as char).escape_default() {
|
for c in (b as char).escape_default() {
|
||||||
|
|
|
@ -131,7 +131,7 @@ fn doit(sess: &parse::ParseSess, mut lexer: lexer::StringReader,
|
||||||
match lit {
|
match lit {
|
||||||
// text literals
|
// text literals
|
||||||
token::Byte(..) | token::Char(..) |
|
token::Byte(..) | token::Char(..) |
|
||||||
token::Binary(..) | token::BinaryRaw(..) |
|
token::ByteStr(..) | token::ByteStrRaw(..) |
|
||||||
token::Str_(..) | token::StrRaw(..) => "string",
|
token::Str_(..) | token::StrRaw(..) => "string",
|
||||||
|
|
||||||
// number literals
|
// number literals
|
||||||
|
|
|
@ -1190,7 +1190,7 @@ pub enum Lit_ {
|
||||||
/// A string literal (`"foo"`)
|
/// A string literal (`"foo"`)
|
||||||
LitStr(InternedString, StrStyle),
|
LitStr(InternedString, StrStyle),
|
||||||
/// A byte string (`b"foo"`)
|
/// A byte string (`b"foo"`)
|
||||||
LitBinary(Rc<Vec<u8>>),
|
LitByteStr(Rc<Vec<u8>>),
|
||||||
/// A byte char (`b'f'`)
|
/// A byte char (`b'f'`)
|
||||||
LitByte(u8),
|
LitByte(u8),
|
||||||
/// A character literal (`'a'`)
|
/// A character literal (`'a'`)
|
||||||
|
|
|
@ -50,8 +50,8 @@ pub fn expand_syntax_ext(cx: &mut base::ExtCtxt,
|
||||||
accumulator.push_str(&format!("{}", b));
|
accumulator.push_str(&format!("{}", b));
|
||||||
}
|
}
|
||||||
ast::LitByte(..) |
|
ast::LitByte(..) |
|
||||||
ast::LitBinary(..) => {
|
ast::LitByteStr(..) => {
|
||||||
cx.span_err(e.span, "cannot concatenate a binary literal");
|
cx.span_err(e.span, "cannot concatenate a byte string literal");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,7 +189,7 @@ pub fn expand_include_bytes(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
|
||||||
let filename = format!("{}", file.display());
|
let filename = format!("{}", file.display());
|
||||||
cx.codemap().new_filemap_and_lines(&filename, "");
|
cx.codemap().new_filemap_and_lines(&filename, "");
|
||||||
|
|
||||||
base::MacEager::expr(cx.expr_lit(sp, ast::LitBinary(Rc::new(bytes))))
|
base::MacEager::expr(cx.expr_lit(sp, ast::LitByteStr(Rc::new(bytes))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1304,7 +1304,7 @@ impl<'a> StringReader<'a> {
|
||||||
}
|
}
|
||||||
let id = if valid { self.name_from(start) } else { token::intern("??") };
|
let id = if valid { self.name_from(start) } else { token::intern("??") };
|
||||||
self.bump();
|
self.bump();
|
||||||
return token::Binary(id);
|
return token::ByteStr(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_raw_byte_string(&mut self) -> token::Lit {
|
fn scan_raw_byte_string(&mut self) -> token::Lit {
|
||||||
|
@ -1355,7 +1355,7 @@ impl<'a> StringReader<'a> {
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
self.bump();
|
self.bump();
|
||||||
return token::BinaryRaw(self.name_from_to(content_start_bpos,
|
return token::ByteStrRaw(self.name_from_to(content_start_bpos,
|
||||||
content_end_bpos),
|
content_end_bpos),
|
||||||
hash_count);
|
hash_count);
|
||||||
}
|
}
|
||||||
|
@ -1546,7 +1546,7 @@ mod tests {
|
||||||
test!("'a'", Char, "a");
|
test!("'a'", Char, "a");
|
||||||
test!("b'a'", Byte, "a");
|
test!("b'a'", Byte, "a");
|
||||||
test!("\"a\"", Str_, "a");
|
test!("\"a\"", Str_, "a");
|
||||||
test!("b\"a\"", Binary, "a");
|
test!("b\"a\"", ByteStr, "a");
|
||||||
test!("1234", Integer, "1234");
|
test!("1234", Integer, "1234");
|
||||||
test!("0b101", Integer, "0b101");
|
test!("0b101", Integer, "0b101");
|
||||||
test!("0xABC", Integer, "0xABC");
|
test!("0xABC", Integer, "0xABC");
|
||||||
|
@ -1560,7 +1560,7 @@ mod tests {
|
||||||
token::Literal(token::StrRaw(token::intern("raw"), 3),
|
token::Literal(token::StrRaw(token::intern("raw"), 3),
|
||||||
Some(token::intern("suffix"))));
|
Some(token::intern("suffix"))));
|
||||||
assert_eq!(setup(&mk_sh(), "br###\"raw\"###suffix".to_string()).next_token().tok,
|
assert_eq!(setup(&mk_sh(), "br###\"raw\"###suffix".to_string()).next_token().tok,
|
||||||
token::Literal(token::BinaryRaw(token::intern("raw"), 3),
|
token::Literal(token::ByteStrRaw(token::intern("raw"), 3),
|
||||||
Some(token::intern("suffix"))));
|
Some(token::intern("suffix"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -499,7 +499,7 @@ pub fn byte_lit(lit: &str) -> (u8, usize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn binary_lit(lit: &str) -> Rc<Vec<u8>> {
|
pub fn byte_str_lit(lit: &str) -> Rc<Vec<u8>> {
|
||||||
let mut res = Vec::with_capacity(lit.len());
|
let mut res = Vec::with_capacity(lit.len());
|
||||||
|
|
||||||
// FIXME #8372: This could be a for-loop if it didn't borrow the iterator
|
// FIXME #8372: This could be a for-loop if it didn't borrow the iterator
|
||||||
|
@ -517,7 +517,7 @@ pub fn binary_lit(lit: &str) -> Rc<Vec<u8>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// binary literals *must* be ASCII, but the escapes don't have to be
|
// byte string literals *must* be ASCII, but the escapes don't have to be
|
||||||
let mut chars = lit.bytes().enumerate().peekable();
|
let mut chars = lit.bytes().enumerate().peekable();
|
||||||
loop {
|
loop {
|
||||||
match chars.next() {
|
match chars.next() {
|
||||||
|
|
|
@ -34,7 +34,7 @@ use ast::{ItemEnum, ItemFn, ItemForeignMod, ItemImpl, ItemConst};
|
||||||
use ast::{ItemMac, ItemMod, ItemStruct, ItemTrait, ItemTy, ItemDefaultImpl};
|
use ast::{ItemMac, ItemMod, ItemStruct, ItemTrait, ItemTy, ItemDefaultImpl};
|
||||||
use ast::{ItemExternCrate, ItemUse};
|
use ast::{ItemExternCrate, ItemUse};
|
||||||
use ast::{LifetimeDef, Lit, Lit_};
|
use ast::{LifetimeDef, Lit, Lit_};
|
||||||
use ast::{LitBool, LitChar, LitByte, LitBinary};
|
use ast::{LitBool, LitChar, LitByte, LitByteStr};
|
||||||
use ast::{LitStr, LitInt, Local};
|
use ast::{LitStr, LitInt, Local};
|
||||||
use ast::{MacStmtWithBraces, MacStmtWithSemicolon, MacStmtWithoutBraces};
|
use ast::{MacStmtWithBraces, MacStmtWithSemicolon, MacStmtWithoutBraces};
|
||||||
use ast::{MutImmutable, MutMutable, Mac_, MacInvocTT, MatchSource};
|
use ast::{MutImmutable, MutMutable, Mac_, MacInvocTT, MatchSource};
|
||||||
|
@ -1543,11 +1543,11 @@ impl<'a> Parser<'a> {
|
||||||
token::intern_and_get_ident(&parse::raw_str_lit(&s.as_str())),
|
token::intern_and_get_ident(&parse::raw_str_lit(&s.as_str())),
|
||||||
ast::RawStr(n)))
|
ast::RawStr(n)))
|
||||||
}
|
}
|
||||||
token::Binary(i) =>
|
token::ByteStr(i) =>
|
||||||
(true, LitBinary(parse::binary_lit(&i.as_str()))),
|
(true, LitByteStr(parse::byte_str_lit(&i.as_str()))),
|
||||||
token::BinaryRaw(i, _) =>
|
token::ByteStrRaw(i, _) =>
|
||||||
(true,
|
(true,
|
||||||
LitBinary(Rc::new(i.to_string().into_bytes()))),
|
LitByteStr(Rc::new(i.to_string().into_bytes()))),
|
||||||
};
|
};
|
||||||
|
|
||||||
if suffix_illegal {
|
if suffix_illegal {
|
||||||
|
@ -5826,7 +5826,7 @@ impl<'a> Parser<'a> {
|
||||||
match try!(self.parse_optional_str()) {
|
match try!(self.parse_optional_str()) {
|
||||||
Some((s, style, suf)) => {
|
Some((s, style, suf)) => {
|
||||||
let sp = self.last_span;
|
let sp = self.last_span;
|
||||||
self.expect_no_suffix(sp, "str literal", suf);
|
self.expect_no_suffix(sp, "string literal", suf);
|
||||||
Ok((s, style))
|
Ok((s, style))
|
||||||
}
|
}
|
||||||
_ => Err(self.fatal("expected string literal"))
|
_ => Err(self.fatal("expected string literal"))
|
||||||
|
|
|
@ -82,8 +82,8 @@ pub enum Lit {
|
||||||
Float(ast::Name),
|
Float(ast::Name),
|
||||||
Str_(ast::Name),
|
Str_(ast::Name),
|
||||||
StrRaw(ast::Name, usize), /* raw str delimited by n hash symbols */
|
StrRaw(ast::Name, usize), /* raw str delimited by n hash symbols */
|
||||||
Binary(ast::Name),
|
ByteStr(ast::Name),
|
||||||
BinaryRaw(ast::Name, usize), /* raw binary str delimited by n hash symbols */
|
ByteStrRaw(ast::Name, usize), /* raw byte str delimited by n hash symbols */
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Lit {
|
impl Lit {
|
||||||
|
@ -93,8 +93,8 @@ impl Lit {
|
||||||
Char(_) => "char",
|
Char(_) => "char",
|
||||||
Integer(_) => "integer",
|
Integer(_) => "integer",
|
||||||
Float(_) => "float",
|
Float(_) => "float",
|
||||||
Str_(_) | StrRaw(..) => "str",
|
Str_(_) | StrRaw(..) => "string",
|
||||||
Binary(_) | BinaryRaw(..) => "binary str"
|
ByteStr(_) | ByteStrRaw(..) => "byte string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,8 +259,8 @@ pub fn token_to_string(tok: &Token) -> String {
|
||||||
token::StrRaw(s, n) => format!("r{delim}\"{string}\"{delim}",
|
token::StrRaw(s, n) => format!("r{delim}\"{string}\"{delim}",
|
||||||
delim=repeat("#", n),
|
delim=repeat("#", n),
|
||||||
string=s),
|
string=s),
|
||||||
token::Binary(v) => format!("b\"{}\"", v),
|
token::ByteStr(v) => format!("b\"{}\"", v),
|
||||||
token::BinaryRaw(s, n) => format!("br{delim}\"{string}\"{delim}",
|
token::ByteStrRaw(s, n) => format!("br{delim}\"{string}\"{delim}",
|
||||||
delim=repeat("#", n),
|
delim=repeat("#", n),
|
||||||
string=s),
|
string=s),
|
||||||
};
|
};
|
||||||
|
@ -2887,7 +2887,7 @@ impl<'a> State<'a> {
|
||||||
ast::LitBool(val) => {
|
ast::LitBool(val) => {
|
||||||
if val { word(&mut self.s, "true") } else { word(&mut self.s, "false") }
|
if val { word(&mut self.s, "true") } else { word(&mut self.s, "false") }
|
||||||
}
|
}
|
||||||
ast::LitBinary(ref v) => {
|
ast::LitByteStr(ref v) => {
|
||||||
let mut escaped: String = String::new();
|
let mut escaped: String = String::new();
|
||||||
for &ch in v.iter() {
|
for &ch in v.iter() {
|
||||||
escaped.extend(ascii::escape_default(ch)
|
escaped.extend(ascii::escape_default(ch)
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
concat!(b'f'); //~ ERROR: cannot concatenate a binary literal
|
concat!(b'f'); //~ ERROR: cannot concatenate a byte string literal
|
||||||
concat!(b"foo"); //~ ERROR: cannot concatenate a binary literal
|
concat!(b"foo"); //~ ERROR: cannot concatenate a byte string literal
|
||||||
concat!(foo); //~ ERROR: expected a literal
|
concat!(foo); //~ ERROR: expected a literal
|
||||||
concat!(foo()); //~ ERROR: expected a literal
|
concat!(foo()); //~ ERROR: expected a literal
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,10 +20,10 @@ extern
|
||||||
{}
|
{}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
""suffix; //~ ERROR str literal with a suffix is invalid
|
""suffix; //~ ERROR string literal with a suffix is invalid
|
||||||
b""suffix; //~ ERROR binary str literal with a suffix is invalid
|
b""suffix; //~ ERROR byte string literal with a suffix is invalid
|
||||||
r#""#suffix; //~ ERROR str literal with a suffix is invalid
|
r#""#suffix; //~ ERROR string literal with a suffix is invalid
|
||||||
br#""#suffix; //~ ERROR binary str literal with a suffix is invalid
|
br#""#suffix; //~ ERROR byte string literal with a suffix is invalid
|
||||||
'a'suffix; //~ ERROR char literal with a suffix is invalid
|
'a'suffix; //~ ERROR char literal with a suffix is invalid
|
||||||
b'a'suffix; //~ ERROR byte literal with a suffix is invalid
|
b'a'suffix; //~ ERROR byte literal with a suffix is invalid
|
||||||
|
|
||||||
|
|
|
@ -11,5 +11,5 @@ all:
|
||||||
$(RUSTC) lib.rs --emit=asm --crate-type=staticlib
|
$(RUSTC) lib.rs --emit=asm --crate-type=staticlib
|
||||||
# just check for symbol declarations with the names we're expecting.
|
# just check for symbol declarations with the names we're expecting.
|
||||||
grep 'str[0-9][0-9]*:' $(OUT)
|
grep 'str[0-9][0-9]*:' $(OUT)
|
||||||
grep 'binary[0-9][0-9]*:' $(OUT)
|
grep 'byte_str[0-9][0-9]*:' $(OUT)
|
||||||
grep 'vtable[0-9][0-9]*' $(OUT)
|
grep 'vtable[0-9][0-9]*' $(OUT)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue