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 <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 Tom Tromey <tom@tromey.com> * gdb.rust/simple.exp: Add regression test for PR rust/21763.
This commit is contained in:
parent
8f14146e13
commit
65547233e0
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue