aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/cp-namespace.c19
-rw-r--r--gdb/symtab.c20
-rw-r--r--gdb/symtab.h6
-rw-r--r--gdb/testsuite/ChangeLog18
-rw-r--r--gdb/testsuite/gdb.cp/namespace.exp68
-rw-r--r--gdb/testsuite/gdb.cp/namespace1.cc15
-rw-r--r--gdb/valops.c12
8 files changed, 159 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 78dcf55..39ae349 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * cp-namespace.c (cp_lookup_nested_type): New variable
+ concatenated_name. Turn the current return condition into a reverse
+ one. Call also lookup_static_symbol_aux on the constructed qualified
+ name.
+ * symtab.c (lookup_symbol_aux): Move variable objfile and searching in
+ other files into a called ...
+ (lookup_static_symbol_aux): ... new function here.
+ * symtab.h (lookup_static_symbol_aux): New prototype.
+ * valops.c (value_maybe_namespace_elt): Call also
+ lookup_static_symbol_aux if we failed otherwise.
+
+2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Fix PR c++/11703 and PR gdb/1448.
* c-exp.y (yylex) <last_was_coloncolon && first_was_coloncolon>: Add
FIRST_ITER check.
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 0daf732..d0fdcbe 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -578,11 +578,24 @@ cp_lookup_nested_type (struct type *parent_type,
nested_name,
block,
VAR_DOMAIN);
+ char *concatenated_name;
- if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
- return NULL;
- else
+ if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
return SYMBOL_TYPE (sym);
+
+ /* Now search all static file-level symbols. Not strictly correct,
+ but more useful than an error. We do not try to guess any imported
+ namespace as even the fully specified namespace seach is is already
+ not C++ compliant and more assumptions could make it too magic. */
+
+ concatenated_name = alloca (strlen (parent_name) + 2
+ + strlen (nested_name) + 1);
+ sprintf (concatenated_name, "%s::%s", parent_name, nested_name);
+ sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
+ if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
+ return SYMBOL_TYPE (sym);
+
+ return NULL;
}
default:
internal_error (__FILE__, __LINE__,
diff --git a/gdb/symtab.c b/gdb/symtab.c
index cada00e..feb986f 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1054,7 +1054,6 @@ lookup_symbol_aux (const char *name, const struct block *block,
{
struct symbol *sym;
const struct language_defn *langdef;
- struct objfile *objfile;
/* Make sure we do something sensible with is_a_field_of_this, since
the callers that set this parameter to some non-null value will
@@ -1122,10 +1121,21 @@ lookup_symbol_aux (const char *name, const struct block *block,
return sym;
/* Now search all static file-level symbols. Not strictly correct,
- but more useful than an error. Do the symtabs first, then check
- the psymtabs. If a psymtab indicates the existence of the
- desired name as a file-level static, then do psymtab-to-symtab
- conversion on the fly and return the found symbol. */
+ but more useful than an error. */
+
+ return lookup_static_symbol_aux (name, domain);
+}
+
+/* Search all static file-level symbols for NAME from DOMAIN. Do the symtabs
+ first, then check the psymtabs. If a psymtab indicates the existence of the
+ desired name as a file-level static, then do psymtab-to-symtab conversion on
+ the fly and return the found symbol. */
+
+struct symbol *
+lookup_static_symbol_aux (const char *name, const domain_enum domain)
+{
+ struct objfile *objfile;
+ struct symbol *sym;
sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain);
if (sym != NULL)
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 5b109ce..bedc10a 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -886,6 +886,12 @@ extern struct symbol *lookup_symbol_aux_block (const char *name,
const struct block *block,
const domain_enum domain);
+/* Lookup a symbol only in the file static scope of all the objfiles. */
+
+struct symbol *lookup_static_symbol_aux (const char *name,
+ const domain_enum domain);
+
+
/* lookup a symbol by name, within a specified block */
extern struct symbol *lookup_block_symbol (const struct block *, const char *,
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 05a5131..9f89500 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,23 @@
2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * gdb.cp/namespace.exp (whatis C::cOtherFileType)
+ (whatis ::C::cOtherFileType, whatis C::cOtherFileVar)
+ (whatis ::C::cOtherFileVar, print C::cOtherFileVar)
+ (print ::C::cOtherFileVar)
+ (whatis C::OtherFileClass::cOtherFileClassType)
+ (whatis ::C::OtherFileClass::cOtherFileClassType)
+ (print C::OtherFileClass::cOtherFileClassVar)
+ (print ::cOtherFileClassVar)
+ (print ::C::OtherFileClass::cOtherFileClassVar): New tests.
+ (ptype OtherFileClass, ptype ::C::OtherFileClass): Permit arbitrary
+ trailing content.
+ * gdb.cp/namespace1.cc (C::OtherFileClass::cOtherFileClassType)
+ (C::OtherFileClass::cOtherFileClassVar)
+ (C::OtherFileClass::cOtherFileClassVar_use, C::cOtherFileType)
+ (C::cOtherFileVar, C::cOtherFileVar_use): New.
+
+2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Test PR c++/11703 and PR gdb/1448.
* gdb.cp/namespace.exp (ptype ::C::NestedClass): Remove KFAIL for
gdb/1448.
diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp
index 95038fd..452dcdc 100644
--- a/gdb/testsuite/gdb.cp/namespace.exp
+++ b/gdb/testsuite/gdb.cp/namespace.exp
@@ -165,6 +165,70 @@ gdb_test "print BBB::Class::xyzq" \
gdb_test "break BBB::Class::xyzq" \
"Breakpoint.*at $hex: file.*namespace.cc, line 68\\."
+# Tests accessing static elements in namespace of other file.
+
+gdb_test "whatis C::cOtherFileType" "type = short"
+gdb_test "whatis ::C::cOtherFileType" "type = short"
+gdb_test "whatis C::cOtherFileVar" "type = const C::cOtherFileType"
+gdb_test "whatis ::C::cOtherFileVar" "type = const C::cOtherFileType"
+gdb_test "print C::cOtherFileVar" "\\$\[0-9\].* = 319"
+gdb_test "print ::C::cOtherFileVar" "\\$\[0-9\].* = 319"
+
+if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # The type in class is missing in older GCCs.
+ setup_xfail *-*-*
+}
+gdb_test "whatis C::OtherFileClass::cOtherFileClassType" "type = short"
+if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # The type in class is missing in older GCCs.
+ setup_xfail *-*-*
+}
+gdb_test "whatis ::C::OtherFileClass::cOtherFileClassType" "type = short"
+
+set test "print C::OtherFileClass::cOtherFileClassVar"
+gdb_test_multiple $test $test {
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ pass $test
+ }
+ -re "static field cOtherFileClassVar has been optimized out\r\n$gdb_prompt $" {
+ setup_kfail "c++/11702" "*-*-*"
+ fail $test
+ }
+}
+
+# FSF GCC <=4.4 creates unqualified DIE "cOtherFileClassVar" ignoring the
+# namespace the same way older GDB did.
+set test "print ::cOtherFileClassVar"
+set test2 "print ::C::OtherFileClass::cOtherFileClassVar"
+gdb_test_multiple $test $test {
+ -re "No symbol \"cOtherFileClassVar\" in current context\\.\r\n$gdb_prompt $" {
+ pass $test
+
+ gdb_test_multiple $test2 $test2 {
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ pass $test2
+ }
+ -re "static field cOtherFileClassVar has been optimized out\r\n$gdb_prompt $" {
+ setup_kfail "c++/11702" "*-*-*"
+ fail $test2
+ }
+ }
+
+ }
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # Do not permit to XFAIL on recent GCCs.
+ setup_xfail *-*-*
+ }
+ fail $test
+
+ unresolved $test2
+ }
+}
+
# Test to see if the appropriate namespaces are in scope when trying
# to print out stuff from within a function defined within a
# namespace.
@@ -200,8 +264,8 @@ gdb_test "ptype C::NestedClass" "No symbol \"NestedClass\" in namespace \"C::C\"
# Tests involving multiple files
gdb_test "print cOtherFile" "\\$\[0-9\].* = 316"
-gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n\}"
-gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n\}"
+gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n.*\}"
+gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n.*\}"
gdb_test "ptype C::OtherFileClass" "No symbol \"OtherFileClass\" in namespace \"C::C\"."
# Some anonymous namespace tests.
diff --git a/gdb/testsuite/gdb.cp/namespace1.cc b/gdb/testsuite/gdb.cp/namespace1.cc
index af0ec29..928e357 100644
--- a/gdb/testsuite/gdb.cp/namespace1.cc
+++ b/gdb/testsuite/gdb.cp/namespace1.cc
@@ -21,7 +21,15 @@ namespace C
class OtherFileClass {
public:
int z;
+
+ typedef short cOtherFileClassType;
+ static const cOtherFileClassType cOtherFileClassVar = 318;
+ cOtherFileClassType cOtherFileClassVar_use ();
};
+ OtherFileClass::cOtherFileClassType OtherFileClass::cOtherFileClassVar_use ()
+ {
+ return cOtherFileClassVar;
+ }
namespace {
int cXOtherFile = 29;
@@ -35,6 +43,13 @@ namespace C
static OtherFileClass *c = new OtherFileClass();
c->z = cOtherFile + cXOtherFile;
}
+
+ typedef short cOtherFileType;
+ static const cOtherFileType cOtherFileVar = 319;
+ cOtherFileType cOtherFileVar_use ()
+ {
+ return cOtherFileVar;
+ }
}
namespace {
diff --git a/gdb/valops.c b/gdb/valops.c
index 23a4eb1..7fbad10 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3284,8 +3284,16 @@ value_maybe_namespace_elt (const struct type *curtype,
struct value *result;
sym = cp_lookup_symbol_namespace (namespace_name, name,
- get_selected_block (0),
- VAR_DOMAIN);
+ get_selected_block (0), VAR_DOMAIN);
+
+ if (sym == NULL)
+ {
+ char *concatenated_name = alloca (strlen (namespace_name) + 2
+ + strlen (name) + 1);
+
+ sprintf (concatenated_name, "%s::%s", namespace_name, name);
+ sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
+ }
if (sym == NULL)
return NULL;