+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:
/* 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;
+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
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
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;
}
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