#   Copyright (C) 1997, 2000, 2001 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

# Don't run this directory with any default CFLAGS, but run tests with
# and without -DWIDE.

if [info exists TORTURE_OPTIONS] {
    set old_TORTURE_OPTIONS $TORTURE_OPTIONS
} elseif [info exists old_TORTURE_OPTIONS] {
    unset old_TORTURE_OPTIONS
}
if [info exists torture_with_loops] {
    set old_torture_with_loops $torture_with_loops
} elseif [info exists old_torture_with_loops] {
    unset old_torture_with_loops
}
if [info exists torture_without_loops] {
    set old_torture_without_loops $torture_without_loops
} elseif [info exists old_torture_without_loops] {
    unset old_torture_without_loops
}
set TORTURE_OPTIONS [list { } { -DWIDE } ]
set torture_with_loops [list { } { -DWIDE } ]
set torture_without_loops [list { } { -DWIDE } ]

# Need to copy the format.h header.
if [is_remote host] {
    remote_download host $srcdir/$subdir/format.h
}

load_lib gcc-dg.exp

dg-init
gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] ""
if [info exists old_TORTURE_OPTIONS] {
    set TORTURE_OPTIONS $old_TORTURE_OPTIONS
} else {
    unset TORTURE_OPTIONS
}
if [info exists old_torture_with_loops] {
    set torture_with_loops $old_torture_with_loops
} else {
    unset torture_with_loops
}
if [info exists old_torture_without_loops] {
    set torture_without_loops $old_torture_without_loops
} else {
    unset torture_without_loops
}
dg-finish
