From: Tom Tromey Date: Thu, 13 Jul 2017 21:03:27 +0000 (-0600) Subject: Make gdb.lookup_typename work for Rust types X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=65547233e04b32e087f74f8f5e9d3ffb6fe2c198;p=binutils-gdb.git Make gdb.lookup_typename work for Rust types PR rust/21763 points out that gdb.lookup_typename does not work properly for (some) Rust types. I tracked this down to a missing case in symbol_matches_domain. Tested by the buildbot. 2017-07-14 Tom Tromey PR rust/21763: * symtab.c (symbol_matches_domain): Add language_rust to special case. * rust-exp.y (convert_ast_to_expression) : Don't treat LOC_TYPEDEF symbols as variables. 2017-07-14 Tom Tromey * gdb.rust/simple.exp: Add regression test for PR rust/21763. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8c6a4f4e90f..513cb6b0bcb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-07-14 Tom Tromey + + PR rust/21763: + * symtab.c (symbol_matches_domain): Add language_rust to special + case. + * rust-exp.y (convert_ast_to_expression) : Don't + treat LOC_TYPEDEF symbols as variables. + 2017-07-14 Pedro Alves * symtab.c (make_file_symbol_completion_list_1): Iterate over diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y index c7361bcd366..821abcdca2f 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 c7f1311c709..519b7dd6f2d 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 07c5a52f64d..b715bfd7fe1 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-07-14 Tom Tromey + + * gdb.rust/simple.exp: Add regression test for PR rust/21763. + 2017-07-14 Pedro Alves * 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 872b22c2fe7..db231623a4d 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 \\*\\) $hex" gdb_test "print parametrized" \ " = simple::ParametrizedStruct \\{next: simple::ParametrizedEnum<\[a-z:\]*Box>>::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"