X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcp-namespace.c;h=5e894d4dc3384ea67bb00805667db9dbba56510f;hb=629d6a470a1b61631c812ec417b522fb6d69d9d1;hp=8ca9c2074c8ec7d9cdec7f3acab835f78a740505;hpb=b14e635ec430d1a84fa9061bcd404ef76cf5bf11;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 8ca9c2074c..5e894d4dc3 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -117,7 +117,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) anonymous namespace. So add symbols in it to the namespace given by the previous component if there is one, or to the global namespace if there isn't. */ - cp_add_using_directive (dest, src); + cp_add_using_directive (dest, src, NULL); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; @@ -132,7 +132,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) has already been added, don't add it twice. */ void -cp_add_using_directive (const char *dest, const char *src) +cp_add_using_directive (const char *dest, const char *src, const char *alias) { struct using_direct *current; struct using_direct *new; @@ -146,7 +146,7 @@ cp_add_using_directive (const char *dest, const char *src) return; } - using_directives = cp_add_using (dest, src, using_directives); + using_directives = cp_add_using (dest, src, alias, using_directives); } @@ -198,8 +198,9 @@ cp_is_anonymous (const char *namespace) != NULL); } -/* Create a new struct using direct which imports the namespace SRC - into the scope DEST. +/* Create a new struct using direct which imports the namespace SRC into the + scope DEST. ALIAS is the name of the imported namespace in the current + scope. If ALIAS is NULL then the namespace is known by its original name. Set its next member in the linked list to NEXT; allocate all memory using xmalloc. It copies the strings, so NAME can be a temporary string. */ @@ -207,6 +208,7 @@ cp_is_anonymous (const char *namespace) struct using_direct * cp_add_using (const char *dest, const char *src, + const char *alias, struct using_direct *next) { struct using_direct *retval; @@ -214,6 +216,12 @@ cp_add_using (const char *dest, retval = xmalloc (sizeof (struct using_direct)); retval->import_src = savestring (src, strlen(src)); retval->import_dest = savestring (dest, strlen(dest)); + + if (alias != NULL) + retval->alias = savestring (alias, strlen (alias)); + else + retval->alias = NULL; + retval->next = next; retval->searched = 0; @@ -344,13 +352,28 @@ cp_lookup_symbol_imports (const char *scope, current->searched = 1; searched_cleanup = make_cleanup (reset_directive_searched, current); - sym = cp_lookup_symbol_namespace (current->import_src, - name, - linkage_name, - block, - domain, - 0); - + if (current->alias != NULL && strcmp (name, current->alias) == 0) + /* If the import is creating an alias and the alias matches the + sought name. Pass current->import_src as the NAME to direct the + search towards the aliased namespace. */ + { + sym = cp_lookup_symbol_in_namespace (scope, + current->import_src, + linkage_name, + block, + domain); + } + else if (current->alias == NULL) + { + /* If this import statement creates no alias, pass current->inner as + NAMESPACE to direct the search towards the imported namespace. */ + sym = cp_lookup_symbol_imports (current->import_src, + name, + linkage_name, + block, + domain, + 0); + } current->searched = 0; discard_cleanups (searched_cleanup);