@@ -354,13 +354,10 @@ impl<'test> TestCx<'test> {
354354 }
355355 } else {
356356 if proc_res. status . success ( ) {
357- {
358- self . error ( & format ! ( "{} test did not emit an error" , self . config. mode) ) ;
359- if self . config . mode == crate :: common:: TestMode :: Ui {
360- println ! ( "note: by default, ui tests are expected not to compile" ) ;
361- }
362- proc_res. fatal ( None , || ( ) ) ;
363- } ;
357+ let err = & format ! ( "{} test did not emit an error" , self . config. mode) ;
358+ let extra_note = ( self . config . mode == crate :: common:: TestMode :: Ui )
359+ . then_some ( "note: by default, ui tests are expected not to compile" ) ;
360+ self . fatal_proc_rec_general ( err, extra_note, proc_res, || ( ) ) ;
364361 }
365362
366363 if !self . props . dont_check_failure_status {
@@ -606,7 +603,10 @@ impl<'test> TestCx<'test> {
606603 ) ;
607604 } else {
608605 for pattern in missing_patterns {
609- self . error ( & format ! ( "error pattern '{}' not found!" , pattern) ) ;
606+ println ! (
607+ "\n {prefix}: error pattern '{pattern}' not found!" ,
608+ prefix = self . error_prefix( )
609+ ) ;
610610 }
611611 self . fatal_proc_rec ( "multiple error patterns not found" , proc_res) ;
612612 }
@@ -824,10 +824,11 @@ impl<'test> TestCx<'test> {
824824 // - only known line - meh, but suggested
825825 // - others are not worth suggesting
826826 if !unexpected. is_empty ( ) {
827- self . error ( & format ! (
828- "{} diagnostics reported in JSON output but not expected in test file" ,
829- unexpected. len( ) ,
830- ) ) ;
827+ println ! (
828+ "\n {prefix}: {n} diagnostics reported in JSON output but not expected in test file" ,
829+ prefix = self . error_prefix( ) ,
830+ n = unexpected. len( ) ,
831+ ) ;
831832 for error in & unexpected {
832833 print_error ( error) ;
833834 let mut suggestions = Vec :: new ( ) ;
@@ -857,10 +858,11 @@ impl<'test> TestCx<'test> {
857858 }
858859 }
859860 if !not_found. is_empty ( ) {
860- self . error ( & format ! (
861- "{} diagnostics expected in test file but not reported in JSON output" ,
862- not_found. len( )
863- ) ) ;
861+ println ! (
862+ "\n {prefix}: {n} diagnostics expected in test file but not reported in JSON output" ,
863+ prefix = self . error_prefix( ) ,
864+ n = not_found. len( ) ,
865+ ) ;
864866 for error in & not_found {
865867 print_error ( error) ;
866868 let mut suggestions = Vec :: new ( ) ;
@@ -1995,33 +1997,52 @@ impl<'test> TestCx<'test> {
19951997 output_base_name ( self . config , self . testpaths , self . safe_revision ( ) )
19961998 }
19971999
1998- fn error ( & self , err : & str ) {
2000+ /// Prefix to print before error messages. Normally just `error`, but also
2001+ /// includes the revision name for tests that use revisions.
2002+ #[ must_use]
2003+ fn error_prefix ( & self ) -> String {
19992004 match self . revision {
2000- Some ( rev) => println ! ( "\n error in revision `{}`: {}" , rev , err ) ,
2001- None => println ! ( "\n error: {}" , err ) ,
2005+ Some ( rev) => format ! ( "error in revision `{rev}`" ) ,
2006+ None => format ! ( "error" ) ,
20022007 }
20032008 }
20042009
20052010 #[ track_caller]
20062011 fn fatal ( & self , err : & str ) -> ! {
2007- self . error ( err ) ;
2012+ println ! ( " \n {prefix}: {err}" , prefix = self . error_prefix ( ) ) ;
20082013 error ! ( "fatal error, panic: {:?}" , err) ;
20092014 panic ! ( "fatal error" ) ;
20102015 }
20112016
20122017 fn fatal_proc_rec ( & self , err : & str , proc_res : & ProcRes ) -> ! {
2013- self . error ( err) ;
2014- proc_res. fatal ( None , || ( ) ) ;
2018+ self . fatal_proc_rec_general ( err, None , proc_res, || ( ) ) ;
20152019 }
20162020
2017- fn fatal_proc_rec_with_ctx (
2021+ /// Underlying implementation of [`Self::fatal_proc_rec`], providing some
2022+ /// extra capabilities not needed by most callers.
2023+ fn fatal_proc_rec_general (
20182024 & self ,
20192025 err : & str ,
2026+ extra_note : Option < & str > ,
20202027 proc_res : & ProcRes ,
2021- on_failure : impl FnOnce ( Self ) ,
2028+ callback_before_unwind : impl FnOnce ( ) ,
20222029 ) -> ! {
2023- self . error ( err) ;
2024- proc_res. fatal ( None , || on_failure ( * self ) ) ;
2030+ println ! ( "\n {prefix}: {err}" , prefix = self . error_prefix( ) ) ;
2031+
2032+ // Some callers want to print additional notes after the main error message.
2033+ if let Some ( note) = extra_note {
2034+ println ! ( "{note}" ) ;
2035+ }
2036+
2037+ // Print the details and output of the subprocess that caused this test to fail.
2038+ println ! ( "{}" , proc_res. format_info( ) ) ;
2039+
2040+ // Some callers want print more context or show a custom diff before the unwind occurs.
2041+ callback_before_unwind ( ) ;
2042+
2043+ // Use resume_unwind instead of panic!() to prevent a panic message + backtrace from
2044+ // compiletest, which is unnecessary noise.
2045+ std:: panic:: resume_unwind ( Box :: new ( ( ) ) ) ;
20252046 }
20262047
20272048 // codegen tests (using FileCheck)
@@ -2080,7 +2101,7 @@ impl<'test> TestCx<'test> {
20802101 if cfg ! ( target_os = "freebsd" ) { "ISO-8859-1" } else { "UTF-8" }
20812102 }
20822103
2083- fn compare_to_default_rustdoc ( & mut self , out_dir : & Utf8Path ) {
2104+ fn compare_to_default_rustdoc ( & self , out_dir : & Utf8Path ) {
20842105 if !self . config . has_html_tidy {
20852106 return ;
20862107 }
@@ -2957,7 +2978,8 @@ pub struct ProcRes {
29572978}
29582979
29592980impl ProcRes {
2960- pub fn print_info ( & self ) {
2981+ #[ must_use]
2982+ pub fn format_info ( & self ) -> String {
29612983 fn render ( name : & str , contents : & str ) -> String {
29622984 let contents = json:: extract_rendered ( contents) ;
29632985 let contents = contents. trim_end ( ) ;
@@ -2973,24 +2995,13 @@ impl ProcRes {
29732995 }
29742996 }
29752997
2976- println ! (
2998+ format ! (
29772999 "status: {}\n command: {}\n {}\n {}\n " ,
29783000 self . status,
29793001 self . cmdline,
29803002 render( "stdout" , & self . stdout) ,
29813003 render( "stderr" , & self . stderr) ,
2982- ) ;
2983- }
2984-
2985- pub fn fatal ( & self , err : Option < & str > , on_failure : impl FnOnce ( ) ) -> ! {
2986- if let Some ( e) = err {
2987- println ! ( "\n error: {}" , e) ;
2988- }
2989- self . print_info ( ) ;
2990- on_failure ( ) ;
2991- // Use resume_unwind instead of panic!() to prevent a panic message + backtrace from
2992- // compiletest, which is unnecessary noise.
2993- std:: panic:: resume_unwind ( Box :: new ( ( ) ) ) ;
3004+ )
29943005 }
29953006}
29963007
0 commit comments