# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2002
# Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Fred Fish. (fnf@cygnus.com)

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}

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info ${binfile} "c++"] {
    return -1
}
source ${binfile}.ci

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

#
#  Test printing of the types of templates.
#

proc test_ptype_of_templates {} {
    global gdb_prompt
    global ws

    send_gdb "ptype T5<int>\n"
    gdb_expect {
	-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>"
	}
	-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" }
	-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" }
	-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)"
	}
	-re ".*$gdb_prompt $" {
	    fail "ptype T5<int>"
	}
	timeout {
	    fail "ptype T5<int> (timeout)"
	}
    }

    send_gdb "ptype t5i\n"
    gdb_expect {
        -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" }
        -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" }
        -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" }
        -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"
        }
	-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"
	}
	-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)"
	}
	-re ".*$gdb_prompt $" {
	    fail "ptype t5i"
	}
	timeout {
	    fail "ptype t5i (timeout)"
	}
    }
}

#
#  Test breakpoint setting on template methods.
#

proc test_template_breakpoints {} {
    global gdb_prompt
    global testfile
    global srcdir
    global hp_aCC_compiler

    send_gdb "break T5<int>::T5\n"
    gdb_expect {
	-re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. T5<int>::T5\\(int\\) at .*\[\r\n\]*.3. T5<int>::T5\\((T5<int> const|const T5<int>) ?&\\) at .*\[\r\n\]*> $" {
	    gdb_test "0" \
		"canceled" \
		"constructor breakpoint (obsolete format!)"
	}
	-re ".0. cancel\[\r\n\]*.1. all\[\r\n\]*.2. T5<int>::T5\\((T5<int> const|const T5<int>) ?&\\) at .*templates.cc:.*\[\r\n\]*.3. T5<int>::T5\\(int\\) at .*templates.cc:.*\[\r\n\]*> $" {
	    gdb_test "0" \
		"canceled" \
		"constructor breakpoint"
	}
        -re ".*\n> $" {
	    gdb_test "0" \
		    "nonsense intended to insure that this test fails" \
		    "constructor breakpoint (bad menu choices)"
	}
	-re ".*$gdb_prompt $" { fail "constructor breakpoint" }
	default { fail "constructor breakpoint (timeout)" }
    }
    
# See CLLbs14792
    if {$hp_aCC_compiler} {setup_xfail hppa*-*-* CLLbs14792}
    gdb_test "break T5<int>::~T5" \
	"Breakpoint.*at.* file .*${testfile}.cc, line.*" \
	"destructor breakpoint"    
    
    gdb_test "break T5<int>::value" \
	"Breakpoint.*at.* file .*${testfile}.cc, line.*" \
	"value method breakpoint"

    delete_breakpoints
}

#
#  Test calling of template methods.
#

proc test_template_calls {} {
    global gdb_prompt
    global hp_aCC_compiler

    if [target_info exists gdb,cannot_call_functions] {
	setup_xfail "*-*-*" 2416
	fail "This target can not call functions"
	return
    }

    if {!$hp_aCC_compiler} {setup_xfail hppa*-*-*}
    send_gdb "print t5i.value()\n"
    gdb_expect {
	-re ".* = 2\[\r\n\]*$gdb_prompt $" { pass "print t5i.value()" }
	-re "Cannot invoke functions on this machine.*$gdb_prompt $" {
	    fail "print t5i.value()"
	}
        -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" {
	    setup_xfail hppa*-*-* CLLbs16899
            xfail "print t5i.value"
	}
	-re ".*$gdb_prompt $" { fail "print t5i.value()" }
	timeout { fail "print t5i.value() (timeout)" }
    }
}


proc do_tests {} {
    global prms_id
    global bug_id
    global subdir
    global objdir
    global srcdir
    global binfile
    global gdb_prompt
    global supports_template_debugging

    set prms_id 0
    set bug_id 0

    # Start with a fresh gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile

    if { !$supports_template_debugging } {
	warning "compiler lacks debugging info for templates; tests suppressed." 0
	return
    }

    # Get the debug format for the compiled test case.  If that
    # format is DWARF 1 then just skip all the tests since none of
    # them will pass.

    if [ runto_main] then {
	get_debug_format
	if [ setup_xfail_format "DWARF 1" ] then {
	    fail "C++ tests skipped due to limited C++ support in DWARF 1 debug format"
	    return
	}
	clear_xfail "*-*-*"
    }

    test_ptype_of_templates
    test_template_breakpoints

    if [ runto_main] {
	test_template_calls
    }
}

do_tests


# More tests for different kinds of template parameters,
# templates with partial specializations, nested templates, etc.
# These have been tested only with HP aCC.  They probably won't
# work with other compilers because of differences in mangling
# schemes. 
# Added by Satish Pai <pai@apollo.hp.com> 1997-09-25 
# As of 2000-06-03, C++ support has been improved to the point that g++ can
# pass all of theses, excluding what appears to be one that exposes a stabs bug. - djb

