2010-02-05 Sami Wagiaalla <swagiaal@redhat.com>
PR c++/7935: * gdb.cp/namespace-using.exp: Removed kfail; bug has been fixed. 2010-02-05 Sami Wagiaalla <swagiaal@redhat.com> PR c++/7935: * cp-support.h: Added char* alias element to using_direct data struct. (cp_add_using): Added char* alias argument. (cp_add_using_directive): Ditto. * cp-namespace.c: Updated with the above changes. (cp_lookup_symbol_imports): Check for aliases. * dwarf2read.c (read_import_statement): Figure out local alias for the import and pass it on to cp_add_using. (read_namespace): Pass alias argument to cp_add_using.
This commit is contained in:
parent
1beeb6866d
commit
8285698016
6 changed files with 77 additions and 23 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
2010-02-05 Sami Wagiaalla <swagiaal@redhat.com>
|
||||||
|
|
||||||
|
PR c++/7935:
|
||||||
|
* cp-support.h: Added char* alias element to using_direct data
|
||||||
|
struct.
|
||||||
|
(cp_add_using): Added char* alias argument.
|
||||||
|
(cp_add_using_directive): Ditto.
|
||||||
|
* cp-namespace.c: Updated with the above changes.
|
||||||
|
(cp_lookup_symbol_imports): Check for aliases.
|
||||||
|
* dwarf2read.c (read_import_statement): Figure out local alias
|
||||||
|
for the import and pass it on to cp_add_using.
|
||||||
|
(read_namespace): Pass alias argument to cp_add_using.
|
||||||
|
|
||||||
2010-02-05 Hui Zhu <teawater@gmail.com>
|
2010-02-05 Hui Zhu <teawater@gmail.com>
|
||||||
|
|
||||||
* defs.h (gdb_bfd_errmsg): New extern.
|
* defs.h (gdb_bfd_errmsg): New extern.
|
||||||
|
|
|
@ -117,7 +117,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
|
||||||
anonymous namespace. So add symbols in it to the
|
anonymous namespace. So add symbols in it to the
|
||||||
namespace given by the previous component if there is
|
namespace given by the previous component if there is
|
||||||
one, or to the global namespace if there isn't. */
|
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 "::". */
|
/* The "+ 2" is for the "::". */
|
||||||
previous_component = next_component + 2;
|
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. */
|
has already been added, don't add it twice. */
|
||||||
|
|
||||||
void
|
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 *current;
|
||||||
struct using_direct *new;
|
struct using_direct *new;
|
||||||
|
@ -146,7 +146,7 @@ cp_add_using_directive (const char *dest, const char *src)
|
||||||
return;
|
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);
|
!= NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a new struct using direct which imports the namespace SRC
|
/* Create a new struct using direct which imports the namespace SRC into the
|
||||||
into the scope DEST.
|
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
|
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
|
using xmalloc. It copies the strings, so NAME can be a temporary
|
||||||
string. */
|
string. */
|
||||||
|
@ -207,6 +208,7 @@ cp_is_anonymous (const char *namespace)
|
||||||
struct using_direct *
|
struct using_direct *
|
||||||
cp_add_using (const char *dest,
|
cp_add_using (const char *dest,
|
||||||
const char *src,
|
const char *src,
|
||||||
|
const char *alias,
|
||||||
struct using_direct *next)
|
struct using_direct *next)
|
||||||
{
|
{
|
||||||
struct using_direct *retval;
|
struct using_direct *retval;
|
||||||
|
@ -214,6 +216,12 @@ cp_add_using (const char *dest,
|
||||||
retval = xmalloc (sizeof (struct using_direct));
|
retval = xmalloc (sizeof (struct using_direct));
|
||||||
retval->import_src = savestring (src, strlen(src));
|
retval->import_src = savestring (src, strlen(src));
|
||||||
retval->import_dest = savestring (dest, strlen(dest));
|
retval->import_dest = savestring (dest, strlen(dest));
|
||||||
|
|
||||||
|
if (alias != NULL)
|
||||||
|
retval->alias = savestring (alias, strlen (alias));
|
||||||
|
else
|
||||||
|
retval->alias = NULL;
|
||||||
|
|
||||||
retval->next = next;
|
retval->next = next;
|
||||||
retval->searched = 0;
|
retval->searched = 0;
|
||||||
|
|
||||||
|
@ -344,13 +352,28 @@ cp_lookup_symbol_imports (const char *scope,
|
||||||
current->searched = 1;
|
current->searched = 1;
|
||||||
searched_cleanup = make_cleanup (reset_directive_searched, current);
|
searched_cleanup = make_cleanup (reset_directive_searched, current);
|
||||||
|
|
||||||
sym = cp_lookup_symbol_namespace (current->import_src,
|
if (current->alias != NULL && strcmp (name, current->alias) == 0)
|
||||||
name,
|
/* If the import is creating an alias and the alias matches the
|
||||||
linkage_name,
|
sought name. Pass current->import_src as the NAME to direct the
|
||||||
block,
|
search towards the aliased namespace. */
|
||||||
domain,
|
{
|
||||||
0);
|
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;
|
current->searched = 0;
|
||||||
discard_cleanups (searched_cleanup);
|
discard_cleanups (searched_cleanup);
|
||||||
|
|
||||||
|
|
|
@ -38,14 +38,21 @@ struct demangle_component;
|
||||||
|
|
||||||
/* This struct is designed to store data from using directives. It
|
/* This struct is designed to store data from using directives. It
|
||||||
says that names from namespace IMPORT_SRC should be visible within
|
says that names from namespace IMPORT_SRC should be visible within
|
||||||
namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial
|
namespace IMPORT_DEST. These form a linked list; NEXT is the next element
|
||||||
substring of IMPORT_SRC. These form a linked list; NEXT is the next element
|
of the list. If the imported namespace has been aliased, ALIAS is set to a
|
||||||
of the list. */
|
string representing the alias. Otherwise, ALIAS is NULL.
|
||||||
|
Eg:
|
||||||
|
namespace C = A::B;
|
||||||
|
ALIAS = "C"
|
||||||
|
*/
|
||||||
|
|
||||||
struct using_direct
|
struct using_direct
|
||||||
{
|
{
|
||||||
char *import_src;
|
char *import_src;
|
||||||
char *import_dest;
|
char *import_dest;
|
||||||
|
|
||||||
|
char *alias;
|
||||||
|
|
||||||
struct using_direct *next;
|
struct using_direct *next;
|
||||||
|
|
||||||
/* Used during import search to temporarily mark this node as searched. */
|
/* Used during import search to temporarily mark this node as searched. */
|
||||||
|
@ -82,10 +89,12 @@ extern int cp_validate_operator (const char *input);
|
||||||
extern int cp_is_anonymous (const char *namespace);
|
extern int cp_is_anonymous (const char *namespace);
|
||||||
|
|
||||||
extern void cp_add_using_directive (const char *dest,
|
extern void cp_add_using_directive (const char *dest,
|
||||||
const char *src);
|
const char *src,
|
||||||
|
const char *alias);
|
||||||
|
|
||||||
extern struct using_direct *cp_add_using (const char *dest,
|
extern struct using_direct *cp_add_using (const char *dest,
|
||||||
const char *src,
|
const char *src,
|
||||||
|
const char *alias,
|
||||||
struct using_direct *next);
|
struct using_direct *next);
|
||||||
|
|
||||||
extern void cp_initialize_namespace (void);
|
extern void cp_initialize_namespace (void);
|
||||||
|
|
|
@ -3385,6 +3385,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
struct dwarf2_cu *imported_cu;
|
struct dwarf2_cu *imported_cu;
|
||||||
const char *imported_name;
|
const char *imported_name;
|
||||||
const char *imported_name_prefix;
|
const char *imported_name_prefix;
|
||||||
|
char *import_alias;
|
||||||
|
|
||||||
const char *import_prefix;
|
const char *import_prefix;
|
||||||
char *canonical_name;
|
char *canonical_name;
|
||||||
|
|
||||||
|
@ -3436,7 +3438,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: dwarf2_name (die); for the local name after import. */
|
/* Figure out the local name after import. */
|
||||||
|
import_alias = dwarf2_name (die, cu);
|
||||||
|
|
||||||
/* Figure out where the statement is being imported to. */
|
/* Figure out where the statement is being imported to. */
|
||||||
import_prefix = determine_prefix (die, cu);
|
import_prefix = determine_prefix (die, cu);
|
||||||
|
@ -3447,7 +3450,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
|
|
||||||
if (strlen (imported_name_prefix) > 0)
|
if (strlen (imported_name_prefix) > 0)
|
||||||
{
|
{
|
||||||
canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1);
|
canonical_name = alloca (strlen (imported_name_prefix)
|
||||||
|
+ 2 + strlen (imported_name) + 1);
|
||||||
strcpy (canonical_name, imported_name_prefix);
|
strcpy (canonical_name, imported_name_prefix);
|
||||||
strcat (canonical_name, "::");
|
strcat (canonical_name, "::");
|
||||||
strcat (canonical_name, imported_name);
|
strcat (canonical_name, imported_name);
|
||||||
|
@ -3458,7 +3462,10 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
strcpy (canonical_name, imported_name);
|
strcpy (canonical_name, imported_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
using_directives = cp_add_using (import_prefix,canonical_name, using_directives);
|
using_directives = cp_add_using (import_prefix,
|
||||||
|
canonical_name,
|
||||||
|
import_alias,
|
||||||
|
using_directives);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -5617,7 +5624,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
if (is_anonymous)
|
if (is_anonymous)
|
||||||
{
|
{
|
||||||
const char *previous_prefix = determine_prefix (die, cu);
|
const char *previous_prefix = determine_prefix (die, cu);
|
||||||
cp_add_using_directive (previous_prefix, TYPE_NAME (type));
|
cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-02-05 Sami Wagiaalla <swagiaal@redhat.com>
|
||||||
|
|
||||||
|
PR c++/7935:
|
||||||
|
* gdb.cp/namespace-using.exp: Removed kfail; bug has been fixed.
|
||||||
|
|
||||||
2010-02-04 Tom Tromey <tromey@redhat.com>
|
2010-02-04 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* gdb.cp/virtbase.exp: Make test case names unique.
|
* gdb.cp/virtbase.exp: Make test case names unique.
|
||||||
|
|
|
@ -116,14 +116,11 @@ if ![runto marker2] then {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_kfail "gdb/7935" "*-*-*"
|
|
||||||
gdb_test "print B::_a" "= 1"
|
gdb_test "print B::_a" "= 1"
|
||||||
|
|
||||||
setup_kfail "gdb/7935" "*-*-*"
|
|
||||||
gdb_test "print _a" "No symbol \"_a\" in current context." \
|
gdb_test "print _a" "No symbol \"_a\" in current context." \
|
||||||
"print _a in namespace alias scope"
|
"print _a in namespace alias scope"
|
||||||
|
|
||||||
setup_kfail "gdb/7935" "*-*-*"
|
|
||||||
gdb_test "print x" "No symbol \"x\" in current context." \
|
gdb_test "print x" "No symbol \"x\" in current context." \
|
||||||
"print x in namespace alias scope"
|
"print x in namespace alias scope"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue