2010-03-15 Sami Wagiaalla <swagiaal@redhat.com>
authorSami Wagiaalla <swagiaal@redhat.com>
Mon, 15 Mar 2010 17:29:36 +0000 (17:29 +0000)
committerSami Wagiaalla <swagiaal@redhat.com>
Mon, 15 Mar 2010 17:29:36 +0000 (17:29 +0000)
        PR c++/7936:
        * cp-support.h: Added char *declaration element to using_direct
        data struct.
        (cp_add_using): Added char *declaration argument.
        (cp_add_using_directive): Ditto.
        (cp_lookup_symbol_imports): made extern.
        * cp-namespace.c: Updated with the above changes.
        * dwarf2read.c (read_import_statement): Ditto.
        (read_namespace): Ditto.
        (read_import_statement): Support import declarations.
        * cp-namespace.c (cp_lookup_symbol_imports): Check for imported
        declarations.
        Added support for 'declaration_only' search.
        (cp_lookup_symbol_namespace): Attempt to search for the name as
        is before consideration of imports.
        * symtab.c (lookup_symbol_aux_local): Added a 'declaration_only'
        search at every block level search.
        Now takes language argument.
        (lookup_symbol_aux): Updated.

    2010-03-15  Sami Wagiaalla  <swagiaal@redhat.com>

        * gdb.cp/shadow.exp: Removed kfail; test has been fix.
        * gdb.cp/nsusing.exp: Ditto.

gdb/ChangeLog
gdb/cp-namespace.c
gdb/cp-support.h
gdb/dwarf2read.c
gdb/eval.c
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/nsusing.exp
gdb/testsuite/gdb.cp/shadow.cc
gdb/testsuite/gdb.cp/shadow.exp
gdb/valops.c

index 2b3c172ea95de830ebd634544b0eb47384984a2c..72aa204d9080fd96946f486b58a1429dfe349c7d 100644 (file)
@@ -1,3 +1,25 @@
+2010-03-15  Sami Wagiaalla  <swagiaal@redhat.com>
+
+       PR c++/7936:
+       * cp-support.h: Added char *declaration element to using_direct
+       data struct.
+       (cp_add_using): Added char *declaration argument.
+       (cp_add_using_directive): Ditto.
+       (cp_lookup_symbol_imports): made extern.
+       * cp-namespace.c: Updated with the above changes.
+       * dwarf2read.c (read_import_statement): Ditto.
+       (read_namespace): Ditto.
+       (read_import_statement): Support import declarations.
+       * cp-namespace.c (cp_lookup_symbol_imports): Check for imported
+       declarations.
+       Added support for 'declaration_only' search.
+       (cp_lookup_symbol_namespace): Attempt to search for the name as
+       is before consideration of imports.
+       * symtab.c (lookup_symbol_aux_local): Added a 'declaration_only'
+       search at every block level search.
+       Now takes language argument.
+       (lookup_symbol_aux): Updated.
+
 2010-03-15  Tom Tromey  <tromey@redhat.com>
 
        * c-exp.y (name_not_typename): Add 'operator' clause.
index edac2bd86421e385bd75c75172f4ce0e7a0dde3e..43f9c9a6091870451e1967209328257ce82c577d 100644 (file)
@@ -115,7 +115,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
                 anonymous namespace.  So add symbols in it to the
                 namespace given by the previous component if there is
                 one, or to the global namespace if there isn't.  */
-             cp_add_using_directive (dest, src, NULL,
+             cp_add_using_directive (dest, src, NULL, NULL,
                                      &SYMBOL_SYMTAB (symbol)->objfile->objfile_obstack);
            }
          /* The "+ 2" is for the "::".  */
@@ -133,16 +133,20 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
    Create a new struct using_direct which imports the namespace SRC into the
    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.
-   The arguments are copied into newly allocated memory so they can be 
-   temporaries.  */
+   DECLARATION is the name if the imported varable if this is a declaration
+   import (Eg. using A::x), otherwise it is NULL. The arguments are copied
+   into newly allocated memory so they can be temporaries.  */
 
 void
-cp_add_using_directive (const char *dest, const char *src, const char *alias,
+cp_add_using_directive (const char *dest,
+                       const char *src,
+                       const char *alias,
+                       const char *declaration,
                         struct obstack *obstack)
 {
   struct using_direct *current;
   struct using_direct *new;
-
+  
   /* Has it already been added?  */
 
   for (current = using_directives; current != NULL; current = current->next)
@@ -151,7 +155,10 @@ cp_add_using_directive (const char *dest, const char *src, const char *alias,
           && strcmp (current->import_dest, dest) == 0
           && ((alias == NULL && current->alias == NULL)
               || (alias != NULL && current->alias != NULL
-                 && strcmp (alias, current->alias) == 0)))
+                 && strcmp (alias, current->alias) == 0))
+         && ((declaration == NULL && current->declaration == NULL)
+             || (declaration != NULL && current->declaration != NULL
+                 && strcmp (declaration, current->declaration) == 0)))
        return;
     }
 