# I don't know how HP could be passing these tests without this. They
# weren't breakpointing past a point where the below expressions were
# initialized in the actual source. - djb

send_gdb "b 770\n"
gdb_expect {
		-re ".*$gdb_prompt $"
}
send_gdb "c\n"
gdb_expect {
		-re ".*$gdb_prompt $"
}
send_gdb "print fint\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{x = 0, t = 0\\}\r\n$gdb_prompt $" { pass "print fint" }
   -re "$gdb_prompt $"                     { fail "print fint" }
   timeout                             { fail "(timeout) print fint" }
}

send_gdb "print fvpchar\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{x = 0, t = 0x0\\}\r\n$gdb_prompt $" { pass "print fvpchar" }
   -re "$gdb_prompt $"                     { fail "print fvpchar" }
   timeout                             { fail "(timeout) print fvpchar" }
}

# Template Foo<T>

setup_xfail hppa64-*-* CLLbs16092
# g++ can't do the template instantiation in debug info trick, so we
# fail this because it's not a real type.
if {!$hp_aCC_compiler} { setup_xfail *-*-* }
send_gdb "ptype Foo\n"   
gdb_expect {   
   -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Foo<volatile char \\*>\r\n\[ \t\]*(class |)Foo<char>\r\n\[ \t\]*(class |)Foo<int>\r\n$gdb_prompt $" { pass "ptype Foo" }
   -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Foo" }
   -re "$gdb_prompt $"                     { fail "ptype Foo" }
   timeout                             { fail "(timeout) ptype Foo" }
}

# ptype Foo<int>

send_gdb "ptype fint\n"   
gdb_expect {   
   -re "type = (class |)Foo<int> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int foo\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fint" }
   -re "$gdb_prompt $"                     { fail "ptype fint" }
   timeout                             { fail "(timeout) ptype fint" }
}

# ptype Foo<char>

send_gdb "ptype fchar\n"   
gdb_expect {   
   -re "type = (class |)Foo<char> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char foo\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fchar" }
   -re "$gdb_prompt $"                     { fail "ptype fchar" }
   timeout                             { fail "(timeout) ptype fchar" }
}

# ptype Foo<volatile char *>

send_gdb "ptype fvpchar\n"   
gdb_expect {   
   -re "type = (class |)Foo<volatile char ?\\*> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*char.*\\*t;\r\n\r\n\[ \t\]*.*char \\* foo\\(int,.*char.*\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fvpchar" }
   -re "$gdb_prompt $"                     { fail "ptype fvpchar" }
   timeout                             { fail "(timeout) ptype fvpchar" }
}

# print a function from Foo<volatile char *>

send_gdb "print Foo<volatile char *>::foo\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo<volatile char \\*> \\*, int, .*char \\*\\)\\} $hex <Foo<.*char.*\\*>::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo<volatile char *>::foo" }
   -re "$gdb_prompt $"                     { fail "print Foo<volatile char *>::foo" }
   timeout                             { fail "(timeout) print Foo<volatile char *>::foo" }
}

# Template Bar<T, int>

setup_xfail hppa64-*-* CLLbs16092
# same as Foo for g++
if {!$hp_aCC_compiler} { setup_xfail *-*-* }
send_gdb "ptype Bar\n"   
gdb_expect {   
   -re "type = template <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Bar<int,(\\(int\\)|)1>\r\n\[ \t\]*(class |)Bar<int,(\\(int\\)|)33>\r\n$gdb_prompt $" { pass "ptype Bar" }
   -re "type = <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Bar" }
   -re "$gdb_prompt $"                     { fail "ptype Bar" }
   timeout                             { fail "(timeout) ptype Bar" }
}


# ptype Bar<int,33>

send_gdb "ptype bint\n"   
gdb_expect {   
   -re "type = (class |)Bar<int,(\\(int\\)|)33> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint" }
   -re "$gdb_prompt $"                     { fail "ptype bint" }
   timeout                             { fail "(timeout) ptype bint" }
}

# ptype Bar<int, (4>3)>

send_gdb "ptype bint2\n"   
gdb_expect {   
   -re "type = (class |)Bar<int,(\\(int\\)|)1> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint2" }
   -re "$gdb_prompt $"                     { fail "ptype bint2" }
   timeout                             { fail "(timeout) ptype bint2" }
}

# Template Baz<T, char>

setup_xfail hppa64-*-* CLLbs16092
# Same as Foo, for g++
if {!$hp_aCC_compiler} { setup_xfail *-*-* }
send_gdb "ptype Baz\n"   
gdb_expect {   
   -re "type = template <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Baz<char,(\\(char\\)|)97>\r\n\[ \t\]*(class |)Baz<int,(\\(char\\)|)115>\r\n$gdb_prompt $" { pass "ptype Baz" }
   -re "type = <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Baz" }
   -re "$gdb_prompt $"                     { fail "ptype Baz" }
   timeout                             { fail "(timeout) ptype Baz" }
}


# ptype Baz<int, 's'>

