diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 33b9873cfe138267bf9930a32084fa4531c333b5..1c25f7873666bb07358cba455b4ab8fba575fa63 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,8 @@
 2005-03-23  Mark Mitchell  <mark@codesourcery.com>
 
+	* testsuite/libstdc++-dg/normal.exp: Read testsuite_files, if it
+	exists.
+
 	* testsuite/lib/libstdc++.exp (libstdc++_wchar_t): Rename to ...
 	(v3-wchar_t): ... this.
 	(libstdc++_threads): Rename to ...
diff --git a/libstdc++-v3/testsuite/libstdc++-dg/normal.exp b/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
index 29b16f2a8939af9ba34b5b4e1dce9f9953a20d40..746c7a8ec3f11dc1a9fd99cc3f38757ec32d09ed 100644
--- a/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
+++ b/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
@@ -24,36 +24,62 @@ dg-init
 # Build the support objects.
 v3-build_support
 
-# Find directories that might have tests.
-set subdirs [glob "$srcdir/\[0-9\]\[0-9\]*"]
-foreach d [glob "$srcdir/\[a-z\]*"] {
-    if {[file isdirectory $d]} { 
-	lappend subdirs $d
-    }
-}
-
-# Find all the tests.
 set tests [list]
-foreach s $subdirs {
-    set subdir_tests [find $s *.cc]
-    # Filter out tests that should not be run.
-    foreach t $subdir_tests {
-	# The DejaGNU "find" procedure sometimes returns a list 
-	# containing an empty string, when it should realy return
-	# an empty list.
-	if { $t == "" } {
-	    continue
+
+# If there is a "testsuite_files" file, use it.
+#
+# This is a workaround for problems reported with using:
+#
+#   runtest normal.exp="`cat testsuite_files`"
+#
+# See:
+#  http://gcc.gnu.org/ml/libstdc++/2005-03/msg00278.html
+# for discussion of the problem.
+#
+# If that worked consistently, we could modify "make check" to
+# pass that option, and then remove this code.
+if {[info exists blddir]} {
+    set tests_file "${blddir}/testsuite/testsuite_files"
+}
+if {[info exists tests_file] && [file exists $tests_file]} {
+    set f [open $tests_file]
+    while { ! [eof $f] } {
+	set t [gets $f]
+	if { [string length "$t"] != 0 } {
+	    lappend tests ${srcdir}/${t}
 	}
-	# Filter out:
-	# 1. interactive tests.
-	# 2. performance tests.
-	# 3. wchar_t tests, if not supported.
-	# 4. thread tests, if not supported. 
-	if { [string first _xin $t] == -1
-	     && [string first performance $t] == -1
-	     && (${v3-wchar_t} || [string first wchar_t $t] == -1) 
-             && (${v3-threads} || [string first thread $t] == -1) } {
-	    lappend tests $t
+    } 
+    close $f
+} else {
+    # Find directories that might have tests.
+    set subdirs [glob "$srcdir/\[0-9\]\[0-9\]*"]
+    foreach d [glob "$srcdir/\[a-z\]*"] {
+	if {[file isdirectory $d]} { 
+	    lappend subdirs $d
+	}
+    }
+    # Find all the tests.
+    foreach s $subdirs {
+	set subdir_tests [find $s *.cc]
+	# Filter out tests that should not be run.
+	foreach t $subdir_tests {
+	    # The DejaGNU "find" procedure sometimes returns a list 
+	    # containing an empty string, when it should really return
+	    # an empty list.
+	    if { $t == "" } {
+		continue
+	    }
+	    # Filter out:
+	    # 1. interactive tests.
+	    # 2. performance tests.
+	    # 3. wchar_t tests, if not supported.
+	    # 4. thread tests, if not supported. 
+	    if { [string first _xin $t] == -1
+		 && [string first performance $t] == -1
+		 && (${v3-wchar_t} || [string first wchar_t $t] == -1) 
+		 && (${v3-threads} || [string first thread $t] == -1) } {
+		lappend tests $t
+	    }
 	}
     }
 }