@@ -23,7 +23,7 @@ use crate::common::{
2323 output_base_dir, output_base_name, output_testname_unique,
2424} ;
2525use crate :: compute_diff:: { DiffLine , make_diff, write_diff, write_filtered_diff} ;
26- use crate :: errors:: { Error , ErrorKind } ;
26+ use crate :: errors:: { Error , ErrorKind , load_errors } ;
2727use crate :: header:: TestProps ;
2828use crate :: read2:: { Truncated , read2_abbreviated} ;
2929use crate :: util:: { Utf8PathBufExt , add_dylib_path, logv, static_regex} ;
@@ -577,23 +577,9 @@ impl<'test> TestCx<'test> {
577577 }
578578 }
579579
580- fn check_all_error_patterns (
581- & self ,
582- output_to_check : & str ,
583- proc_res : & ProcRes ,
584- pm : Option < PassMode > ,
585- ) {
586- if self . props . error_patterns . is_empty ( ) && self . props . regex_error_patterns . is_empty ( ) {
587- if pm. is_some ( ) {
588- // FIXME(#65865)
589- return ;
590- } else {
591- self . fatal ( & format ! ( "no error pattern specified in {}" , self . testpaths. file) ) ;
592- }
593- }
594-
580+ /// Check `error-pattern` and `regex-error-pattern` directives.
581+ fn check_all_error_patterns ( & self , output_to_check : & str , proc_res : & ProcRes ) {
595582 let mut missing_patterns: Vec < String > = Vec :: new ( ) ;
596-
597583 self . check_error_patterns ( output_to_check, & mut missing_patterns) ;
598584 self . check_regex_error_patterns ( output_to_check, proc_res, & mut missing_patterns) ;
599585
@@ -670,7 +656,9 @@ impl<'test> TestCx<'test> {
670656 }
671657 }
672658
673- fn check_expected_errors ( & self , expected_errors : Vec < Error > , proc_res : & ProcRes ) {
659+ /// Check `//~ KIND message` annotations.
660+ fn check_expected_errors ( & self , proc_res : & ProcRes ) {
661+ let expected_errors = load_errors ( & self . testpaths . file , self . revision ) ;
674662 debug ! (
675663 "check_expected_errors: expected_errors={:?} proc_res.status={:?}" ,
676664 expected_errors, proc_res. status
@@ -711,11 +699,24 @@ impl<'test> TestCx<'test> {
711699 . collect ( ) ;
712700
713701 // Parse the JSON output from the compiler and extract out the messages.
714- let actual_errors = json:: parse_output ( & diagnostic_file_name, & proc_res. stderr , proc_res) ;
702+ let actual_errors = json:: parse_output ( & diagnostic_file_name, & self . get_output ( proc_res) )
703+ . into_iter ( )
704+ . map ( |e| Error { msg : self . normalize_output ( & e. msg , & [ ] ) , ..e } ) ;
705+
715706 let mut unexpected = Vec :: new ( ) ;
716707 let mut found = vec ! [ false ; expected_errors. len( ) ] ;
717- for mut actual_error in actual_errors {
718- actual_error. msg = self . normalize_output ( & actual_error. msg , & [ ] ) ;
708+ for actual_error in actual_errors {
709+ for pattern in & self . props . error_patterns {
710+ let pattern = pattern. trim ( ) ;
711+ if actual_error. msg . contains ( pattern) {
712+ let q = if actual_error. line_num . is_none ( ) { "?" } else { "" } ;
713+ self . fatal ( & format ! (
714+ "error pattern '{pattern}' is found in structured \
715+ diagnostics, use `//~{q} {} {pattern}` instead",
716+ actual_error. kind,
717+ ) ) ;
718+ }
719+ }
719720
720721 let opt_index =
721722 expected_errors. iter ( ) . enumerate ( ) . position ( |( index, expected_error) | {
0 commit comments