Don't ignore domain in nested lookups.
gdb/ChangeLog: * cp-namespace.c (cp_lookup_nested_symbol): New arg "domain". All callers updated. (cp_lookup_nested_symbol_1, find_symbol_in_baseclass): Ditto. * cp-support.h (cp_lookup_nested_symbol): Update.
This commit is contained in:
parent
b2e2f908b8
commit
4dcabcc2b5
4 changed files with 34 additions and 19 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2015-05-27 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
|
* cp-namespace.c (cp_lookup_nested_symbol): New arg "domain".
|
||||||
|
All callers updated.
|
||||||
|
(cp_lookup_nested_symbol_1, find_symbol_in_baseclass): Ditto.
|
||||||
|
* cp-support.h (cp_lookup_nested_symbol): Update.
|
||||||
|
|
||||||
2015-05-27 Doug Evans <dje@google.com>
|
2015-05-27 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
PR symtab/18258
|
PR symtab/18258
|
||||||
|
|
|
@ -3004,7 +3004,8 @@ classify_inner_name (struct parser_state *par_state,
|
||||||
return ERROR;
|
return ERROR;
|
||||||
|
|
||||||
copy = copy_name (yylval.ssym.stoken);
|
copy = copy_name (yylval.ssym.stoken);
|
||||||
yylval.ssym.sym = cp_lookup_nested_symbol (type, copy, block);
|
/* N.B. We assume the symbol can only be in VAR_DOMAIN. */
|
||||||
|
yylval.ssym.sym = cp_lookup_nested_symbol (type, copy, block, VAR_DOMAIN);
|
||||||
|
|
||||||
/* If no symbol was found, search for a matching base class named
|
/* If no symbol was found, search for a matching base class named
|
||||||
COPY. This will allow users to enter qualified names of class members
|
COPY. This will allow users to enter qualified names of class members
|
||||||
|
|
|
@ -37,6 +37,7 @@ static struct symbol *
|
||||||
const char *nested_name,
|
const char *nested_name,
|
||||||
const char *concatenated_name,
|
const char *concatenated_name,
|
||||||
const struct block *block,
|
const struct block *block,
|
||||||
|
const domain_enum domain,
|
||||||
int basic_lookup, int is_in_anonymous);
|
int basic_lookup, int is_in_anonymous);
|
||||||
|
|
||||||
static struct type *cp_lookup_transparent_type_loop (const char *name,
|
static struct type *cp_lookup_transparent_type_loop (const char *name,
|
||||||
|
@ -308,7 +309,7 @@ cp_lookup_bare_symbol (const struct language_defn *langdef,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Look for symbol NAME in this class. */
|
/* Look for symbol NAME in this class. */
|
||||||
sym = cp_lookup_nested_symbol (type, name, block);
|
sym = cp_lookup_nested_symbol (type, name, block, domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sym;
|
return sym;
|
||||||
|
@ -370,8 +371,8 @@ cp_search_static_and_baseclasses (const char *name,
|
||||||
/* Look for a symbol named NESTED in this class.
|
/* Look for a symbol named NESTED in this class.
|
||||||
The caller is assumed to have already have done a basic lookup of NAME.
|
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. */
|
So we pass zero for BASIC_LOOKUP to cp_lookup_nested_symbol_1 here. */
|
||||||
sym = cp_lookup_nested_symbol_1 (klass_type, nested, name, block, 0,
|
sym = cp_lookup_nested_symbol_1 (klass_type, nested, name, block, domain,
|
||||||
is_in_anonymous);
|
0, is_in_anonymous);
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
do_cleanups (cleanup);
|
||||||
return sym;
|
return sym;
|
||||||
|
@ -906,7 +907,8 @@ cp_find_type_baseclass_by_name (struct type *parent_type, const char *name)
|
||||||
|
|
||||||
static struct symbol *
|
static struct symbol *
|
||||||
find_symbol_in_baseclass (struct type *parent_type, const char *name,
|
find_symbol_in_baseclass (struct type *parent_type, const char *name,
|
||||||
const struct block *block, int is_in_anonymous)
|
const struct block *block, const domain_enum domain,
|
||||||
|
int is_in_anonymous)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
@ -931,7 +933,7 @@ find_symbol_in_baseclass (struct type *parent_type, const char *name,
|
||||||
xsnprintf (concatenated_name, len, "%s::%s", base_name, name);
|
xsnprintf (concatenated_name, len, "%s::%s", base_name, name);
|
||||||
|
|
||||||
sym = cp_lookup_nested_symbol_1 (base_type, name, concatenated_name,
|
sym = cp_lookup_nested_symbol_1 (base_type, name, concatenated_name,
|
||||||
block, 1, is_in_anonymous);
|
block, domain, 1, is_in_anonymous);
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -940,8 +942,8 @@ find_symbol_in_baseclass (struct type *parent_type, const char *name,
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function to look up NESTED_NAME in CONTAINER_TYPE within the
|
/* Helper function to look up NESTED_NAME in CONTAINER_TYPE and in DOMAIN
|
||||||
context of BLOCK.
|
and within the context of BLOCK.
|
||||||
NESTED_NAME may have scope ("::").
|
NESTED_NAME may have scope ("::").
|
||||||
CONTAINER_TYPE needn't have been "check_typedef'd" yet.
|
CONTAINER_TYPE needn't have been "check_typedef'd" yet.
|
||||||
CONCATENATED_NAME is the fully scoped spelling of NESTED_NAME, it is
|
CONCATENATED_NAME is the fully scoped spelling of NESTED_NAME, it is
|
||||||
|
@ -957,6 +959,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
const char *nested_name,
|
const char *nested_name,
|
||||||
const char *concatenated_name,
|
const char *concatenated_name,
|
||||||
const struct block *block,
|
const struct block *block,
|
||||||
|
const domain_enum domain,
|
||||||
int basic_lookup, int is_in_anonymous)
|
int basic_lookup, int is_in_anonymous)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
@ -970,7 +973,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
|
|
||||||
if (basic_lookup)
|
if (basic_lookup)
|
||||||
{
|
{
|
||||||
sym = cp_basic_lookup_symbol (concatenated_name, block, VAR_DOMAIN,
|
sym = cp_basic_lookup_symbol (concatenated_name, block, domain,
|
||||||
is_in_anonymous);
|
is_in_anonymous);
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
return sym;
|
return sym;
|
||||||
|
@ -982,7 +985,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
C++ compliant and more assumptions could make it too magic. */
|
C++ compliant and more assumptions could make it too magic. */
|
||||||
|
|
||||||
/* First search in this symtab, what we want is possibly there. */
|
/* First search in this symtab, what we want is possibly there. */
|
||||||
sym = lookup_symbol_in_static_block (concatenated_name, block, VAR_DOMAIN);
|
sym = lookup_symbol_in_static_block (concatenated_name, block, domain);
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
return sym;
|
return sym;
|
||||||
|
|
||||||
|
@ -993,7 +996,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
which we just searched. */
|
which we just searched. */
|
||||||
if (!is_in_anonymous)
|
if (!is_in_anonymous)
|
||||||
{
|
{
|
||||||
sym = lookup_static_symbol (concatenated_name, VAR_DOMAIN);
|
sym = lookup_static_symbol (concatenated_name, domain);
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
@ -1003,7 +1006,7 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
if (TYPE_N_BASECLASSES (container_type) > 0)
|
if (TYPE_N_BASECLASSES (container_type) > 0)
|
||||||
{
|
{
|
||||||
sym = find_symbol_in_baseclass (container_type, nested_name, block,
|
sym = find_symbol_in_baseclass (container_type, nested_name, block,
|
||||||
is_in_anonymous);
|
domain, is_in_anonymous);
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
@ -1013,12 +1016,14 @@ cp_lookup_nested_symbol_1 (struct type *container_type,
|
||||||
|
|
||||||
/* Look up a symbol named NESTED_NAME that is nested inside the C++
|
/* Look up a symbol named NESTED_NAME that is nested inside the C++
|
||||||
class or namespace given by PARENT_TYPE, from within the context
|
class or namespace given by PARENT_TYPE, from within the context
|
||||||
given by BLOCK. Return NULL if there is no such nested symbol. */
|
given by BLOCK, and in DOMAIN.
|
||||||
|
Return NULL if there is no such nested symbol. */
|
||||||
|
|
||||||
struct symbol *
|
struct symbol *
|
||||||
cp_lookup_nested_symbol (struct type *parent_type,
|
cp_lookup_nested_symbol (struct type *parent_type,
|
||||||
const char *nested_name,
|
const char *nested_name,
|
||||||
const struct block *block)
|
const struct block *block,
|
||||||
|
const domain_enum domain)
|
||||||
{
|
{
|
||||||
/* type_name_no_tag_or_error provides better error reporting using the
|
/* type_name_no_tag_or_error provides better error reporting using the
|
||||||
original type. */
|
original type. */
|
||||||
|
@ -1031,9 +1036,10 @@ cp_lookup_nested_symbol (struct type *parent_type,
|
||||||
const char *type_name = type_name_no_tag (saved_parent_type);
|
const char *type_name = type_name_no_tag (saved_parent_type);
|
||||||
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
"cp_lookup_nested_symbol (%s, %s, %s)\n",
|
"cp_lookup_nested_symbol (%s, %s, %s, %s)\n",
|
||||||
type_name != NULL ? type_name : "unnamed",
|
type_name != NULL ? type_name : "unnamed",
|
||||||
nested_name, host_address_to_string (block));
|
nested_name, host_address_to_string (block),
|
||||||
|
domain_name (domain));
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (TYPE_CODE (parent_type))
|
switch (TYPE_CODE (parent_type))
|
||||||
|
@ -1060,8 +1066,8 @@ cp_lookup_nested_symbol (struct type *parent_type,
|
||||||
is_in_anonymous = cp_is_in_anonymous (concatenated_name);
|
is_in_anonymous = cp_is_in_anonymous (concatenated_name);
|
||||||
|
|
||||||
sym = cp_lookup_nested_symbol_1 (parent_type, nested_name,
|
sym = cp_lookup_nested_symbol_1 (parent_type, nested_name,
|
||||||
concatenated_name, block, 1,
|
concatenated_name, block, domain,
|
||||||
is_in_anonymous);
|
1, is_in_anonymous);
|
||||||
|
|
||||||
if (symbol_lookup_debug)
|
if (symbol_lookup_debug)
|
||||||
{
|
{
|
||||||
|
|
|
@ -211,7 +211,8 @@ extern struct symbol *cp_lookup_symbol_imports_or_template
|
||||||
|
|
||||||
extern struct symbol *cp_lookup_nested_symbol (struct type *parent_type,
|
extern struct symbol *cp_lookup_nested_symbol (struct type *parent_type,
|
||||||
const char *nested_name,
|
const char *nested_name,
|
||||||
const struct block *block);
|
const struct block *block,
|
||||||
|
const domain_enum domain);
|
||||||
|
|
||||||
struct type *cp_lookup_transparent_type (const char *name);
|
struct type *cp_lookup_transparent_type (const char *name);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue