# Expect script for LD cdtest Tests
#   Copyright 1993, 1994, 1995, 1997, 2001, 2004, 2005, 2007
#   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
	    }
	}
    }
}
