# Expect script for LD cdtest Tests
#   Copyright 1993, 1994, 1995, 1997, 2001 Free Software Foundation, Inc.
#
# This file 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
	    }
	}
    }
}
