# Expect script for LD cdtest Tests
#   Copyright (C) 1993-2024 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Written by Jeffrey Wheat (cassidy@cygnus.com)
# Rewritten by Ian Lance Taylor (ian@cygnus.com)
#

# Make sure that constructors are handled correctly.

set test1 "cdtest"
set test2 "cdtest with -Ur"

# This test requires running the executable generated by ld.
if ![isnative] {
    return
}

if { [which $CXX_FOR_TARGET] == 0 } {
    untested $test1
    untested $test2
    return
}

if {   ![ld_compile "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET -fno-exceptions" $srcdir/$subdir/cdtest-foo.cc tmpdir/cdtest-foo.o]
    || ![ld_compile "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET -fno-exceptions" $srcdir/$subdir/cdtest-bar.cc tmpdir/cdtest-bar.o]
    || ![ld_compile "$CXX_FOR_TARGET $CXXFLAGS_FOR_TARGET -fno-exceptions" $srcdir/$subdir/cdtest-main.cc tmpdir/cdtest-main.o] } {
    unsupported $test1
    unsupported $test2
    return
}

set expected_output "$srcdir/$subdir/cdtest.dat"

if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o"] {
    fail $test1
} else {
    send_log   "tmpdir/cdtest >tmpdir/cdtest.out\n"
    verbose    "tmpdir/cdtest >tmpdir/cdtest.out"
    catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output

    if ![string match "" $exec_output] then {
	send_log "$exec_output\n"
	verbose "$exec_output" 1

	fail $test1
    } else {
	send_log   "diff tmpdir/cdtest.out $expected_output\n"
	verbose    "diff tmpdir/cdtest.out $expected_output"
	catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
	set exec_output [prune_warnings $exec_output]

	if ![string match "" $exec_output] then {
	    send_log "$exec_output\n"
	    verbose  "$exec_output" 1

	    send_log "Checking against Named Return Value optimization\n"
	    verbose  "Checking against Named Return Value optimization" 1

	    set expected_output "$srcdir/$subdir/cdtest-nrv.dat"

	    send_log   "diff tmpdir/cdtest.out $expected_output\n"
	    verbose    "diff tmpdir/cdtest.out $expected_output"
	    catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
	    set exec_output [prune_warnings $exec_output]
	}

	if [string match "" $exec_output] then {
	    pass $test1
	} else {
	    send_log "$exec_output\n"
	    verbose  "$exec_output" 1

	    fail $test1
	}
    }
}

# PR 46
if [is_pecoff_format] {
    setup_xfail *-*-*
}

if ![ld_relocate $ld tmpdir/cdtest.o {-Ur tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o}] {
    fail $test2
} else {
    if ![ld_link $CC_FOR_TARGET tmpdir/cdtest "$CFLAGS_FOR_TARGET tmpdir/cdtest.o"] {
	fail $test2
    } else {
	send_log   "tmpdir/cdtest >tmpdir/cdtest.out\n"
	verbose    "tmpdir/cdtest >tmpdir/cdtest.out"
	catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output

	if ![string match "" $exec_output] then {
	    send_log "$exec_output\n"
	    verbose  "$exec_output" 1

	    fail $test2
	} else {
	    send_log   "diff tmpdir/cdtest.out $expected_output\n"
	    verbose    "diff tmpdir/cdtest.out $expected_output"
	    catch "exec diff tmpdir/cdtest.out $expected_output" exec_output
	    set exec_output [prune_warnings $exec_output]

	    if [string match "" $exec_output] then {
		pass $test2
	    } else {
		send_log "$exec_output\n"
		verbose  "$exec_output" 1

		fail $test2
	    }
	}
    }
}
