# Copyright 2019-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/>.

standard_testfile .cc

if [get_compiler_info "c++"] {
    unsupported "couldn't find a valid c++ compiler"
    return -1
}

if {[test_compiler_info gcc*] && ![supports_statement_frontiers] } {
    return -1
}

# Compile the test source with USE_NEXT_INLINE_H defined (when
# use_header is true), or not defined.
proc do_test { use_header } {
    global srcfile testfile

    if { $use_header } {
	# This test will not pass due to poor debug information
	# generated by GCC (at least upto 10.x).  See
	# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94474
	return
    }

    set options {c++ debug nowarnings optimize=-O2}
    if { [supports_statement_frontiers] } {
	lappend options additional_flags=-gstatement-frontiers
    }
    if { $use_header } {
	lappend options additional_flags=-DUSE_NEXT_INLINE_H
	set executable "$testfile-with-header"
	set hdrfile "step-and-next-inline.h"
	set prefix "use_header"
    } else {
	set executable "$testfile-no-header"
	set hdrfile "$srcfile"
	set prefix "no_header"
    }

    if { [prepare_for_testing "failed to prepare" $executable \
	      $srcfile $options] } {
	return -1
    }

    with_test_prefix $prefix {

    if ![runto_main] {
	return
    }

    gdb_test "bt" "\\s*\\#0\\s+main.*" "in main"
    gdb_test "step" ".*" "step into get_alias_set"
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 1"

    # It's possible that this first failure (when not using a header
    # file) is GCC's fault, though the remaining failures would best
    # be fixed by adding location views support (though it could be
    # that some easier heuristic could be figured out).  Still, it is
    # not certain that the first failure wouldn't also be fixed by
    # having location view support, so for now it is tagged as such.
    set have_kfail [expr [test_compiler_info gcc*] && !$use_header]

    set ok 1
    gdb_test_multiple "next" "next step 1" {
	-re -wrap "if \\(t->x != i\\)" {
	    set ok 0
	    send_gdb "next\n"
	    exp_continue
	}
	-re -wrap ".*TREE_TYPE.* != 1" {
	    if { $ok } {
		pass $gdb_test_name
	    } else {
		if { $have_kfail } {
		    setup_kfail "*-*-*" symtab/25507
		}
		fail $gdb_test_name
	    }
	}
    }
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 2"

    set ok 1
    gdb_test_multiple "next" "next step 2" {
	-re -wrap "return x;" {
	    set ok 0
	    send_gdb "next\n"
	    exp_continue
	}
	-re -wrap ".*TREE_TYPE.* != 2" {
	    if { $ok } {
		pass $gdb_test_name
	    } else {
		if { $have_kfail } {
		    setup_kfail "*-*-*" symtab/25507
		}
		fail $gdb_test_name
	    }
	}
    }
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 3"

    set ok 1
    gdb_test_multiple "next" "next step 3" {
	-re -wrap "return x;" {
	    set ok 0
	    send_gdb "next\n"
	    exp_continue
	}
	-re -wrap ".*TREE_TYPE.* != 3\\)" {
	    if { $ok } {
		pass $gdb_test_name
	    } else {
		if { $have_kfail } {
		    setup_kfail "*-*-*" symtab/25507
		}
		fail $gdb_test_name
	    }
	}
    }
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 4"

    set ok 1
    gdb_test_multiple "next" "next step 4" {
	-re -wrap "(if \\(t != NULL|\} // get_alias_set)" {
	    send_gdb "next\n"
	    exp_continue
	}
	-re -wrap "return x;" {
	    set ok 0
	    send_gdb "next\n"
	    exp_continue
	}
	-re -wrap "return 0.*" {
	    if { $ok } {
		pass $gdb_test_name
	    } else {
		if { $have_kfail } {
		    setup_kfail "*-*-*" symtab/25507
		}
		fail $gdb_test_name
	    }
	}
    }
    gdb_test "bt" \
	"\\s*\\#0\\s+(main|get_alias_set)\[^\r\]*${srcfile}:.*" \
	"not in inline 5"

    if {!$use_header} {
	# With the debug from GCC 10.x (and earlier) GDB is currently
	# unable to successfully complete the following tests when we
	# are not using a header file.
	kfail symtab/25507 "stepping tests"
	return
    }

    clean_restart ${executable}

    if ![runto_main] {
	return
    }

    gdb_test "bt" "\\s*\\#0\\s+main.*" "in main pass 2"
    gdb_test "step" ".*" "step into get_alias_set pass 2"
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"in get_alias_set pass 2"
    gdb_test "step" ".*TREE_TYPE.*" "step 1"
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 1 pass 2"
    gdb_test "step" ".*if \\(t->x != i\\).*" "step 2"
    gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \
	"in inline 1 pass 2"
    gdb_test "step" ".*TREE_TYPE.*" "step 3"
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 2 pass 2"
    gdb_test "step" ".*if \\(t->x != i\\).*" "step 4"
    gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \
	"in inline 2 pass 2"
    gdb_test "step" ".*TREE_TYPE.*" "step 5"
    gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \
	"not in inline 3 pass 2"
    gdb_test "step" ".*if \\(t->x != i\\).*" "step 6"
    gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \
	"in inline 3 pass 2"
    gdb_test "step" "return 0.*" "step 7"
    gdb_test "bt" \
	"\\s*\\#0\\s+(main|get_alias_set)\[^\r\]*${srcfile}:.*" \
	"not in inline 4 pass 2"
    }
}

do_test 0
do_test 1
