aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/cp-support.c16
-rw-r--r--gdb/testsuite/ChangeLog9
-rw-r--r--gdb/testsuite/gdb.cp/meth-typedefs.cc13
-rw-r--r--gdb/testsuite/gdb.cp/meth-typedefs.exp5
5 files changed, 46 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 17e10e8..e0120e7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-25 Keith Seitz <keiths@redhat.com>
+
+ PR c++/24367
+ * cp-support.c (inspect_type): Don't attempt substitutions
+ of symbol with the same name.
+
2019-04-25 Tom Tromey <tromey@adacore.com>
PR gdb/24475:
diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index d02a01d..4afb79a 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -190,10 +190,20 @@ inspect_type (struct demangle_parse_info *info,
/* Get the real type of the typedef. */
type = check_typedef (otype);
- /* If the symbol is a namespace and its type name is no different
+ /* If the symbol name is the same as the original type name,
+ don't substitute. That would cause infinite recursion in
+ symbol lookups, as the typedef symbol is often the first
+ found symbol in the symbol table.
+
+ However, this can happen in a number of situations, such as:
+
+ If the symbol is a namespace and its type name is no different
than the name we looked up, this symbol is not a namespace
- alias and does not need to be substituted. */
- if (TYPE_CODE (otype) == TYPE_CODE_NAMESPACE
+ alias and does not need to be substituted.
+
+ If the symbol is typedef and its type name is the same
+ as the symbol's name, e.g., "typedef struct foo foo;". */
+ if (TYPE_NAME (type) != nullptr
&& strcmp (TYPE_NAME (type), name) == 0)
return 0;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c81d841..9b0725a 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2019-04-25 Keith Seitz <keiths@redhat.com>
+
+ PR c++/24367
+ * gdb.cp/meth-typedefs.cc (incomplete_struct)
+ (another_incomplete_struct, test_incomplete): New definitions.
+ (main): Use new definitions.
+ * gdb.cp/meth-typedefs.exp: Add new tests for `test_incomplete'
+ functions.
+
2019-04-25 Sergio Durigan Junior <sergiodj@redhat.com>
PR corefiles/11608
diff --git a/gdb/testsuite/gdb.cp/meth-typedefs.cc b/gdb/testsuite/gdb.cp/meth-typedefs.cc
index 0c4d095..f65478e 100644
--- a/gdb/testsuite/gdb.cp/meth-typedefs.cc
+++ b/gdb/testsuite/gdb.cp/meth-typedefs.cc
@@ -36,6 +36,13 @@ typedef void (*fptr2) (fptr1, my_other_type_2);
typedef void (*fptr3) (fptr2, my_other_type);
typedef void (*fptr4) (anon_enum a, anon_struct const& b, anon_union const*** c);
+// For c++/24367 testing
+typedef struct incomplete_struct incomplete_struct;
+typedef struct _incomplete_struct another_incomplete_struct;
+int test_incomplete (incomplete_struct *p) { return 0; } // test_incomplete(incomplete_struct*)
+int test_incomplete (another_incomplete_struct *p) { return 1; } // test_incomplete(another_incomplete_struct*)
+int test_incomplete (int *p) { return -1; } // test_incomplete(int*)
+
namespace A
{
class foo
@@ -147,5 +154,11 @@ main (void)
fptr4 f4;
+ // Tests for c++/24367
+ int *i = nullptr;
+ incomplete_struct *is = nullptr;
+ another_incomplete_struct *ais = nullptr;
+ int result = (test_incomplete (i) + test_incomplete (is)
+ + test_incomplete (ais));
return 0;
}
diff --git a/gdb/testsuite/gdb.cp/meth-typedefs.exp b/gdb/testsuite/gdb.cp/meth-typedefs.exp
index b9c383b..76a8fc9 100644
--- a/gdb/testsuite/gdb.cp/meth-typedefs.exp
+++ b/gdb/testsuite/gdb.cp/meth-typedefs.exp
@@ -137,6 +137,11 @@ foreach t $typedefs(_BAR_) {
add methods "test" "$t&" {_BAR_&}
}
+# Tests for c++/24367
+foreach t {int incomplete_struct another_incomplete_struct} {
+ add methods "test_incomplete" "${t}*" [string_to_regexp "${t}*"]
+}
+
gdb_test_no_output "set listsize 1" ""
# Finally, for each method in the list METHODS, check whether