2010-01-14 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/nsrecurs.exp: New test. * gdb.cp/nsrecurs.cc: New test program. * gdb.cp/nsstress.exp: New test. * gdb.cp/nsstress.cc: New test program. * gdb.cp/nsdecl.exp: New test. * gdb.cp/nsdecl.cc: New test program. 2010-01-26 Sami Wagiaalla <swagiaal@redhat.com> * cp-namespace.c (cp_lookup_symbol_namespace): Added search_parent argument. (cp_add_using): Initialize 'searched' field. (reset_directive_searched): New function. * cp-support.h: Add 'searched' field to using_direct struct. (cp_lookup_symbol_imports): Ditto. * cp-namespace.c (cp_lookup_symbol_imports): Ditto. Perform recursive search. Implement non parent search. * valops.c (value_maybe_namespace_elt): Updated.
This commit is contained in:
parent
8540c487c6
commit
b14e635ec4
11 changed files with 444 additions and 16 deletions
|
@ -1,3 +1,16 @@
|
|||
2010-01-26 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* cp-namespace.c (cp_lookup_symbol_namespace): Added
|
||||
search_parent argument.
|
||||
(cp_add_using): Initialize 'searched' field.
|
||||
(reset_directive_searched): New function.
|
||||
* cp-support.h: Add 'searched' field to using_direct struct.
|
||||
(cp_lookup_symbol_imports): Ditto.
|
||||
* cp-namespace.c (cp_lookup_symbol_imports): Ditto.
|
||||
Perform recursive search.
|
||||
Implement non parent search.
|
||||
* valops.c (value_maybe_namespace_elt): Updated.
|
||||
|
||||
2010-01-26 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
PR gdb/10929:
|
||||
|
|
|
@ -215,6 +215,7 @@ cp_add_using (const char *dest,
|
|||
retval->import_src = savestring (src, strlen(src));
|
||||
retval->import_dest = savestring (dest, strlen(dest));
|
||||
retval->next = next;
|
||||
retval->searched = 0;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -240,7 +241,8 @@ cp_lookup_symbol_nonlocal (const char *name,
|
|||
if (sym != NULL)
|
||||
return sym;
|
||||
|
||||
return cp_lookup_symbol_namespace (scope, name, linkage_name, block, domain);
|
||||
return cp_lookup_symbol_namespace (scope, name, linkage_name, block, domain,
|
||||
1);
|
||||
}
|
||||
|
||||
/* Look up NAME in the C++ namespace NAMESPACE. Other arguments are as in
|
||||
|
@ -270,19 +272,46 @@ cp_lookup_symbol_in_namespace (const char *namespace,
|
|||
}
|
||||
}
|
||||
|
||||
/* Used for cleanups to reset the "searched" flag incase
|
||||
of an error. */
|
||||
|
||||
static void
|
||||
reset_directive_searched (void *data)
|
||||
{
|
||||
struct using_direct *direct = data;
|
||||
direct->searched = 0;
|
||||
}
|
||||
|
||||
/* Search for NAME by applying all import statements belonging
|
||||
to BLOCK which are applicable in SCOPE. */
|
||||
to BLOCK which are applicable in SCOPE.
|
||||
If SEARCH_PARENTS the search will include imports which are applicable in
|
||||
parents of SCOPE.
|
||||
Example:
|
||||
|
||||
namespace A{
|
||||
using namespace X;
|
||||
namespace B{
|
||||
using namespace Y;
|
||||
}
|
||||
}
|
||||
|
||||
If SCOPE is "A::B" and SEARCH_PARENTS is true the imports of namespaces X
|
||||
and Y will be considered. If SEARCH_PARENTS is false only the import of Y
|
||||
is considered. */
|
||||
|
||||
static struct symbol *
|
||||
cp_lookup_symbol_imports (const char *scope,
|
||||
const char *name,
|
||||
const char *linkage_name,
|
||||
const struct block *block,
|
||||
const domain_enum domain)
|
||||
const domain_enum domain,
|
||||
const int search_parents)
|
||||
{
|
||||
const struct using_direct *current;
|
||||
struct using_direct *current;
|
||||
struct symbol *sym;
|
||||
int len;
|
||||
int directive_match;
|
||||
struct cleanup *searched_cleanup;
|
||||
|
||||
/* First, try to find the symbol in the given namespace. */
|
||||
sym = cp_lookup_symbol_in_namespace (scope, name, linkage_name, block,
|
||||
|
@ -298,24 +327,41 @@ cp_lookup_symbol_imports (const char *scope,
|
|||
current != NULL;
|
||||
current = current->next)
|
||||
{
|
||||
len = strlen (current->import_dest);
|
||||
directive_match = (search_parents
|
||||
? (strncmp (scope, current->import_dest,
|
||||
strlen (current->import_dest)) == 0
|
||||
&& (len == 0
|
||||
|| scope[len] == ':' || scope[len] == '\0'))
|
||||
: strcmp (scope, current->import_dest) == 0);
|
||||
|
||||
/* If the import destination is the current scope or one of its ancestors then
|
||||
it is applicable. */
|
||||
len = strlen (current->import_dest);
|
||||
if (strncmp (scope, current->import_dest, len) == 0
|
||||
&& (len == 0 || scope[len] == ':' || scope[len] == '\0'))
|
||||
if (directive_match && !current->searched)
|
||||
{
|
||||
sym = cp_lookup_symbol_in_namespace (current->import_src, name,
|
||||
linkage_name, block, domain);
|
||||
if (sym != NULL)
|
||||
return sym;
|
||||
/* Mark this import as searched so that the recursive call does not
|
||||
search it again. */
|
||||
current->searched = 1;
|
||||
searched_cleanup = make_cleanup (reset_directive_searched, current);
|
||||
|
||||
sym = cp_lookup_symbol_namespace (current->import_src,
|
||||
name,
|
||||
linkage_name,
|
||||
block,
|
||||
domain,
|
||||
0);
|
||||
|
||||
current->searched = 0;
|
||||
discard_cleanups (searched_cleanup);
|
||||
|
||||
if (sym != NULL)
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Searches for NAME in the current namespace, and by applying relevant import
|
||||
statements belonging to BLOCK and its parents. SCOPE is the namespace scope
|
||||
of the context in which the search is being evaluated. */
|
||||
|
@ -325,14 +371,16 @@ cp_lookup_symbol_namespace (const char *scope,
|
|||
const char *name,
|
||||
const char *linkage_name,
|
||||
const struct block *block,
|
||||
const domain_enum domain)
|
||||
const domain_enum domain,
|
||||
const int search_parents)
|
||||
{
|
||||
struct symbol *sym;
|
||||
|
||||
/* Search for name in namespaces imported to this and parent blocks. */
|
||||
while (block != NULL)
|
||||
{
|
||||
sym = cp_lookup_symbol_imports (scope,name, linkage_name, block, domain);
|
||||
sym = cp_lookup_symbol_imports (scope, name, linkage_name, block, domain,
|
||||
search_parents);
|
||||
|
||||
if (sym)
|
||||
return sym;
|
||||
|
|
|
@ -47,6 +47,9 @@ struct using_direct
|
|||
char *import_src;
|
||||
char *import_dest;
|
||||
struct using_direct *next;
|
||||
|
||||
/* Used during import search to temporarily mark this node as searched. */
|
||||
int searched;
|
||||
};
|
||||
|
||||
|
||||
|
@ -107,7 +110,8 @@ extern struct symbol *cp_lookup_symbol_namespace (const char *namespace,
|
|||
const char *name,
|
||||
const char *linkage_name,
|
||||
const struct block *block,
|
||||
const domain_enum domain);
|
||||
const domain_enum domain,
|
||||
const int search_parents);
|
||||
|
||||
extern struct type *cp_lookup_nested_type (struct type *parent_type,
|
||||
const char *nested_name,
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2010-01-14 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* gdb.cp/nsrecurs.exp: New test.
|
||||
* gdb.cp/nsrecurs.cc: New test program.
|
||||
* gdb.cp/nsstress.exp: New test.
|
||||
* gdb.cp/nsstress.cc: New test program.
|
||||
* gdb.cp/nsdecl.exp: New test.
|
||||
* gdb.cp/nsdecl.cc: New test program.
|
||||
|
||||
2010-01-26 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* gdb.cp/namespace-using.exp: Add test for printing of namespaces
|
||||
|
|
93
gdb/testsuite/gdb.cp/nsdecl.cc
Normal file
93
gdb/testsuite/gdb.cp/nsdecl.cc
Normal file
|
@ -0,0 +1,93 @@
|
|||
int a;
|
||||
int b;
|
||||
int c;
|
||||
int d;
|
||||
int e;
|
||||
int f;
|
||||
int g;
|
||||
int h;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
int l;
|
||||
int m;
|
||||
int n;
|
||||
int o;
|
||||
int p;
|
||||
int q;
|
||||
int r;
|
||||
int s;
|
||||
int t;
|
||||
int u;
|
||||
int v;
|
||||
int w;
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
|
||||
namespace A
|
||||
{
|
||||
int xyz;
|
||||
|
||||
using ::a;
|
||||
using ::b;
|
||||
using ::c;
|
||||
using ::d;
|
||||
using ::e;
|
||||
using ::f;
|
||||
using ::g;
|
||||
using ::h;
|
||||
using ::i;
|
||||
using ::j;
|
||||
using ::k;
|
||||
using ::l;
|
||||
using ::m;
|
||||
using ::n;
|
||||
using ::o;
|
||||
using ::p;
|
||||
using ::q;
|
||||
using ::r;
|
||||
using ::s;
|
||||
using ::t;
|
||||
using ::u;
|
||||
using ::v;
|
||||
using ::w;
|
||||
using ::x;
|
||||
using ::y;
|
||||
using ::z;
|
||||
|
||||
}
|
||||
|
||||
using A::a;
|
||||
using A::b;
|
||||
using A::c;
|
||||
using A::d;
|
||||
using A::e;
|
||||
using A::f;
|
||||
using A::g;
|
||||
using A::h;
|
||||
using A::i;
|
||||
using A::j;
|
||||
using A::k;
|
||||
using A::l;
|
||||
using A::m;
|
||||
using A::n;
|
||||
using A::o;
|
||||
using A::p;
|
||||
using A::q;
|
||||
using A::r;
|
||||
using A::s;
|
||||
using A::t;
|
||||
using A::u;
|
||||
using A::v;
|
||||
using A::w;
|
||||
using A::x;
|
||||
using A::y;
|
||||
using A::z;
|
||||
|
||||
using namespace A;
|
||||
|
||||
int main ()
|
||||
{
|
||||
return 0;
|
||||
}
|
52
gdb/testsuite/gdb.cp/nsdecl.exp
Normal file
52
gdb/testsuite/gdb.cp/nsdecl.exp
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Copyright 2008 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Stress test the lookup of declarations
|
||||
|
||||
if $tracelevel then {
|
||||
strace $tracelevel
|
||||
}
|
||||
|
||||
set prms_id 0
|
||||
set bug_id 0
|
||||
|
||||
set testfile nsdecl
|
||||
set srcfile ${testfile}.cc
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
|
||||
untested "Couldn't compile test program"
|
||||
return -1
|
||||
}
|
||||
|
||||
if [get_compiler_info ${binfile}] {
|
||||
return -1;
|
||||
}
|
||||
|
||||
# Get things started.
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
if ![runto_main] then {
|
||||
perror "couldn't run to breakpoint main"
|
||||
continue
|
||||
}
|
||||
|
||||
############################################
|
||||
# Test that the search can fail efficiently
|
||||
|
||||
gdb_test "print fakex" "No symbol \"fakex\" in current context."
|
30
gdb/testsuite/gdb.cp/nsrecurs.cc
Normal file
30
gdb/testsuite/gdb.cp/nsrecurs.cc
Normal file
|
@ -0,0 +1,30 @@
|
|||
namespace A{
|
||||
int ax = 9;
|
||||
}
|
||||
|
||||
namespace B{
|
||||
using namespace A;
|
||||
}
|
||||
|
||||
namespace C{
|
||||
using namespace B;
|
||||
}
|
||||
|
||||
//---------------
|
||||
namespace D{
|
||||
using namespace D;
|
||||
int dx = 99;
|
||||
}
|
||||
using namespace C;
|
||||
|
||||
//---------------
|
||||
namespace{
|
||||
namespace{
|
||||
int xx = 999;
|
||||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
using namespace D;
|
||||
return ax + dx + xx;
|
||||
}
|
67
gdb/testsuite/gdb.cp/nsrecurs.exp
Normal file
67
gdb/testsuite/gdb.cp/nsrecurs.exp
Normal file
|
@ -0,0 +1,67 @@
|
|||
# Copyright 2008 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Test recursive namespace lookup
|
||||
|
||||
if $tracelevel then {
|
||||
strace $tracelevel
|
||||
}
|
||||
|
||||
set prms_id 0
|
||||
set bug_id 0
|
||||
|
||||
set testfile nsrecurs
|
||||
set srcfile ${testfile}.cc
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
|
||||
untested "Couldn't compile test program"
|
||||
return -1
|
||||
}
|
||||
|
||||
if [get_compiler_info ${binfile}] {
|
||||
return -1
|
||||
}
|
||||
|
||||
|
||||
# Get things started.
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
if ![runto_main] then {
|
||||
perror "couldn't run to breakpoint main"
|
||||
continue
|
||||
}
|
||||
|
||||
############################################
|
||||
# test printing from namespace imported into
|
||||
# imported namespace
|
||||
|
||||
gdb_test "print ax" "= 9"
|
||||
|
||||
############################################
|
||||
# test that gdb can print without falling
|
||||
# into search loop
|
||||
|
||||
gdb_test "print dx" "= 99"
|
||||
|
||||
############################################
|
||||
# test printing from namespace imported into
|
||||
# imported namespace where imports are implicit
|
||||
# anonymous namespace imports.
|
||||
|
||||
gdb_test "print xx" "= 999"
|
60
gdb/testsuite/gdb.cp/nsstress.cc
Normal file
60
gdb/testsuite/gdb.cp/nsstress.cc
Normal file
|
@ -0,0 +1,60 @@
|
|||
|
||||
namespace A{ int x; }
|
||||
namespace B{ int x; }
|
||||
namespace C{ int x; }
|
||||
namespace D{ int x; }
|
||||
namespace E{ int x; }
|
||||
namespace F{ int x; }
|
||||
namespace G{ int x; }
|
||||
namespace H{ int x; }
|
||||
namespace I{ int x; }
|
||||
namespace J{ int x; }
|
||||
namespace K{ int x; }
|
||||
namespace L{ int x; }
|
||||
namespace M{ int x; }
|
||||
namespace N{ int x; }
|
||||
namespace O{ int x; }
|
||||
namespace P{ int x; }
|
||||
namespace Q{ int x; }
|
||||
namespace R{ int x; }
|
||||
namespace S{ int x; }
|
||||
namespace T{ int x; }
|
||||
namespace U{ int x; }
|
||||
namespace V{ int x; }
|
||||
namespace W{ int x; }
|
||||
namespace X{ int x; }
|
||||
namespace Y{ int x; }
|
||||
namespace Z{ int x; }
|
||||
|
||||
|
||||
int main(){
|
||||
|
||||
using namespace A;
|
||||
using namespace B;
|
||||
using namespace C;
|
||||
using namespace D;
|
||||
using namespace E;
|
||||
using namespace F;
|
||||
using namespace G;
|
||||
using namespace H;
|
||||
using namespace I;
|
||||
using namespace J;
|
||||
using namespace K;
|
||||
using namespace L;
|
||||
using namespace M;
|
||||
using namespace N;
|
||||
using namespace O;
|
||||
using namespace P;
|
||||
using namespace Q;
|
||||
using namespace R;
|
||||
using namespace S;
|
||||
using namespace T;
|
||||
using namespace U;
|
||||
using namespace V;
|
||||
using namespace W;
|
||||
using namespace X;
|
||||
using namespace Y;
|
||||
using namespace Z;
|
||||
|
||||
return 0;
|
||||
}
|
52
gdb/testsuite/gdb.cp/nsstress.exp
Normal file
52
gdb/testsuite/gdb.cp/nsstress.exp
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Copyright 2008 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Stress test namespace lookup
|
||||
|
||||
if $tracelevel then {
|
||||
strace $tracelevel
|
||||
}
|
||||
|
||||
set prms_id 0
|
||||
set bug_id 0
|
||||
|
||||
set testfile nsstress
|
||||
set srcfile ${testfile}.cc
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
|
||||
untested "Couldn't compile test program"
|
||||
return -1
|
||||
}
|
||||
|
||||
if [get_compiler_info ${binfile}] {
|
||||
return -1
|
||||
}
|
||||
|
||||
# Get things started.
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
if ![runto_main] then {
|
||||
perror "couldn't run to breakpoint main"
|
||||
continue
|
||||
}
|
||||
|
||||
############################################
|
||||
# Test that the search can fail efficiently
|
||||
|
||||
gdb_test "print y" "No symbol \"y\" in current context."
|
|
@ -3098,7 +3098,7 @@ value_maybe_namespace_elt (const struct type *curtype,
|
|||
|
||||
sym = cp_lookup_symbol_namespace (namespace_name, name, NULL,
|
||||
get_selected_block (0),
|
||||
VAR_DOMAIN);
|
||||
VAR_DOMAIN, 1);
|
||||
|
||||
if (sym == NULL)
|
||||
return NULL;
|
||||
|
|
Loading…
Add table
Reference in a new issue