@@ -163,6 +170,10 @@ cp_add_using_directive (const char *dest, const char *src, const char *alias,
   if (alias != NULL)
     new->alias = obsavestring (alias, strlen (alias), obstack);
 
+  if (declaration != NULL)
+    new->declaration = obsavestring (declaration, strlen (declaration),
+                                     obstack);
+
   new->next = using_directives;
   using_directives = new;
 }
@@ -234,10 +245,10 @@ cp_lookup_symbol_nonlocal (const char *name,
   if (sym != NULL)
     return sym;
 
-  return cp_lookup_symbol_namespace (scope, name, block, domain, 1);
+  return cp_lookup_symbol_namespace (scope, name, block, domain);
 }
 
-/* Look up NAME in the C++ namespace NAMESPACE. Other arguments are as in
+/* Look up NAME in the C++ namespace NAMESPACE.  Other arguments are as in
    cp_lookup_symbol_nonlocal.  */
 
 static struct symbol *
@@ -273,7 +284,15 @@ reset_directive_searched (void *data)
 }
 
 /* Search for NAME by applying all import statements belonging
-   to BLOCK which are applicable in SCOPE.
+   to BLOCK which are applicable in SCOPE.  If DECLARATION_ONLY the search
+   is restricted to using declarations.
+   Example:
+
+     namespace A{
+       int x;
+     }
+     using A::x;
+
    If SEARCH_PARENTS the search will include imports which are applicable in
    parents of SCOPE.
    Example:
@@ -286,24 +305,27 @@ reset_directive_searched (void *data)
      }
 
    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
+   and Y will be considered.  If SEARCH_PARENTS is false only the import of Y
    is considered.  */
 
-static struct symbol *
+struct symbol *
 cp_lookup_symbol_imports (const char *scope,
                           const char *name,
                           const struct block *block,
                           const domain_enum domain,
+                          const int declaration_only,
                           const int search_parents)
 {
   struct using_direct *current;
-  struct symbol *sym;
+  struct symbol *sym = NULL;
   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, block, domain);
+  if (!declaration_only)
+    sym = cp_lookup_symbol_in_namespace (scope, name, block, domain);
+  
   if (sym != NULL)
     return sym;
 
