@@ -50,7 +50,7 @@ pub fn run(input: &str, matches: &getopts::Matches) -> int {
50
50
51
51
52
52
let cm = @CodeMap :: new ( ) ;
53
- let diagnostic_handler = diagnostic:: mk_handler ( ) ;
53
+ let diagnostic_handler = diagnostic:: default_handler ( ) ;
54
54
let span_diagnostic_handler =
55
55
diagnostic:: mk_span_handler ( diagnostic_handler, cm) ;
56
56
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)
115
115
.. ( * session:: basic_options ( ) ) . clone ( )
116
116
} ;
117
117
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) ;
119
142
let span_diagnostic_handler =
120
143
diagnostic:: mk_span_handler ( diagnostic_handler, parsesess. cm ) ;
121
144
@@ -129,6 +152,7 @@ fn runtest(test: &str, cratename: &str, libs: HashSet<Path>, should_fail: bool)
129
152
let cfg = driver:: build_configuration ( sess) ;
130
153
driver:: compile_input ( sess, cfg, & input, & out, & None ) ;
131
154
155
+ // Run the code!
132
156
let exe = outdir. path ( ) . join ( "rust_out" ) ;
133
157
let out = Process :: output ( exe. as_str ( ) . unwrap ( ) , [ ] ) ;
134
158
match out {
0 commit comments