aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-03-19 10:25:05 -0600
committerTom Tromey <tom@tromey.com>2018-03-19 11:01:31 -0600
commit926300415b642367cdc2febac6619f8cb8a80b46 (patch)
tree4b0859a0bdf08f69f8ceb3e2ce69ad6bf1cf4441
parent76727919ceb590f03ff0f6db08b7ceab5b7aeaff (diff)
downloadgdb-926300415b642367cdc2febac6619f8cb8a80b46.zip
gdb-926300415b642367cdc2febac6619f8cb8a80b46.tar.gz
gdb-926300415b642367cdc2febac6619f8cb8a80b46.tar.bz2
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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/rust-exp.y17
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.rust/simple.exp3
-rw-r--r--gdb/testsuite/gdb.rust/simple.rs4
5 files changed, 36 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fe4ae9f..ac52a9a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
Tom Tromey <tom@tromey.com>
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index f1dcece..b661a80 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -481,6 +481,14 @@ struct_expr_tail:
sf.init = $3;
$$ = sf;
}
+| IDENT
+ {
+ struct set_field sf;
+
+ sf.name = $1;
+ sf.init = ast_path ($1, NULL);
+ $$ = sf;
+ }
;
struct_expr_list:
@@ -503,6 +511,15 @@ struct_expr_list:
$5->push_back (sf);
$$ = $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:
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c648fc5..f155ffe 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,12 @@
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>
+
* gdb.gdb/observer.exp: Remove.
2018-03-19 Andreas Arnez <arnez@linux.vnet.ibm.com>
diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp
index 230e6a7..2db596b 100644
--- a/gdb/testsuite/gdb.rust/simple.exp
+++ b/gdb/testsuite/gdb.rust/simple.exp
@@ -166,6 +166,9 @@ gdb_test "print simple::HiBob + 5" \
gdb_test "print nosuchsymbol" \
"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 e2" \
" = simple::MoreComplicated::Four\\{this: true, is: 8, a: 109 'm', struct_: 100, variant: 10\\}"
diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs
index 7e43cd8..b2b5dfe 100644
--- a/gdb/testsuite/gdb.rust/simple.rs
+++ b/gdb/testsuite/gdb.rust/simple.rs
@@ -112,6 +112,10 @@ fn main () {
let y = HiBob {field1: 7, field2: 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_anon = UnivariantAnon::Foo(1);