Fix operator doubly nested namespace search.

2010-06-07  Sami Wagiaalla  <swagiaal@redhat.com>

	* cp-support.c (make_symbol_overload_list_namespace): Only search
	static and global blocks.
	(make_symbol_overload_list_block): New function.
	(make_symbol_overload_list): Separate namespace search from block
	search.
	(make_symbol_overload_list_qualified): Use
	make_symbol_overload_list_block.
This commit is contained in:
Sami Wagiaalla 2010-06-07 17:51:03 +00:00
parent 4c3376c849
commit 245040d756
2 changed files with 60 additions and 28 deletions

View File

@ -1,3 +1,13 @@
2010-06-07 Sami Wagiaalla <swagiaal@redhat.com>
* cp-support.c (make_symbol_overload_list_namespace): Only search
static and global blocks.
(make_symbol_overload_list_block): New function.
(make_symbol_overload_list): Separate namespace search from block
search.
(make_symbol_overload_list_qualified): Use
make_symbol_overload_list_block.
2010-06-07 Sami Wagiaalla <swagiaal@redhat.com> 2010-06-07 Sami Wagiaalla <swagiaal@redhat.com>
* value.h: Created oload_search_type enum. * value.h: Created oload_search_type enum.

View File

@ -693,6 +693,7 @@ make_symbol_overload_list (const char *func_name,
const char *namespace) const char *namespace)
{ {
struct cleanup *old_cleanups; struct cleanup *old_cleanups;
const char *name;
sym_return_val_size = 100; sym_return_val_size = 100;
sym_return_val_index = 0; sym_return_val_index = 0;
@ -704,19 +705,54 @@ make_symbol_overload_list (const char *func_name,
make_symbol_overload_list_using (func_name, namespace); make_symbol_overload_list_using (func_name, namespace);
if (namespace[0] == '\0')
name = func_name;
else
{
char *concatenated_name
= alloca (strlen (namespace) + 2 + strlen (func_name) + 1);
strcpy (concatenated_name, namespace);
strcat (concatenated_name, "::");
strcat (concatenated_name, func_name);
name = concatenated_name;
}
make_symbol_overload_list_qualified (name);
discard_cleanups (old_cleanups); discard_cleanups (old_cleanups);
return sym_return_val; return sym_return_val;
} }
/* Add all symbols with a name matching NAME in BLOCK to the overload
list. */
static void
make_symbol_overload_list_block (const char *name,
const struct block *block)
{
struct dict_iterator iter;
struct symbol *sym;
const struct dictionary *dict = BLOCK_DICT (block);
for (sym = dict_iter_name_first (dict, name, &iter);
sym != NULL;
sym = dict_iter_name_next (name, &iter))
overload_list_add_symbol (sym, name);
}
/* Adds the function FUNC_NAME from NAMESPACE to the overload set. */ /* Adds the function FUNC_NAME from NAMESPACE to the overload set. */
static void static void
make_symbol_overload_list_namespace (const char *func_name, make_symbol_overload_list_namespace (const char *func_name,
const char *namespace) const char *namespace)
{ {
const char *name;
const struct block *block = NULL;
if (namespace[0] == '\0') if (namespace[0] == '\0')
make_symbol_overload_list_qualified (func_name); name = func_name;
else else
{ {
char *concatenated_name char *concatenated_name
@ -725,8 +761,17 @@ make_symbol_overload_list_namespace (const char *func_name,
strcpy (concatenated_name, namespace); strcpy (concatenated_name, namespace);
strcat (concatenated_name, "::"); strcat (concatenated_name, "::");
strcat (concatenated_name, func_name); strcat (concatenated_name, func_name);
make_symbol_overload_list_qualified (concatenated_name); name = concatenated_name;
} }
/* Look in the static block. */
block = block_static_block (get_selected_block (0));
make_symbol_overload_list_block (name, block);
/* Look in the global block. */
block = block_global_block (block);
make_symbol_overload_list_block (name, block);
} }
/* Search the namespace of the given type and namespace of and public base /* Search the namespace of the given type and namespace of and public base
@ -855,16 +900,7 @@ make_symbol_overload_list_qualified (const char *func_name)
complete on local vars. */ complete on local vars. */
for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b))
{ make_symbol_overload_list_block (func_name, b);
dict = BLOCK_DICT (b);
for (sym = dict_iter_name_first (dict, func_name, &iter);
sym;
sym = dict_iter_name_next (func_name, &iter))
{
overload_list_add_symbol (sym, func_name);
}
}
surrounding_static_block = block_static_block (get_selected_block (0)); surrounding_static_block = block_static_block (get_selected_block (0));
@ -875,14 +911,7 @@ make_symbol_overload_list_qualified (const char *func_name)
{ {
QUIT; QUIT;
b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK); b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
dict = BLOCK_DICT (b); make_symbol_overload_list_block (func_name, b);
for (sym = dict_iter_name_first (dict, func_name, &iter);
sym;
sym = dict_iter_name_next (func_name, &iter))
{
overload_list_add_symbol (sym, func_name);
}
} }
ALL_PRIMARY_SYMTABS (objfile, s) ALL_PRIMARY_SYMTABS (objfile, s)
@ -892,14 +921,7 @@ make_symbol_overload_list_qualified (const char *func_name)
/* Don't do this block twice. */ /* Don't do this block twice. */
if (b == surrounding_static_block) if (b == surrounding_static_block)
continue; continue;
dict = BLOCK_DICT (b); make_symbol_overload_list_block (func_name, b);
for (sym = dict_iter_name_first (dict, func_name, &iter);
sym;
sym = dict_iter_name_next (func_name, &iter))
{
overload_list_add_symbol (sym, func_name);
}
} }
} }