@@ -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