diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2024-06-24 18:45:37 +0200 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2024-06-24 18:45:37 +0200 |
commit | 5ae5974d60378fa3faecff64725e00c8695bcc7d (patch) | |
tree | 8b78e488803dfc72e650ec3bab61e030fcf069bb /gdb | |
parent | a6e529673a95670a9c3046c3681fe6864b2cd05c (diff) | |
download | binutils-5ae5974d60378fa3faecff64725e00c8695bcc7d.zip binutils-5ae5974d60378fa3faecff64725e00c8695bcc7d.tar.gz binutils-5ae5974d60378fa3faecff64725e00c8695bcc7d.tar.bz2 |
Fix gdb.lookup_type for function-local types
Looking for a type defined locally in a function doesn't work
any more since the introduction of TYPE_DOMAIN:
```
(gdb) python print (gdb.lookup_type ('main()::Local'))
Python Exception <class 'gdb.error'>: No type named main()::Local.
Error occurred in Python: No type named main()::Local.
```
cp_search_static_and_baseclasses was simply missing a check for
SEARCH_TYPE_DOMAIN, now it works again:
```
(gdb) python print (gdb.lookup_type ('main()::Local'))
Local
```
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31922
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/cp-namespace.c | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-type.c | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-type.exp | 6 |
3 files changed, 13 insertions, 2 deletions
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 89c1bbd..9d86fe2 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -287,10 +287,10 @@ cp_search_static_and_baseclasses (const char *name, struct type *scope_type = scope_sym.symbol->type (); /* If the scope is a function/method, then look up NESTED as a local - static variable. E.g., "print 'function()::static_var'". */ + static variable or type. E.g., "print 'function()::static_var'". */ if ((scope_type->code () == TYPE_CODE_FUNC || scope_type->code () == TYPE_CODE_METHOD) - && (domain & SEARCH_VAR_DOMAIN) != 0) + && (domain & (SEARCH_VAR_DOMAIN | SEARCH_TYPE_DOMAIN)) != 0) return lookup_symbol (nested, scope_sym.symbol->value_block (), domain, NULL); diff --git a/gdb/testsuite/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c index bedabc6..7a0df8a 100644 --- a/gdb/testsuite/gdb.python/py-type.c +++ b/gdb/testsuite/gdb.python/py-type.c @@ -118,6 +118,11 @@ main () c.a_method (0, 1); c.a_const_method (0, 1); C::a_static_method (0, 1); + + struct Local { int g; } l; + l.g = 5; + typedef int IntType; + IntType it = 6; #endif enum E e; diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp index 74e1234..e524959 100644 --- a/gdb/testsuite/gdb.python/py-type.exp +++ b/gdb/testsuite/gdb.python/py-type.exp @@ -85,6 +85,12 @@ proc test_fields {lang} { gdb_test "python print (gdb.parse_and_eval ('C::a_static_method').type.fields ()\[0\].type)" "int" gdb_test "python print (gdb.parse_and_eval ('C::a_static_method').type.fields ()\[1\].type)" "char" gdb_test "python print (gdb.parse_and_eval ('c')\['a_static_method'\].type.fields ()\[0\].type)" "int" + + # Test function-local types. + gdb_test "python print (gdb.lookup_type ('main()::Local'))" "Local" + gdb_test "python print (gdb.lookup_type ('main()::Local').fields ()\[0\].type)" "int" + gdb_test "python print (gdb.lookup_type ('main()::IntType'))" "IntType" + gdb_test "python print (gdb.lookup_type ('main()::IntType').target ())" "int" } # Test normal fields usage in structs. |