# temargs.exp - Template argument tests
#
# Copyright 2010, 2011 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 3 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, see <http://www.gnu.org/licenses/>.

# This file is part of the gdb testsuite.

if {$tracelevel} {
    strace $tracelevel
}

if {[skip_cplus_tests]} {
    continue
}

set testfile "temargs"
set srcfile "${testfile}.cc"

if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

if {![runto_main]} {
    return -1
}

# NOTE: prepare_for_testing calls get_compiler_info, which we need
# for the test_compiler_info calls.
# gcc 4.4 and earlier don't emit enough info for some of our template tests.
verbose -log "compiler_info: $compiler_info"
set have_older_template_gcc 0
set have_pr_41736_fixed 1
set have_pr_45024_fixed 1
if {[test_compiler_info {gcc-[0-3]-*}]
    || [test_compiler_info {gcc-4-[0-4]-*}]} {
    set have_older_template_gcc 1
    set have_pr_41736_fixed 0
    set have_pr_45024_fixed 0
} elseif {[test_compiler_info {gcc-4-5-*}]} {
    set have_pr_41736_fixed 0
    set have_pr_45024_fixed 0
}

set line [gdb_get_line_number "Breakpoint 1" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 2.*" \
    "set first breakpoint for temargs"

set line [gdb_get_line_number "Breakpoint 2" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 3.*" \
    "set second breakpoint for temargs"

set line [gdb_get_line_number "Breakpoint 3" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 4.*" \
    "set third breakpoint for temargs"

set line [gdb_get_line_number "Breakpoint 4" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 5.*" \
    "set fourth breakpoint for temargs"

set line [gdb_get_line_number "Breakpoint 5" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 6.*" \
    "set fifth breakpoint for temargs"

set line [gdb_get_line_number "Breakpoint 6" $srcfile]
gdb_test "break $srcfile:$line" "Breakpoint 7.*" \
    "set sixth breakpoint for temargs"

#
# Tests in Base::base_m.
#

gdb_continue_to_breakpoint "continue to first breakpoint for temargs"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "ptype T" "double" "test type of T in base_m"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print I" " = 23" "test value of I in base_m"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print P == &a_global" " = true" "test value of P in base_m"

if {!$have_pr_41736_fixed} { setup_xfail *-*-* }
gdb_test "print MP" "&S::f" "test value of MP in base_m"

#
# Tests in Inner::inner_m.
#

gdb_continue_to_breakpoint "continue to second breakpoint for temargs"


if {!$have_pr_45024_fixed} { setup_xfail *-*-* }
gdb_test "ptype T" "long" "test type of T in inner_m"

if {!$have_pr_45024_fixed} { setup_xfail *-*-* }
gdb_test "print I" " = 47" "test value of I in inner_m"

if $have_older_template_gcc { setup_xfail "*-*-*"
} elseif {[test_compiler_info {gcc-[0-3]-*}]
	 || [test_compiler_info {gcc-4-[0-5]-*}]} {
  # gcc-4.5.x still does not emit inner DW_TAG_structure_type.
  setup_xfail "*-*-*"
}
gdb_test "print P == &a_global" " = true" "test value of P in inner_m"

if {!$have_pr_41736_fixed} { setup_xfail *-*-* }
gdb_test "print MP" "&S::f" "test value of MP in inner_m"

if $have_older_template_gcc { setup_xfail "*-*-*"
} elseif {[test_compiler_info {gcc-[0-3]-*}]
	 || [test_compiler_info {gcc-4-[0-5]-*}]} {
  # gcc-4.5.x still does not emit outer DW_TAG_structure_type.
  setup_xfail "*-*-*"
}
gdb_test "whatis Z" "float" "test type of Z in inner_m"

#
# Tests in func.
#

gdb_continue_to_breakpoint "continue to third breakpoint for temargs"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "ptype T" "unsigned char" "test type of T in func"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print I" " = 91" "test value of I in func"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print P == &a_global" " = true" "test value of P in func"

if {!$have_pr_41736_fixed} { setup_xfail *-*-* }
gdb_test "print MP" "&S::f" "test value of MP in func"

#
# Tests in Base::templ_m.
#

gdb_continue_to_breakpoint "continue to fourth breakpoint for temargs"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "ptype T" "double" "test type of T in templ_m"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print I" " = 23" "test value of I in templ_m"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "print P == &a_global" " = true" "test value of P in templ_m"

if {!$have_pr_41736_fixed} { setup_xfail *-*-* }
gdb_test "print MP" "&S::f" "test value of MP in templ_m"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "whatis Q" "short" "test type of Q in templ_m"

#
# Tests in K2::k2_m.
#

gdb_continue_to_breakpoint "continue to fifth breakpoint for temargs"

if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "ptype F" "type = void \\\(S::\\\*\\\)\\\(S \\\* const\\\)" \
    "test type of F in k2_m"

setup_xfail gcc/49366 "*-*-*"
gdb_test "print F" "&S::somefunc" "test value of F in k2_m"

#
# Tests in K3::k3_m, GCC PR debug/49546.
# The problem reproduces with DW_AT_MIPS_linkage_name.  It does not happen with
# GDB physname - GDB's own computation of the linkage name based on
# (incorrectly output by GCC) DW_AT_name.
#

gdb_continue_to_breakpoint "continue to sixth breakpoint for temargs"

if $have_older_template_gcc { setup_xfail "*-*-*"
} else { setup_xfail gcc/49546 "*-*-*" }
gdb_test "ptype F" {type = void \(\*\)\(int\)} "test type of F in k3_m"

if $have_older_template_gcc { setup_xfail "*-*-*"
} else { setup_xfail gcc/49546 "*-*-*" }
gdb_test "print F" { = \(void \(\*\)\(int\)\) 0x[0-9a-f]+ <S3::m\(int\)>} \
	 "test value of F in k3_m"
