diff options
author | Keith Seitz <keiths@redhat.com> | 2009-11-11 23:34:11 +0000 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2009-11-11 23:34:11 +0000 |
commit | 1e5a1abc158e35ce44f0e3b1eb1319569c0520f3 (patch) | |
tree | fedb2405c5cd3f4bd3c7d3d4406b0f8e3e00436d /gdb/linespec.c | |
parent | 40f0318e99b714619c029e788c8de3af1c286e14 (diff) | |
download | gdb-1e5a1abc158e35ce44f0e3b1eb1319569c0520f3.zip gdb-1e5a1abc158e35ce44f0e3b1eb1319569c0520f3.tar.gz gdb-1e5a1abc158e35ce44f0e3b1eb1319569c0520f3.tar.bz2 |
* linespec.c (lookup_prefix_sym): Lookup the symbol
in both STRUCT_DOMAIN and VAR_DOMAIN.
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 1be2686..80aa3e1 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1428,6 +1428,7 @@ lookup_prefix_sym (char **argptr, char *p) { char *p1; char *copy; + struct symbol *sym; /* Extract the class name. */ p1 = p; @@ -1446,7 +1447,26 @@ lookup_prefix_sym (char **argptr, char *p) /* At this point p1->"::inA::fun", p->"inA::fun" copy->"AAA", argptr->"inA::fun" */ - return lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); + sym = lookup_symbol (copy, 0, STRUCT_DOMAIN, 0); + if (sym == NULL) + { + /* Typedefs are in VAR_DOMAIN so the above symbol lookup will + fail when the user attempts to lookup a method of a class + via a typedef'd name (NOT via the class's name, which is already + handled in symbol_matches_domain). So try the lookup again + using VAR_DOMAIN (where typedefs live) and double-check that we + found a struct/class type. */ + struct symbol *s = lookup_symbol (copy, 0, VAR_DOMAIN, 0); + if (s != NULL) + { + struct type *t = SYMBOL_TYPE (s); + CHECK_TYPEDEF (t); + if (TYPE_CODE (t) == TYPE_CODE_STRUCT) + return s; + } + } + + return sym; } /* This finds the method COPY in the class whose type is T and whose |