# temargs.exp - Template argument tests
#
# Copyright 2010-2021 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 "failed to prepare" $testfile $srcfile \
	 {debug c++ additional_flags=-std=c++11}]} {
    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.
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"

# PR symtab/16842 - gdb used to crash here.
if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "info addr I" "Symbol \"I\" is constant." "test address 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"

# PR symtab/16842 - gdb used to crash here.
if $have_older_template_gcc { setup_xfail "*-*-*" }
gdb_test "info addr I" "Symbol \"I\" is constant." "test address 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"
