Support bare-identifier field initializers in Rust
authorTom Tromey <tom@tromey.com>
Mon, 19 Mar 2018 16:25:05 +0000 (10:25 -0600)
committerTom Tromey <tom@tromey.com>
Mon, 19 Mar 2018 17:01:31 +0000 (11:01 -0600)
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.

gdb/ChangeLog
gdb/rust-exp.y
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.rust/simple.exp
gdb/testsuite/gdb.rust/simple.rs

index fe4ae9f684bb433c300bdc9ce861c095c59c3f76..ac52a9a666e44c517d2277664ee8fcdd699cb0cd 100644 (file)
@@ -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>
 
index f1dcecec96a8925226fc06bae7aa6bc9d8f846f4..b661a803e31af5263cb6bebb7026e5cf87adbccd 100644 (file)
@@ -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:
index c648fc518f471aab7835ebdafb732ed5be34c4aa..f155ffee716208900e77f8a4392554ac33e00b38 100644 (file)
@@ -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>
 
        * gdb.gdb/observer.exp: Remove.
index 230e6a7a8813342e03459809781eb814f135c7e5..2db596b9329f78313b37d2e1a9016002f585fa33 100644 (file)
@@ -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\\}"
index 7e43cd87074aebc5ec98f0f9fc57c09317c70cca..b2b5dfe0f6b2e7914b76c47ae20b38b1bc8ada94 100644 (file)
@@ -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);