| Index: gdb/testsuite/gdb.cp/templates.exp | 
| diff --git a/gdb/testsuite/gdb.cp/templates.exp b/gdb/testsuite/gdb.cp/templates.exp | 
| index c6b41736b22dfc18ed6916703ce1445c6fdb2f27..47915b181677bfc08263ea5a4f5f3cdf45f623ab 100644 | 
| --- a/gdb/testsuite/gdb.cp/templates.exp | 
| +++ b/gdb/testsuite/gdb.cp/templates.exp | 
| @@ -18,25 +18,18 @@ | 
|  | 
| set ws "\[\r\n\t \]+" | 
|  | 
| -if $tracelevel then { | 
| -	strace $tracelevel | 
| -} | 
| - | 
| if { [skip_cplus_tests] } { continue } | 
|  | 
| -set testfile "templates" | 
| -set srcfile ${testfile}.cc | 
| -set binfile ${objdir}/${subdir}/${testfile} | 
| +standard_testfile .cc | 
|  | 
| # Create and source the file that provides information about the compiler | 
| # used to compile the test case. | 
| -if [get_compiler_info ${binfile} "c++"] { | 
| +if [get_compiler_info "c++"] { | 
| return -1 | 
| } | 
|  | 
| -if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { | 
| -     untested templates.exp | 
| -     return -1 | 
| +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { | 
| +    return -1 | 
| } | 
|  | 
| # | 
| @@ -49,51 +42,53 @@ proc test_ptype_of_templates {} { | 
|  | 
| gdb_test_multiple "ptype T5<int>" "ptype T5<int>" { | 
| -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 $" { | 
| -	    pass "ptype T5<int>" | 
| +	    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}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 $" { | 
| -	    pass "ptype T5<int>" | 
| +	    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 $" { | 
| -	    pass "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 $" { | 
| -	    pass "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 $" { | 
| -	    pass "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\\(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\\(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 $" { | 
| # This also triggers gdb/1113... | 
| kfail "gdb/1111" "ptype T5<int>" | 
| +	    # Add here a PASS case when PR gdb/1111 gets fixed. | 
| } | 
| } | 
|  | 
| gdb_test_multiple "ptype 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 $" { | 
| -	    pass "ptype T5<int> -- with several fixes from 4.17" | 
| +	    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 $" { | 
| -	    pass "ptype t5i<int> -- new with unsigned int" | 
| +	    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 $" { | 
| -	    pass "ptype t5i<int> -- new with unsigned long" | 
| +	    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 $" { | 
| -            pass "ptype t5i" | 
| +            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 $" { | 
| -	    pass "ptype t5i" | 
| +	    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\\);${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 $" { | 
| -	    pass "ptype t5i" | 
| +	    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 ?&\\);)|(${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 $" { | 
| -	    pass "ptype t5i (obsolescent gcc or gdb)" | 
| +	    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\\(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\\(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 $" { | 
| # This also triggers gdb/1113... | 
| kfail "gdb/1111" "ptype T5<int>" | 
| +	    # Add here a PASS case when PR gdb/1111 gets fixed. | 
| } | 
| } | 
| } | 
| @@ -200,12 +195,32 @@ proc test_template_calls {} { | 
| } | 
|  | 
| proc test_template_typedef {} { | 
| +    global gdb_prompt | 
|  | 
| gdb_test "print intBazOne::baz" ".*baz\\(int, int\\)>" \ | 
| "print method of template typedef" | 
|  | 
| -    gdb_test "print intBazOne::~Baz" ".*~Baz(\\(\\))?>" \ | 
| -	"print destructor of template typedef" | 
| +    set test "print destructor of template typedef" | 
| +    gdb_test_multiple "print intBazOne::~Baz" $test { | 
| +	-re "~Baz(\\(\\))?>\r\n$gdb_prompt $" { | 
| +	    pass $test | 
| +	} | 
| +	-re "There is no field named ~Baz\r\n$gdb_prompt $" { | 
| +	    set test2 "verify GCC PR debug/51668" | 
| +	    gdb_test_multiple "whatis intBazOne" $test2 { | 
| +		-re "type = Baz<int, \\(char\\)'\\\\001'>\r\n$gdb_prompt $" { | 
| +		    setup_xfail gcc/51668 "*-*-*" | 
| +		    xfail $test | 
| +		    pass $test2 | 
| +		} | 
| +		-re "\r\n$gdb_prompt $" { | 
| +		    # Some unexpected response. | 
| +		    fail $test | 
| +		    fail $test2 | 
| +		} | 
| +	    } | 
| +	} | 
| +    } | 
| } | 
|  | 
| proc test_template_args {} { | 
| @@ -219,20 +234,6 @@ proc test_template_args {} { | 
| } | 
|  | 
| proc do_tests {} { | 
| -    global subdir | 
| -    global objdir | 
| -    global srcdir | 
| -    global binfile | 
| -    global gdb_prompt | 
| - | 
| - | 
| -    # Start with a fresh gdb. | 
| - | 
| -    gdb_exit | 
| -    gdb_start | 
| -    gdb_reinitialize_dir $srcdir/$subdir | 
| -    gdb_load $binfile | 
| - | 
| # Change multiple-symbols to "ask" in order to get the multiple-choice | 
| # menu when breaking on overloaded methods. | 
| gdb_test_no_output "set multiple-symbols ask" | 
|  |