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:
Sami Wagiaalla 2010-01-26 16:47:35 +00:00
parent 8540c487c6
commit b14e635ec4
11 changed files with 444 additions and 16 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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,

View File

@ -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

View 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;
}

View 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."

View 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;
}

View 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"

View 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;
}

View 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."

View File

@ -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;