@@ -50,7 +50,7 @@ pub fn run(input: &str, matches: &getopts::Matches) -> int {
5050
5151
5252 let cm = @CodeMap :: new ( ) ;
53- let diagnostic_handler = diagnostic:: mk_handler ( ) ;
53+ let diagnostic_handler = diagnostic:: default_handler ( ) ;
5454 let span_diagnostic_handler =
5555 diagnostic:: mk_span_handler ( diagnostic_handler, cm) ;
5656 let parsesess = parse:: new_parse_sess_special_handler ( span_diagnostic_handler,
@@ -115,7 +115,30 @@ fn runtest(test: &str, cratename: &str, libs: HashSet<Path>, should_fail: bool)
115115 .. ( * session:: basic_options ( ) ) . clone ( )
116116 } ;
117117
118- let diagnostic_handler = diagnostic:: mk_handler ( ) ;
118+ // Shuffle around a few input and output handles here. We're going to pass
119+ // an explicit handle into rustc to collect output messages, but we also
120+ // want to catch the error message that rustc prints when it fails.
121+ //
122+ // We take our task-local stderr (likely set by the test runner), and move
123+ // it into another task. This helper task then acts as a sink for both the
124+ // stderr of this task and stderr of rustc itself, copying all the info onto
125+ // the stderr channel we originally started with.
126+ //
127+ // The basic idea is to not use a default_handler() for rustc, and then also
128+ // not print things by default to the actual stderr.
129+ let ( p, c) = Chan :: new ( ) ;
130+ let w1 = io:: ChanWriter :: new ( c) ;
131+ let w2 = w1. clone ( ) ;
132+ let old = io:: stdio:: set_stderr ( ~w1) ;
133+ spawn ( proc ( ) {
134+ let mut p = io:: PortReader :: new ( p) ;
135+ let mut err = old. unwrap_or ( ~io:: stderr ( ) as ~Writer ) ;
136+ io:: util:: copy ( & mut p, & mut err) . unwrap ( ) ;
137+ } ) ;
138+ let emitter = diagnostic:: EmitterWriter :: new ( ~w2) ;
139+
140+ // Compile the code
141+ let diagnostic_handler = diagnostic:: mk_handler ( ~emitter) ;
119142 let span_diagnostic_handler =
120143 diagnostic:: mk_span_handler ( diagnostic_handler, parsesess. cm ) ;
121144
@@ -129,6 +152,7 @@ fn runtest(test: &str, cratename: &str, libs: HashSet<Path>, should_fail: bool)
129152 let cfg = driver:: build_configuration ( sess) ;
130153 driver:: compile_input ( sess, cfg, & input, & out, & None ) ;
131154
155+ // Run the code!
132156 let exe = outdir. path ( ) . join ( "rust_out" ) ;
133157 let out = Process :: output ( exe. as_str ( ) . unwrap ( ) , [ ] ) ;
134158 match out {
0 commit comments