aboutsummaryrefslogtreecommitdiff
path: root/gdb/cp-namespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/cp-namespace.c')
-rw-r--r--gdb/cp-namespace.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index b96c421..90ff513 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -93,8 +93,9 @@ cp_scan_for_anonymous_namespaces (const struct symbol *const 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. */
+ std::vector<const char *> excludes;
add_using_directive (&local_using_directives,
- dest, src, NULL, NULL, NULL, 1,
+ dest, src, NULL, NULL, excludes, 1,
&objfile->objfile_obstack);
}
/* The "+ 2" is for the "::". */
@@ -246,40 +247,44 @@ cp_search_static_and_baseclasses (const char *name,
unsigned int prefix_len,
int is_in_anonymous)
{
- struct block_symbol sym;
- struct block_symbol klass_sym;
- struct type *klass_type;
-
/* Check for malformed input. */
if (prefix_len + 2 > strlen (name) || name[prefix_len + 1] != ':')
return null_block_symbol;
- /* Find the name of the class and the name of the method, variable, etc. */
-
- /* The class name is everything up to and including PREFIX_LEN. */
- std::string klass (name, prefix_len);
+ /* The class, namespace or function name is everything up to and
+ including PREFIX_LEN. */
+ std::string scope (name, prefix_len);
/* The rest of the name is everything else past the initial scope
operator. */
- std::string nested (name + prefix_len + 2);
-
- /* Lookup a class named KLASS. If none is found, there is nothing
- more that can be done. KLASS could be a namespace, so always look
- in VAR_DOMAIN. This works for classes too because of
- symbol_matches_domain (which should be replaced with something else,
- but it's what we have today). */
- klass_sym = lookup_global_symbol (klass.c_str (), block, VAR_DOMAIN);
- if (klass_sym.symbol == NULL)
+ const char *nested = name + prefix_len + 2;
+
+ /* Lookup the scope symbol. If none is found, there is nothing more
+ that can be done. SCOPE could be a namespace, so always look in
+ VAR_DOMAIN. This works for classes too because of
+ symbol_matches_domain (which should be replaced with something
+ else, but it's what we have today). */
+ block_symbol scope_sym = lookup_symbol_in_static_block (scope.c_str (),
+ block, VAR_DOMAIN);
+ if (scope_sym.symbol == NULL)
+ scope_sym = lookup_global_symbol (scope.c_str (), block, VAR_DOMAIN);
+ if (scope_sym.symbol == NULL)
return null_block_symbol;
- klass_type = SYMBOL_TYPE (klass_sym.symbol);
- /* Look for a symbol named NESTED in this class.
+ struct type *scope_type = SYMBOL_TYPE (scope_sym.symbol);
+
+ /* If the scope is a function/method, then look up NESTED as a local
+ static variable. E.g., "print 'function()::static_var'". */
+ if (TYPE_CODE (scope_type) == TYPE_CODE_FUNC
+ || TYPE_CODE (scope_type) == TYPE_CODE_METHOD)
+ return lookup_symbol (nested, SYMBOL_BLOCK_VALUE (scope_sym.symbol),
+ VAR_DOMAIN, NULL);
+
+ /* Look for a symbol named NESTED in this class/namespace.
The caller is assumed to have already have done a basic lookup of NAME.
So we pass zero for BASIC_LOOKUP to cp_lookup_nested_symbol_1 here. */
- sym = cp_lookup_nested_symbol_1 (klass_type, nested.c_str (), name,
- block, domain, 0, is_in_anonymous);
-
- return sym;
+ return cp_lookup_nested_symbol_1 (scope_type, nested, name,
+ block, domain, 0, is_in_anonymous);
}
/* Look up NAME in the C++ namespace NAMESPACE. Other arguments are
@@ -1078,9 +1083,6 @@ maintenance_cplus_namespace (char *args, int from_tty)
printf_unfiltered (_("The `maint namespace' command was removed.\n"));
}
-/* Provide a prototype to silence -Wmissing-prototypes. */
-extern initialize_file_ftype _initialize_cp_namespace;
-
void
_initialize_cp_namespace (void)
{