--- gcc/testsuite/lib/gcc-dg.exp.jj	2012-12-05 20:02:20.000000000 +0100
+++ gcc/testsuite/lib/gcc-dg.exp	2012-12-05 23:23:05.766914151 +0100
@@ -257,14 +257,16 @@ if { [info procs ${tool}_load] != [list]
 	global set_target_env_var
 
 	set saved_target_env_var [list]
-	if { [llength $set_target_env_var] != 0 } {
+	if { [info exists set_target_env_var] \
+	     && [llength $set_target_env_var] != 0 } {
 	    if { [is_remote target] } {
 		return [list "unsupported" ""]
 	    }
 	    set-target-env-var
 	}
 	set result [eval [list saved_${tool}_load $program] $args]
-	if { [llength $set_target_env_var] != 0 } {
+	if { [info exists set_target_env_var] \
+	     && [llength $set_target_env_var] != 0 } {
 	    restore-target-env-var
 	}
 	if { $shouldfail != 0 } {
@@ -281,7 +283,7 @@ if { [info procs ${tool}_load] != [list]
 proc dg-set-target-env-var { args } {
     global set_target_env_var
     if { [llength $args] != 3 } {
-	error "[lindex $args 1]: need two arguments"
+	error "dg-set-target-env-var: need two arguments"
 	return
     }
     lappend set_target_env_var [list [lindex $args 1] [lindex $args 2]]
@@ -294,7 +296,9 @@ proc set-target-env-var { } {
 	set var [lindex $env_var 0]
 	set value [lindex $env_var 1]
 	if [info exists env($var)] {
-	    lappend saved_target_env_var [list $var $env($var)]
+	    lappend saved_target_env_var [list $var 1 $env($var)]
+	} else {
+	    lappend saved_target_env_var [list $var 0]
 	}
 	setenv $var $value
     }
@@ -302,10 +306,13 @@ proc set-target-env-var { } {
 
 proc restore-target-env-var { } {
     upvar 1 saved_target_env_var saved_target_env_var
-    foreach env_var $saved_target_env_var {
+    foreach env_var [lreverse $saved_target_env_var] {
 	set var [lindex $env_var 0]
-	set value [lindex $env_var 1]
-	unsetenv $var $value
+	if [lindex $env_var 1] {
+	    setenv $var [lindex $env_var 2]
+	} else {
+	    unsetenv $var
+	}
     }
 }
 
@@ -330,10 +337,6 @@ proc search_for { file pattern } {
 # as c-torture does.
 proc gcc-dg-runtest { testcases default-extra-flags } {
     global runtests
-    global set_target_env_var
-
-    # Init set_target_env_var
-    set set_target_env_var [list]
 
     # Some callers set torture options themselves; don't override those.
     set existing_torture_options [torture-options-exist]
@@ -724,6 +727,7 @@ if { [info procs saved-dg-test] == [list
 	global compiler_conditional_xfail_data
 	global shouldfail
 	global testname_with_flags
+	global set_target_env_var
 
 	if { [ catch { eval saved-dg-test $args } errmsg ] } {
 	    set saved_info $errorInfo
@@ -744,6 +748,9 @@ if { [info procs saved-dg-test] == [list
 	set additional_sources ""
 	set additional_prunes ""
 	set shouldfail 0
+	if [info exists set_target_env_var] {
+	    unset set_target_env_var
+	}
 	unset_timeout_vars
 	if [info exists compiler_conditional_xfail_data] {
 	    unset compiler_conditional_xfail_data
