# Handlers for additional dg-xxx keywords in tests.

# Copyright (C) 2004, 2005, 2006, 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 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.

proc dg-require-c-std { args } {
    if { ![ check_v3_target_c_std ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-debug-mode { args } {
    if { ![ check_v3_target_debug_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-parallel-mode { args } {
    if { ![ check_v3_target_parallel_mode ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-fileio { args } {
    if { ![ check_v3_target_fileio ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-namedlocale { args } {
    if { ![ check_v3_target_namedlocale ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-sharedlib { args } {
    if { ![ check_v3_target_sharedlib ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-time { args } {
    if { ![ check_v3_target_time ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}

proc dg-require-rvalref { args } {
    if { ![ check_v3_target_rvalref ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	return
    }
    return
}
