# temargs.exp - Template argument tests
#
# Copyright 2010-2013 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 {[skip_cplus_tests]} {
    continue
}

standard_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"
