Support bare-identifier field initializers in Rust
In Rust one can initialize a struct member from an identically-named local variable by simply mentioning the member name in the initializer, like: let x = 0; let y = Struct { x }; This initializes "Struct::x" from "x". This patch adds this form of initializer to the Rust expression parser and adds a test. Tested on x86-64 Fedora 26 using rustc 1.23. 2018-03-19 Tom Tromey <tom@tromey.com> * rust-exp.y (struct_expr_tail, struct_expr_list): Add plain "IDENT" production. 2018-03-19 Tom Tromey <tom@tromey.com> * gdb.rust/simple.rs (main): Add local variables field1, field2, y0. * gdb.rust/simple.exp: Test bare identifier form of struct initializer.
This commit is contained in:
parent
76727919ce
commit
926300415b
@ -1,3 +1,8 @@
|
|||||||
|
2018-03-19 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* rust-exp.y (struct_expr_tail, struct_expr_list): Add plain
|
||||||
|
"IDENT" production.
|
||||||
|
|
||||||
2018-03-19 Pedro Alves <palves@redhat.com>
|
2018-03-19 Pedro Alves <palves@redhat.com>
|
||||||
Tom Tromey <tom@tromey.com>
|
Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
@ -481,6 +481,14 @@ struct_expr_tail:
|
|||||||
sf.init = $3;
|
sf.init = $3;
|
||||||
$$ = sf;
|
$$ = sf;
|
||||||
}
|
}
|
||||||
|
| IDENT
|
||||||
|
{
|
||||||
|
struct set_field sf;
|
||||||
|
|
||||||
|
sf.name = $1;
|
||||||
|
sf.init = ast_path ($1, NULL);
|
||||||
|
$$ = sf;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
struct_expr_list:
|
struct_expr_list:
|
||||||
@ -503,6 +511,15 @@ struct_expr_list:
|
|||||||
$5->push_back (sf);
|
$5->push_back (sf);
|
||||||
$$ = $5;
|
$$ = $5;
|
||||||
}
|
}
|
||||||
|
| IDENT ',' struct_expr_list
|
||||||
|
{
|
||||||
|
struct set_field sf;
|
||||||
|
|
||||||
|
sf.name = $1;
|
||||||
|
sf.init = ast_path ($1, NULL);
|
||||||
|
$3->push_back (sf);
|
||||||
|
$$ = $3;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
array_expr:
|
array_expr:
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2018-03-19 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* gdb.rust/simple.rs (main): Add local variables field1, field2,
|
||||||
|
y0.
|
||||||
|
* gdb.rust/simple.exp: Test bare identifier form of struct
|
||||||
|
initializer.
|
||||||
|
|
||||||
2018-03-19 Tom Tromey <tom@tromey.com>
|
2018-03-19 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* gdb.gdb/observer.exp: Remove.
|
* gdb.gdb/observer.exp: Remove.
|
||||||
|
@ -166,6 +166,9 @@ gdb_test "print simple::HiBob + 5" \
|
|||||||
gdb_test "print nosuchsymbol" \
|
gdb_test "print nosuchsymbol" \
|
||||||
"No symbol 'nosuchsymbol' in current context"
|
"No symbol 'nosuchsymbol' in current context"
|
||||||
|
|
||||||
|
gdb_test "print simple::HiBob{field1, field2}" \
|
||||||
|
" = simple::HiBob \\{field1: 77, field2: 88\\}"
|
||||||
|
|
||||||
gdb_test "print e" " = simple::MoreComplicated::Two\\(73\\)"
|
gdb_test "print e" " = simple::MoreComplicated::Two\\(73\\)"
|
||||||
gdb_test "print e2" \
|
gdb_test "print e2" \
|
||||||
" = simple::MoreComplicated::Four\\{this: true, is: 8, a: 109 'm', struct_: 100, variant: 10\\}"
|
" = simple::MoreComplicated::Four\\{this: true, is: 8, a: 109 'm', struct_: 100, variant: 10\\}"
|
||||||
|
@ -112,6 +112,10 @@ fn main () {
|
|||||||
let y = HiBob {field1: 7, field2: 8};
|
let y = HiBob {field1: 7, field2: 8};
|
||||||
let z = ByeBob(7, 8);
|
let z = ByeBob(7, 8);
|
||||||
|
|
||||||
|
let field1 = 77;
|
||||||
|
let field2 = 88;
|
||||||
|
let y0 = HiBob { field1, field2 };
|
||||||
|
|
||||||
let univariant = Univariant::Foo {a : 1};
|
let univariant = Univariant::Foo {a : 1};
|
||||||
let univariant_anon = UnivariantAnon::Foo(1);
|
let univariant_anon = UnivariantAnon::Foo(1);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user