send_gdb "ptype bazint\n"   
gdb_expect {   
   -re "type = (class |)Baz<int,(\\(char\\)|)(115|\\'s\\')> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int baz\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint" }
   -re "$gdb_prompt $"                     { fail "ptype bazint" }
   timeout                             { fail "(timeout) ptype bazint" }
}

# ptype Baz<char, 'a'>

send_gdb "ptype bazint2\n"   
gdb_expect {   
   -re "type = (class |)Baz<char,(\\(char\\)|)(97|\\'a\\')> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char baz\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint2" }
   -re "$gdb_prompt $"                     { fail "ptype bazint2" }
   timeout                             { fail "(timeout) ptype bazint2" }
}

# Template Qux<T, int (*f)(int) >
# Same as Foo for g++
if {!$hp_aCC_compiler} {setup_xfail *-*-*}
send_gdb "ptype Qux\n"   
gdb_expect {   
   -re "type = template <(class |)T, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Qux<int,&string>\r\n\[ \t\]*(class |)Qux<char,&string>\r\n$gdb_prompt $" { pass "ptype Qux" }
   -re ".*type = template <(class |)T.*, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}.*$gdb_prompt $" { pass "ptype Qux" }
   -re "$gdb_prompt $"                     { fail "ptype Qux" }
   timeout                             { fail "(timeout) ptype Qux" }
}

# pt Qux<int,&string>

send_gdb "ptype quxint\n"   
gdb_expect {   
   -re "type = class Qux<int,&string> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int qux\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" }
   -re "$gdb_prompt $"                     { fail "ptype quxint" }
   timeout                             { fail "(timeout) ptype quxint" }
}

# pt Qux<char,0>

# commented out this as quxint2 declaration was commented out in
# templates.exp -- ovidiu
# send_gdb "ptype quxint2\n"   
# gdb_expect {   
#    -re "type = class Qux<char,&string> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*char qux\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint2" }
#    -re "$gdb_prompt $"                     { fail "ptype quxint2" }
#    timeout                             { fail "(timeout) ptype quxint2" }
# }

# Template Spec<T1, T2>

setup_xfail hppa64-*-* CLLbs16092
# Same as Foo for g++
if {!$hp_aCC_compiler} { setup_xfail *-*-* }
send_gdb "ptype Spec\n"   
gdb_expect {   
   -re "type = template <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Spec<int,int \\*>\r\n\[ \t\]*(class |)Spec<int,char>\r\n$gdb_prompt $" { pass "ptype Spec" }
   -re "type = <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Spec" }
   -re "$gdb_prompt $"                     { fail "ptype Spec" }
   timeout                             { fail "(timeout) ptype Spec" }
}

# pt Spec<char,0>

send_gdb "ptype siip\n"   
gdb_expect {   
   -re "type = class Spec<int,int ?\\*> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*.*int spec\\(int ?\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype siip" }
   -re "$gdb_prompt $"                     { fail "ptype siip" }
   timeout                             { fail "(timeout) ptype siip" }
}

# pt Garply<int>

send_gdb "ptype Garply<int>\n"   
gdb_expect {   
   -re "type = class Garply<int> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int garply\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply<int>" }
   -re "$gdb_prompt $"                     { fail "ptype Garply<int>" }
   timeout                             { fail "(timeout) ptype Garply<int>" }
}

# ptype of nested template name

send_gdb "ptype Garply<Garply<char> >\n"   
gdb_expect {   
   -re "type = (class |)Garply<Garply<char> > \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*(class |)Garply<char> t;\r\n\r\n\[ \t\]*.*(class |)Garply<char> garply\\(int, (class |)Garply<char>\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply<Garply<char> >" }
   -re "$gdb_prompt $"                     { fail "ptype Garply<Garply<char> >" }
   timeout                             { fail "(timeout) ptype Garply<Garply<char> >" }
}

# print out a function from a nested template name

send_gdb "print Garply<Garply<char> >::garply\n"
gdb_expect {
   -re "\\$\[0-9\]* = \\{(class |)Garply<char> \\((class |)Garply<Garply<char> > \\*, int, (class |)Garply<char>\\)\\} $hex <Garply<Garply<char>\[ \t\]*>::garply\\(int, (class |)Garply<char>\\)>\r\n$gdb_prompt $" { pass "print Garply<Garply<char> >::garply" }
   -re ".*$gdb_prompt $" { fail "print Garply<Garply<char> >::garply" }
   timeout { fail "print Garply<Garply<char> >::garply (timeout)" }
}

# djb - 06-03-2000
# Now should work fine
send_gdb "break Garply<Garply<char> >::garply\n"
gdb_expect {
   -re "Breakpoint \[0-9\]* at $hex: file .*templates.cc, line.*\r\n$gdb_prompt $" { pass "break Garply<Garply<char> >::garply" }
   -re ".*$gdb_prompt $" { fail "break Garply<Garply<char> >::garply" }
   timeout { fail "break Garply<Garply<char> >::garply (timeout)" }
}
