# Copyright (C) 1999 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 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. 

# Please email any bugs, comments, and/or additions to this file to:
# jlarmour@cygnus.co.uk

# This file was written by Jonathan Larmour (jlarmour@cygnus.co.uk).

# G++ testsuite that uses the `dg.exp' driver.

# Load support procs.
load_lib g++-dg.exp

###########
# conpr-1.C
###########

dg-init
dg-runtest "$srcdir/$subdir/conpr-1.C" "-finit-priority" ""
dg-finish


###########
# conpr-2.C
###########

dg-init

set lines [g++_target_compile "$srcdir/$subdir/conpr-2a.C" "conpr-2a.o" object "additional_flags=-finit-priority"]
if ![string match "" $lines] then {
    fail "conpr-2a.o"
} else {
    dg-runtest "$srcdir/$subdir/conpr-2.C" "conpr-2a.o" "-finit-priority" 
    file delete conpr-2a.o
}
dg-finish


###########
# conpr-3.C
###########

dg-init

set lines [g++_target_compile "$srcdir/$subdir/conpr-3a.C" "conpr-3a.o" object "additional_flags=-finit-priority"]
if ![string match "" $lines] then {
    fail "conpr-3a.o"
} else {
    set lines [g++_target_compile "$srcdir/$subdir/conpr-3b.C" "conpr-3b.o" object "additional_flags=-finit-priority"]
    if ![string match "" $lines] then {
        fail "conpr-3b.o"
    } else {
        # run it with objects both ways around!
        dg-runtest "$srcdir/$subdir/conpr-3.C" "conpr-3a.o conpr-3b.o" "-finit-priority"
        dg-runtest "$srcdir/$subdir/conpr-3.C" "conpr-3b.o conpr-3a.o" "-finit-priority"
        file delete conpr-3a.o conpr-3b.o
    }
}
dg-finish


### EOF ecos.exp
