This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] Allow empty struct expressions in Rust
- From: Tom Tromey <tromey at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 21 Jul 2016 21:18:29 -0000
- Subject: [binutils-gdb] Allow empty struct expressions in Rust
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=12df5c002dcbfc5ac54983e1e7040a182f71a753
commit 12df5c002dcbfc5ac54983e1e7040a182f71a753
Author: Tom Tromey <tom@tromey.com>
Date: Mon Jul 11 15:02:10 2016 -0600
Allow empty struct expressions in Rust
I learned recently that empty struct expressions, like "X{}", have been
promoted from experimental to stable in Rust. This patch changes the
Rust expression parser to allow this case.
New test case included.
Built and regtested on x86-64 Fedora 23, using Rust 1.11 beta.
2016-07-21 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_tuple_struct_type_p): Return false for empty
structs.
* rust-exp.y (struct_expr_list): Allow empty elements.
2016-07-21 Tom Tromey <tom@tromey.com>
* gdb.rust/simple.rs (main): Use empty struct expression.
* gdb.rust/simple.exp: Add tests for empty struct expression.
Diff:
---
gdb/ChangeLog | 6 ++++++
gdb/rust-exp.y | 10 +++++++---
gdb/rust-lang.c | 5 ++++-
gdb/testsuite/ChangeLog | 5 +++++
gdb/testsuite/gdb.rust/simple.exp | 3 +++
gdb/testsuite/gdb.rust/simple.rs | 1 +
6 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 706c34d..4a58535 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2016-07-21 Tom Tromey <tom@tromey.com>
+ * rust-lang.c (rust_tuple_struct_type_p): Return false for empty
+ structs.
+ * rust-exp.y (struct_expr_list): Allow empty elements.
+
+2016-07-21 Tom Tromey <tom@tromey.com>
+
* configure: Rebuild.
* warning.m4 (AM_GDB_WARNINGS) <build_warnings>: Add
-Wunused-but-set-parameter, -Wunused-but-set-variable.
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index 456ffe5..6dc4704 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -428,10 +428,14 @@ struct_expr_tail:
}
;
-/* S{} is documented as valid but seems to be an unstable feature, so
- it is left out here. */
struct_expr_list:
- struct_expr_tail
+ /* %empty */
+ {
+ VEC (set_field) **result
+ = OBSTACK_ZALLOC (&work_obstack, VEC (set_field) *);
+ $$ = result;
+ }
+| struct_expr_tail
{
VEC (set_field) **result
= OBSTACK_ZALLOC (&work_obstack, VEC (set_field) *);
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 3deb525..481a4fc 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -294,7 +294,10 @@ rust_underscore_fields (struct type *type, int offset)
int
rust_tuple_struct_type_p (struct type *type)
{
- return rust_underscore_fields (type, 0);
+ /* This is just an approximation until DWARF can represent Rust more
+ precisely. We exclude zero-length structs because they may not
+ be tuple structs, and there's no way to tell. */
+ return TYPE_NFIELDS (type) > 0 && rust_underscore_fields (type, 0);
}
/* Return true if a variant TYPE is a tuple variant, false otherwise. */
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d985c88..5477761 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-21 Tom Tromey <tom@tromey.com>
+
+ * gdb.rust/simple.rs (main): Use empty struct expression.
+ * gdb.rust/simple.exp: Add tests for empty struct expression.
+
2016-07-21 Yao Qi <yao.qi@linaro.org>
* lib/gdbserver-support.exp (skip_gdbserver_tests): Return 1
diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp
index 32b3785..5e00b03 100644
--- a/gdb/testsuite/gdb.rust/simple.exp
+++ b/gdb/testsuite/gdb.rust/simple.exp
@@ -55,7 +55,10 @@ gdb_test "print *(&c as *mut i32)" " = 0"
gdb_test "print j" " = simple::Unit"
gdb_test "ptype j" " = struct simple::Unit"
+gdb_test "print j2" " = simple::Unit"
+gdb_test "ptype j2" " = struct simple::Unit"
gdb_test "print simple::Unit" " = simple::Unit"
+gdb_test "print simple::Unit{}" " = simple::Unit"
gdb_test "print g" " = \\(u8 \\(\\*\\)\\\[6\\\]\\) $hex b\"hi bob\""
gdb_test "ptype g" " = u8 \\(\\*\\)\\\[6\\\]"
diff --git a/gdb/testsuite/gdb.rust/simple.rs b/gdb/testsuite/gdb.rust/simple.rs
index 4980826..eeff3d7 100644
--- a/gdb/testsuite/gdb.rust/simple.rs
+++ b/gdb/testsuite/gdb.rust/simple.rs
@@ -81,6 +81,7 @@ fn main () {
let i = ["whatever"; 8];
let j = Unit;
+ let j2 = Unit{};
let k = SpaceSaver::Nothing;
let l = SpaceSaver::Thebox(9, Box::new(1729));