diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/rust-exp.y | 12 | ||||
-rw-r--r-- | gdb/symtab.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/simple.exp | 8 |
5 files changed, 31 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8c6a4f4..513cb6b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-07-14 Tom Tromey <tom@tromey.com> + + PR rust/21763: + * symtab.c (symbol_matches_domain): Add language_rust to special + case. + * rust-exp.y (convert_ast_to_expression) <OP_VAR_VALUE>: Don't + treat LOC_TYPEDEF symbols as variables. + 2017-07-14 Pedro Alves <palves@redhat.com> * symtab.c (make_file_symbol_completion_list_1): Iterate over diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index c7361bc..821abcd 100644 --- a/gdb/rust-exp.y +++ b/gdb/rust-exp.y @@ -2316,7 +2316,7 @@ convert_ast_to_expression (struct parser_state *state, varname = convert_name (state, operation); sym = rust_lookup_symbol (varname, expression_context_block, VAR_DOMAIN); - if (sym.symbol != NULL) + if (sym.symbol != NULL && SYMBOL_CLASS (sym.symbol) != LOC_TYPEDEF) { write_exp_elt_opcode (state, OP_VAR_VALUE); write_exp_elt_block (state, sym.block); @@ -2325,9 +2325,15 @@ convert_ast_to_expression (struct parser_state *state, } else { - struct type *type; + struct type *type = NULL; - type = rust_lookup_type (varname, expression_context_block); + if (sym.symbol != NULL) + { + gdb_assert (SYMBOL_CLASS (sym.symbol) == LOC_TYPEDEF); + type = SYMBOL_TYPE (sym.symbol); + } + if (type == NULL) + type = rust_lookup_type (varname, expression_context_block); if (type == NULL) error (_("No symbol '%s' in current context"), varname); diff --git a/gdb/symtab.c b/gdb/symtab.c index c7f1311..519b7dd 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2625,7 +2625,8 @@ symbol_matches_domain (enum language symbol_language, Similarly, any Ada type declaration implicitly defines a typedef. */ if (symbol_language == language_cplus || symbol_language == language_d - || symbol_language == language_ada) + || symbol_language == language_ada + || symbol_language == language_rust) { if ((domain == VAR_DOMAIN || domain == STRUCT_DOMAIN) && symbol_domain == STRUCT_DOMAIN) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 07c5a52..b715bfd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-07-14 Tom Tromey <tom@tromey.com> + + * gdb.rust/simple.exp: Add regression test for PR rust/21763. + 2017-07-14 Pedro Alves <palves@redhat.com> * gdb.linespec/base/one/thefile.cc (z1): New function. diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 872b22c..db23162 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -246,3 +246,11 @@ gdb_test "print parametrized.next.val" \ " = \\(simple::ParametrizedStruct<i32> \\*\\) $hex" gdb_test "print parametrized" \ " = simple::ParametrizedStruct<i32> \\{next: simple::ParametrizedEnum<\[a-z:\]*Box<simple::ParametrizedStruct<i32>>>::Val\\{val: $hex\\}, value: 0\\}" + + +load_lib gdb-python.exp +if {[skip_python_tests]} { + continue +} + +gdb_test "python print(gdb.lookup_type('simple::HiBob'))" "simple::HiBob" |