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:
parent
4c3376c849
commit
245040d756
|
@ -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.
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue