# Expect script for LD cdtest Tests
#   Copyright (C) 1993-2016 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] == 0 } {
    untested $test1
    untested $test2
    return
}

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

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

if ![ld_link $ld tmpdir/cdtest {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
	}
    }
}

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 $ld tmpdir/cdtest 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
	    }
	}
    }
}