@@ -332,6 +354,30 @@ cp_lookup_symbol_imports (const char *scope,
        current->searched = 1;
        searched_cleanup = make_cleanup (reset_directive_searched, current);
 
+       /* If there is an import of a single declaration, compare the imported
+          declaration with the sought out name.  If there is a match pass
+          current->import_src as NAMESPACE to direct the search towards the
+          imported namespace.  */
+       if (current->declaration && strcmp (name, current->declaration) == 0)
+         sym = cp_lookup_symbol_in_namespace (current->import_src,
+                                              name,
+                                              block,
+                                              domain);
+
+       /* If this is a DECLARATION_ONLY search or a symbol was found or
+          this import statement was an import declaration, the search
+          of this import is complete.  */
+        if (declaration_only || sym != NULL || current->declaration)
+          {
+            current->searched = 0;
+            discard_cleanups (searched_cleanup);
+
+            if (sym != NULL)
+              return sym;
+
+            continue;
+          }
+
        if (current->alias != NULL && strcmp (name, current->alias) == 0)
          /* If the import is creating an alias and the alias matches the
             sought name.  Pass current->import_src as the NAME to direct the
@@ -350,6 +396,7 @@ cp_lookup_symbol_imports (const char *scope,
                                            name,
                                            block,
                                            domain,
+                                           0,
                                            0);
          }
        current->searched = 0;
@@ -371,16 +418,19 @@ struct symbol*
 cp_lookup_symbol_namespace (const char *scope,
                             const char *name,
                             const struct block *block,
-                            const domain_enum domain,
-                            const int search_parents)
+                            const domain_enum domain)
 {
   struct symbol *sym;
+  
+  /* First, try to find the symbol in the given namespace.  */
+  sym = cp_lookup_symbol_in_namespace (scope, name, block, domain);
+  if (sym != NULL)
+    return sym;
 
   /* Search for name in namespaces imported to this and parent blocks.  */
   while (block != NULL)
     {
-      sym = cp_lookup_symbol_imports (scope, name, block, domain,
-                                      search_parents);
+      sym = cp_lookup_symbol_imports (scope, name, block, domain, 0, 1);
 
       if (sym)
        return sym;
index e10f5a979fdecc345c3cad7d6440103eb0acd604..f2f202f139722126a262cc97f32b1f8ea51c6cf5 100644 (file)
@@ -44,6 +44,11 @@ struct demangle_component;
    Eg:
        namespace C = A::B;
    ALIAS = "C"
+   DECLARATION is the name of the imported declaration, if this import
+   statement represents one.
+   Eg:
+       using A::x;
+   Where x is variable in namespace A.  DECLARATION is set to x.
 */
 
 struct using_direct
@@ -52,6 +57,7 @@ struct using_direct
   char *import_dest;
 
   char *alias;
+  char *declaration;
 
   struct using_direct *next;
 
@@ -91,6 +97,7 @@ extern int cp_is_anonymous (const char *namespace);
 extern void cp_add_using_directive (const char *dest,
                                     const char *src,
                                     const char *alias,
+                                   const char *declaration,
                                     struct obstack *obstack);
 
 extern void cp_initialize_namespace (void);
@@ -113,8 +120,14 @@ extern struct symbol *cp_lookup_symbol_nonlocal (const char *name,
 extern struct symbol *cp_lookup_symbol_namespace (const char *namespace,
                                                  const char *name,
                                                  const struct block *block,
-                                                 const domain_enum domain,
-                                                 const int search_parents);
+                                                 const domain_enum domain);
+
+extern struct symbol *cp_lookup_symbol_imports (const char *scope,
+                                                const char *name,
+                                                const struct block *block,
+                                                const domain_enum domain,
+                                                const int declaration_only,
+                                                const int search_parents);
 
 extern struct type *cp_lookup_nested_type (struct type *parent_type,
                                           const char *nested_name,
index 2d21edbb3ac9e332ce2b853cd082b38fa68529ce..db3f39614e9165871ad5cc97f3eb3f0bbfd84c92 100644 (file)
@@ -3383,10 +3383,12 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
   struct dwarf2_cu *imported_cu;
   const char *imported_name;
   const char *imported_name_prefix;
-  char *import_alias;
-
+  const char *canonical_name;
+  const char *import_alias;
+  const char *imported_declaration = NULL;
   const char *import_prefix;
-  char *canonical_name;
+
+  char *temp;
 
   import_attr = dwarf2_attr (die, DW_AT_import, cu);
   if (import_attr == NULL)
@@ -3446,23 +3448,27 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
      to the name of the imported die.  */
   imported_name_prefix = determine_prefix (imported_die, imported_cu);
 
-  if (strlen (imported_name_prefix) > 0)
+  if (imported_die->tag != DW_TAG_namespace)
     {
-      canonical_name = alloca (strlen (imported_name_prefix)
-                               + 2 + strlen (imported_name) + 1);
-      strcpy (canonical_name, imported_name_prefix);
-      strcat (canonical_name, "::");
-      strcat (canonical_name, imported_name);
+      imported_declaration = imported_name;
+      canonical_name = imported_name_prefix;
     }
-  else
+  else if (strlen (imported_name_prefix) > 0)
     {
-      canonical_name = alloca (strlen (imported_name) + 1);
-      strcpy (canonical_name, imported_name);
+      temp = alloca (strlen (imported_name_prefix)
+                     + 2 + strlen (imported_name) + 1);
+      strcpy (temp, imported_name_prefix);
+      strcat (temp, "::");
+      strcat (temp, imported_name);
+      canonical_name = temp;
     }
+  else
+    canonical_name = imported_name;
 
   cp_add_using_directive (import_prefix,
                           canonical_name,
                           import_alias,
+                          imported_declaration,
                           &cu->objfile->objfile_obstack);
 }
 
@@ -5584,7 +5590,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
        {
          const char *previous_prefix = determine_prefix (die, cu);
          cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL,
-                                 &objfile->objfile_obstack);
+                                 NULL, &objfile->objfile_obstack);
        }
     }
 
index 3bcd417354ed2c04c99d97980cafc991643149e8..fd132ea1443645e47b2a58494f5a5df5131e3285 100644 (file)
@@ -1435,7 +1435,7 @@ evaluate_subexp_standard (struct type *expect_type,
              function = cp_lookup_symbol_namespace (TYPE_TAG_NAME (type),
                                                     name,
                                                     get_selected_block (0),
-                                                    VAR_DOMAIN, 1);
+                                                    VAR_DOMAIN);
              if (function == NULL)
                error (_("No symbol \"%s\" in namespace \"%s\"."), 
                       name, TYPE_TAG_NAME (type));
