#   Copyright (C) 1997-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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# Define g++ callbacks for dg.exp.

load_lib gcc-dg.exp

proc g++-dg-test { prog do_what extra_tool_flags } {
    return [gcc-dg-test-1 g++_target_compile $prog $do_what $extra_tool_flags]
}


proc g++-dg-prune { system text } {
    return [gcc-dg-prune $system $text]
}

# Modified dg-runtest that runs tests in both C++98 and C++11 modes
# unless they specifically specify one or the other.
proc g++-dg-runtest { testcases flags default-extra-flags } {
    global runtests

    foreach test $testcases {
	# If we're only testing specific files and this isn't one of them, skip it.
	if ![runtest_file_p $runtests $test] {
	    continue
	}

	# If the testcase specifies a standard, use that one.
	# If not, run it under both standards, allowing GNU extensions
	# if there's a dg-options line.
	if ![search_for $test "-std=*++"] {
	    if [search_for $test "dg-options"] {
		set std_prefix "-std=gnu++"
	    } else {
		set std_prefix "-std=c++"
	    }

	    global gpp_std_list
	    if { [llength $gpp_std_list] > 0 } {
		set std_list $gpp_std_list
	    } else {
		set std_list { 98 14 17 2a }
	    }
	    set option_list { }
	    foreach x $std_list {
		# Handle "concepts" as C++17 plus Concepts TS.
		if { $x eq "concepts" } then { set x "17 -fconcepts" }
		lappend option_list "${std_prefix}$x"
	    }
	} else {
	    set option_list { "" }
	}

	set nshort [file tail [file dirname $test]]/[file tail $test]

	foreach flags_t $option_list {
	    verbose "Testing $nshort, $flags $flags_t" 1
	    dg-test $test "$flags $flags_t" ${default-extra-flags}
	}
    }
}
