#   Copyright (C) 1997, 2002, 2003 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.  

# GCC testsuite for precompiled header interaction,
# that uses the `dg.exp' driver.

# Load support procs.
load_lib gcc-dg.exp
load_lib dg-pch.exp

# Initialize `dg'.
dg-init

set old_dg_do_what_default "${dg-do-what-default}"

# APPLE LOCAL begin
# Test MACOSX_DEPLOYMENT_TARGET 
# Due to a TCL bug (Radar 5823211), unsetenv() does not work properly.
# The var will be set to empty, not unset, and then the linker complains.
#set macosx_deployment_target_saved 0
#if [info exists env(MACOSX_DEPLOYMENT_TARGET)] {
#    set macosx_deployment_target "$env(MACOSX_DEPLOYMENT_TARGET)"
#    set macosx_deployment_target_saved 1
#}
#setenv MACOSX_DEPLOYMENT_TARGET 10.4
set test "cfstring-1.c"
set f [open $test w]
set v 0
puts $f "#include \"cfstring-1.h\""
puts $f "/* { dg-options \"-I./ -Winvalid-pch -save-temps\" } */"
puts $f "void foo\(\) { x = 0; }"
puts $f ""
close $f
set testh "cfstring-1.hs"
set f [open $testh w]
puts $f "int x;"
puts $f ""
close $f
dg-pch $subdir $test [concat [list {-O0 -g}] $torture_without_loops] ".h"    
# Due to a TCL bug (Radar 5823211), unsetenv() does not work properly.
# The var will be set to empty, not unset, and then the linker complains.
#if { ${macosx_deployment_target_saved} == 1 } {
#    setenv MACOSX_DEPLOYMENT_TARGET "$macosx_deployment_target"
#} else {
#    unsetenv MACOSX_DEPLOYMENT_TARGET
#}
file delete $test
file delete $testh
# APPLE LOCAL end

# Main loop.
foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
    global torture_without_loops

    # We don't try to use the loop-optimizing options, since they are highly
    # unlikely to make any difference to PCH.  However, we do want to
    # add -O0 -g, since users who want PCH usually want debugging and quick
    # compiles.
    dg-pch $subdir $test [concat [list {-O0 -g}] $torture_without_loops] ".h"
}

set test "largefile.c"
set testh "largefile.hs"
set f [open $test w]
set v 0
for { set v 0 } { $v < 10000 } { incr v } {
    puts $f "#define MACRO_${v} \"1234567890\" \"$v\""
}
puts $f "#include \"largefile.h\""
close $f
set f [open $testh w]
close $f
dg-pch $subdir $test [concat [list {-O0 -g}] $torture_without_loops] ".h"    
file delete $test
file delete $testh

set dg-do-what-default "$old_dg_do_what_default"

# All done.
dg-finish