index aa0aae630079ec2a1bd1bd93bbf07af37af2bd8f..78118ee4d2a4b28e209c29f0d95f146e9f034f28 100644 (file)
@@ -95,7 +95,8 @@ static struct symbol *lookup_symbol_aux (const char *name,
 static
 struct symbol *lookup_symbol_aux_local (const char *name,
                                        const struct block *block,
-                                       const domain_enum domain);
+                                       const domain_enum domain,
+                                       enum language language);
 
 static
 struct symbol *lookup_symbol_aux_symtabs (int block_index,
@@ -1029,12 +1030,12 @@ lookup_symbol_aux (const char *name, const struct block *block,
   /* Search specified block and its superiors.  Don't search
      STATIC_BLOCK or GLOBAL_BLOCK.  */
 
-  sym = lookup_symbol_aux_local (name, block, domain);
+  sym = lookup_symbol_aux_local (name, block, domain, language);
   if (sym != NULL)
     return sym;
 
   /* If requested to do so by the caller and if appropriate for LANGUAGE,
-     check to see if NAME is a field of `this'. */
+     check to see if NAME is a field of `this'.  */
 
   langdef = language_def (language);
 
@@ -1107,11 +1108,13 @@ lookup_symbol_aux (const char *name, const struct block *block,
 
 static struct symbol *
 lookup_symbol_aux_local (const char *name, const struct block *block,
-                        const domain_enum domain)
+                         const domain_enum domain,
+                         enum language language)
 {
   struct symbol *sym;
   const struct block *static_block = block_static_block (block);
-
+  const char *scope = block_scope (block);
+  
   /* Check if either no block is specified or it's a global block.  */
 
   if (static_block == NULL)
@@ -1123,6 +1126,18 @@ lookup_symbol_aux_local (const char *name, const struct block *block,
       if (sym != NULL)
        return sym;
 
+      if (language == language_cplus)
+        {
+          sym = cp_lookup_symbol_imports (scope,
+                                          name,
+                                          block,
+                                          domain,
+                                          1,
+                                          1);
+          if (sym != NULL)
+            return sym;
+        }
+
       if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block))
        break;
       block = BLOCK_SUPERBLOCK (block);
index b675f98c27797ab038a3555bdebd6b64d484e122..d79a15cf5909d83a0a6b54753af12be86c56217d 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-15  Sami Wagiaalla  <swagiaal@redhat.com>
+
+       * gdb.cp/shadow.exp: Removed kfail; test has been fix.
+       * gdb.cp/nsusing.exp: Ditto.
+
 2010-03-15  Tom Tromey  <tromey@redhat.com>
 
        * gdb.cp/userdef.exp: Add tests for explicit calls to operator==.
index 72a616e9be931cd89bc9c5b25050519879a8c7af..b060ee20f8c423ac22a1e71c5a02b7b40af2ff4f 100644 (file)
@@ -154,7 +154,7 @@ if ![runto marker4] then {
     perror "couldn't run to breakpoint marker4"
     continue
 }
-setup_kfail "gdb/7936" "*-*-*"
+
 gdb_test "print dx" "= 4"
 
 ############################################
index 16515109ab90e3f52bc2b0c297ceb44dc3e54d89..0520b2aeb8b6afecd7091cac3e295bec99c485b1 100644 (file)
@@ -29,8 +29,10 @@ public:
                 using namespace A;
                 y++; // marker4
 
-                using A::x;
-                y++; // marker5
+                {
+                  using A::x;
+                  y++; // marker5
+                }
               }
           }
       }
index 1e5e80becfe6b9989f6261b8b5ba34902773d658..40c35a424e8f1ace5c68844af0e722542c6bdb2c 100644 (file)
@@ -85,5 +85,4 @@ gdb_test "print x" "= 55" "Print local x not namespace x"
 gdb_breakpoint [gdb_get_line_number "marker5"]
 gdb_continue_to_breakpoint "marker5"
 
-setup_kfail "gdb/7936" "*-*-*"
 gdb_test "print x" "= 11" "Print imported namespace x"
index 4a7a3349adb2a4af75167f3978bfb050dc488a10..f2997df6207cba28012d1a381c14f58bbc299ce7 100644 (file)
@@ -3143,9 +3143,9 @@ value_maybe_namespace_elt (const struct type *curtype,
   struct symbol *sym;
   struct value *result;
 
-  sym = cp_lookup_symbol_namespace(namespace_name, name,
+  sym = cp_lookup_symbol_namespace (namespace_name, name,
                                    get_selected_block (0), 
-                                   VAR_DOMAIN, 1);
+                                   VAR_DOMAIN);
 
   if (sym == NULL)
     return NULL;