# GCC Objective-C testsuite that uses the `dg.exp' driver.
#   Copyright (C) 1997, 2001, 2007 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 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# Load support procs.
load_lib objc-dg.exp

# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
    set DEFAULT_CFLAGS "-fgnu-runtime"
}

# Initialize `dg'.
dg-init

#
# gnu-encoding tests
#
set tstobjdir "$tmpdir/objc.dg-struct-layout-encoding-1"
set generator "$tmpdir/objc.dg-struct-layout-encoding-1_generate"

set generator_src "$srcdir/$subdir/struct-layout-encoding-1_generate.c"
set generator_src "$generator_src $srcdir/$subdir/generate-random.c"
set generator_src "$generator_src $srcdir/$subdir/generate-random_r.c"
set generator_cmd "-o $generator $generator_src"
set status [remote_exec host "$HOSTCC $HOSTCFLAGS $generator_cmd"]
set status [lindex $status 0]
if { $status == 0 } then {
    file delete -force $tstobjdir
    file mkdir $tstobjdir
    set generator_args "-s $srcdir/$subdir -d $tstobjdir"
#    set generator_args "$generator_args -n 15000"
    set status [remote_exec host "$generator $generator_args"]
    set status [lindex $status 0]
    if { $status == 0 } then {
        foreach src [lsort [find $tstobjdir *_main.m]] {
            # If we're only testing specific files and this isn't one
            # of them, skip it.
            if ![runtest_file_p $runtests $src] then {
                continue
            }

            dg-runtest $src "" $DEFAULT_CFLAGS
        }
    } else {
        warning "Could not execute objc.dg/gnu-encoding/struct-layout-encoding-1 generator"
    }
} else {
    warning "Could not compile objc.dg/gnu-encoding/struct-layout-encoding-1 generator"
}






# All done.
dg-finish

