From 12df5c002dcbfc5ac54983e1e7040a182f71a753 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 11 Jul 2016 15:02:10 -0600 Subject: [PATCH] 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 * 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 * gdb.rust/simple.rs (main): Use empty struct expression. * gdb.rust/simple.exp: Add tests for empty struct expression. --- 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 706c34d81da..4a585355cf3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2016-07-21 Tom Tromey + + * 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 * configure: Rebuild. diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index 456ffe586c4..6dc4704efe7 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 3deb52586ee..481a4fc5943 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 d985c884e02..547776147c4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-21 Tom Tromey + + * gdb.rust/simple.rs (main): Use empty struct expression. + * gdb.rust/simple.exp: Add tests for empty struct expression. + 2016-07-21 Yao Qi * 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 32b3785c971..5e00b03c088 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 49808261324..eeff3d71f9c 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)); -- 2.30.2