@@ -23,7 +23,7 @@ use crate::common::{
23
23
output_base_dir, output_base_name, output_testname_unique,
24
24
} ;
25
25
use 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 } ;
27
27
use crate :: header:: TestProps ;
28
28
use crate :: read2:: { Truncated , read2_abbreviated} ;
29
29
use crate :: util:: { Utf8PathBufExt , add_dylib_path, logv, static_regex} ;
@@ -577,23 +577,9 @@ impl<'test> TestCx<'test> {
577
577
}
578
578
}
579
579
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 ) {
595
582
let mut missing_patterns: Vec < String > = Vec :: new ( ) ;
596
-
597
583
self . check_error_patterns ( output_to_check, & mut missing_patterns) ;
598
584
self . check_regex_error_patterns ( output_to_check, proc_res, & mut missing_patterns) ;
599
585
@@ -670,7 +656,9 @@ impl<'test> TestCx<'test> {
670
656
}
671
657
}
672
658
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 ) ;
674
662
debug ! (
675
663
"check_expected_errors: expected_errors={:?} proc_res.status={:?}" ,
676
664
expected_errors, proc_res. status
@@ -711,11 +699,24 @@ impl<'test> TestCx<'test> {
711
699
. collect ( ) ;
712
700
713
701
// 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
+
715
706
let mut unexpected = Vec :: new ( ) ;
716
707
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
+ }
719
720
720
721
let opt_index =
721
722
expected_errors. iter ( ) . enumerate ( ) . position ( |( index, expected_error) | {
0 commit comments