c++/8218: Destructors w/arguments.
For a long time now, c++/8218 has noted that GDB is printing argument types for destructors: (gdb) ptype A type = class A { public: ~A(int); } This happens because cp_type_print_method_args doesn't ignore artificial arguments. [It ignores the first `this' pointer because it simply skips the first argument for any non-static function.] This patch fixes this: (gdb) ptype A type = class A { public: ~A(); } I've adjusted gdb.cp/templates.exp to account for this and added a new passing regexp. gdb/ChangeLog PR c++/8218 * c-typeprint.c (cp_type_print_method_args): Skip artificial arguments. gdb/testsuite/ChangeLog PR c++/8128 * gdb.cp/templates.exp (test_ptype_of_templates): Remove argument type from destructor regexps. Add a branch which actually passes the test. Adjust "ptype t5i" test names.
This commit is contained in:
parent
7b5d48229b
commit
5f4d108508
4 changed files with 38 additions and 11 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2017-03-10 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
|
PR c++/8218
|
||||||
|
* c-typeprint.c (cp_type_print_method_args): Skip artificial arguments.
|
||||||
|
|
||||||
2017-03-08 Pedro Alves <palves@redhat.com>
|
2017-03-08 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
PR gdb/18360
|
PR gdb/18360
|
||||||
|
|
|
@ -226,13 +226,21 @@ cp_type_print_method_args (struct type *mtype, const char *prefix,
|
||||||
language_cplus, DMGL_ANSI);
|
language_cplus, DMGL_ANSI);
|
||||||
fputs_filtered ("(", stream);
|
fputs_filtered ("(", stream);
|
||||||
|
|
||||||
/* Skip the class variable. */
|
/* Skip the class variable. We keep this here to accommodate older
|
||||||
|
compilers and debug formats which may not support artificial
|
||||||
|
parameters. */
|
||||||
i = staticp ? 0 : 1;
|
i = staticp ? 0 : 1;
|
||||||
if (nargs > i)
|
if (nargs > i)
|
||||||
{
|
{
|
||||||
while (i < nargs)
|
while (i < nargs)
|
||||||
{
|
{
|
||||||
c_print_type (args[i++].type, "", stream, 0, 0, flags);
|
struct field arg = args[i++];
|
||||||
|
|
||||||
|
/* Skip any artificial arguments. */
|
||||||
|
if (FIELD_ARTIFICIAL (arg))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
c_print_type (arg.type, "", stream, 0, 0, flags);
|
||||||
|
|
||||||
if (i == nargs && varargs)
|
if (i == nargs && varargs)
|
||||||
fprintf_filtered (stream, ", ...");
|
fprintf_filtered (stream, ", ...");
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2017-03-10 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
|
PR c++/8128
|
||||||
|
* gdb.cp/templates.exp (test_ptype_of_templates): Remove argument
|
||||||
|
type from destructor regexps.
|
||||||
|
Add a branch which actually passes the test.
|
||||||
|
Adjust "ptype t5i" test names.
|
||||||
|
|
||||||
2017-03-08 Pedro Alves <palves@redhat.com>
|
2017-03-08 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* gdb.base/step-over-exit.exp: Add explicit test message.
|
* gdb.base/step-over-exit.exp: Add explicit test message.
|
||||||
|
|
|
@ -46,16 +46,16 @@ proc test_ptype_of_templates {} {
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}T5<int> & operator=\\(T5<int> const ?&\\);${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}T5<int> & operator=\\(T5<int> const ?&\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype T5<int> -- new without size_t"
|
xfail "ptype T5<int> -- new without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}${ws}$gdb_prompt $" {
|
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(()\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}${ws}$gdb_prompt $" {
|
||||||
xfail "ptype T5<int> -- new with unsigned int"
|
xfail "ptype T5<int> -- new with unsigned int"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \\{.*public:.*static int X;.*int x;.*int val;.*T5 \\(int\\);.*T5 \\(const class T5<int> &\\);.*void ~T5 \\(int\\);.*static void \\* new \\(unsigned long\\);.*static void delete \\(void ?\\*\\);.*int value \\((void|)\\);.*\\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \\{.*public:.*static int X;.*int x;.*int val;.*T5 \\(int\\);.*T5 \\(const class T5<int> &\\);.*void ~T5 \\(\\);.*static void \\* new \\(unsigned long\\);.*static void delete \\(void ?\\*\\);.*int value \\((void|)\\);.*\\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype T5<int> -- new with unsigned long"
|
xfail "ptype T5<int> -- new with unsigned long"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5<int> & operator=\\(T5<int> const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\((T5<int> const|const T5<int>) ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5<int> & operator=\\(T5<int> const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\((T5<int> const|const T5<int>) ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype T5<int> (obsolescent gcc or gdb)"
|
xfail "ptype T5<int> (obsolescent gcc or gdb)"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
# This also triggers gdb/1113...
|
# This also triggers gdb/1113...
|
||||||
kfail "gdb/1111" "ptype T5<int>"
|
kfail "gdb/1111" "ptype T5<int>"
|
||||||
# Add here a PASS case when PR gdb/1111 gets fixed.
|
# Add here a PASS case when PR gdb/1111 gets fixed.
|
||||||
|
@ -68,19 +68,22 @@ proc test_ptype_of_templates {} {
|
||||||
# The destructor has an argument type.
|
# The destructor has an argument type.
|
||||||
kfail "gdb/8218" "ptype T5<int>"
|
kfail "gdb/8218" "ptype T5<int>"
|
||||||
}
|
}
|
||||||
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
|
pass "ptype T5<int>"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test_multiple "ptype/r t5i" "ptype t5i" {
|
gdb_test_multiple "ptype/r t5i" "ptype t5i" {
|
||||||
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5\\(int\\);${ws}T5\\(T5<int> const ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5\\(int\\);${ws}T5\\(T5<int> const ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype T5<int> -- with several fixes from 4.17 -- without size_t"
|
xfail "ptype T5<int> -- with several fixes from 4.17 -- without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype t5i<int> -- new with unsigned int -- without size_t"
|
xfail "ptype t5i<int> -- new with unsigned int -- without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned long\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5<int> &\\);${ws}void ~T5 \\(\\);${ws}static void \\* new \\(unsigned long\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype t5i<int> -- new with unsigned long -- without size_t"
|
xfail "ptype t5i<int> -- new with unsigned long -- without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \{.*public:.*static int X;.*int x;.*int val;.*.*T5 \\(int\\);.*.*void ~T5 \\(int\\).*.*.*int value \\((void|)\\);.*\}.*$gdb_prompt $" {
|
-re "type = class T5<int> \{.*public:.*static int X;.*int x;.*int val;.*.*T5 \\(int\\);.*.*void ~T5 \\(\\).*.*.*int value \\((void|)\\);.*\}.*$gdb_prompt $" {
|
||||||
xfail "ptype t5i -- without size_t"
|
xfail "ptype t5i -- without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5<int> & operator=\\(T5<int> const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5<int> & operator=\\(T5<int> const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
|
@ -92,9 +95,9 @@ proc test_ptype_of_templates {} {
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5<int> & operator=\\(T5<int> const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\(T5<int> const ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5<int> & operator=\\(T5<int> const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\(T5<int> const ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" {
|
||||||
xfail "ptype t5i (obsolescent gcc or gdb) -- without size_t"
|
xfail "ptype t5i (obsolescent gcc or gdb) -- without size_t"
|
||||||
}
|
}
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
# This also triggers gdb/1113...
|
# This also triggers gdb/1113...
|
||||||
kfail "gdb/1111" "ptype T5<int>"
|
kfail "gdb/1111" "ptype t5i"
|
||||||
# Add here a PASS case when PR gdb/1111 gets fixed.
|
# Add here a PASS case when PR gdb/1111 gets fixed.
|
||||||
# These are really:
|
# These are really:
|
||||||
# http://sourceware.org/bugzilla/show_bug.cgi?id=8216
|
# http://sourceware.org/bugzilla/show_bug.cgi?id=8216
|
||||||
|
@ -103,7 +106,10 @@ proc test_ptype_of_templates {} {
|
||||||
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
# http://sourceware.org/bugzilla/show_bug.cgi?id=8218
|
# http://sourceware.org/bugzilla/show_bug.cgi?id=8218
|
||||||
# The destructor has an argument type.
|
# The destructor has an argument type.
|
||||||
kfail "gdb/8218" "ptype T5<int>"
|
kfail "gdb/8218" "ptype t5i"
|
||||||
|
}
|
||||||
|
-re "type = class T5<int> \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5\\(int\\);${ws}T5\\((T5<int> const|const T5<int>) ?&\\);${ws}~T5\\(\\);${ws}static void \\* operator new\\((size_t|unsigned( int| long|))\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" {
|
||||||
|
pass "ptype t5i"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue