diff --git a/src/compiletest/errors.rs b/src/compiletest/errors.rs index c1fbfcda475597f804bd59eca1909e9236ddefb0..7ad0cd2a95d4bedd8b7966b4f0af52c5cd5bcff8 100644 --- a/src/compiletest/errors.rs +++ b/src/compiletest/errors.rs @@ -9,14 +9,54 @@ // except according to those terms. use self::WhichLine::*; +use std::fmt; use std::fs::File; use std::io::BufReader; use std::io::prelude::*; use std::path::Path; +use std::str::FromStr; + +#[derive(Clone, Debug, PartialEq)] +pub enum ErrorKind { + Help, + Error, + Note, + Suggestion, + Warning, +} + +impl FromStr for ErrorKind { + type Err = (); + fn from_str(s: &str) -> Result { + match &s.trim_right_matches(':') as &str { + "HELP" => Ok(ErrorKind::Help), + "ERROR" => Ok(ErrorKind::Error), + "NOTE" => Ok(ErrorKind::Note), + "SUGGESTION" => Ok(ErrorKind::Suggestion), + "WARN" => Ok(ErrorKind::Warning), + "WARNING" => Ok(ErrorKind::Warning), + _ => Err(()), + } + } +} + +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ErrorKind::Help => write!(f, "help"), + ErrorKind::Error => write!(f, "error"), + ErrorKind::Note => write!(f, "note"), + ErrorKind::Suggestion => write!(f, "suggestion"), + ErrorKind::Warning => write!(f, "warning"), + } + } +} pub struct ExpectedError { pub line_num: usize, - pub kind: String, + /// What kind of message we expect (e.g. warning, error, suggestion). + /// `None` if not specified or unknown message kind. + pub kind: Option, pub msg: String, } @@ -81,11 +121,11 @@ fn parse_expected(last_nonfollow_error: Option, (false, line[start + tag.len()..].chars().take_while(|c| *c == '^').count()) }; let kind_start = start + tag.len() + adjusts + (follow as usize); - let letters = line[kind_start..].chars(); - let kind = letters.skip_while(|c| c.is_whitespace()) - .take_while(|c| !c.is_whitespace()) - .flat_map(|c| c.to_lowercase()) - .collect::(); + let kind = line[kind_start..].split_whitespace() + .next() + .expect("Encountered unexpected empty comment") + .parse::() + .ok(); let letters = line[kind_start..].chars(); let msg = letters.skip_while(|c| c.is_whitespace()) .skip_while(|c| !c.is_whitespace()) diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index 5af70e53125a115d283d56c02610b596161ffae0..5293eee9459cf1728f4964084ce15b0bc6dba80c 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -11,7 +11,7 @@ use common::Config; use common::{CompileFail, ParseFail, Pretty, RunFail, RunPass, RunPassValgrind}; use common::{Codegen, DebugInfoLldb, DebugInfoGdb, Rustdoc, CodegenUnits}; -use errors; +use errors::{self, ErrorKind}; use header::TestProps; use header; use procsrv; @@ -1033,8 +1033,8 @@ fn check_expected_errors(revision: Option<&str>, expected_errors.iter() .fold((false, false), |(acc_help, acc_note), ee| - (acc_help || ee.kind == "help:" || ee.kind == "help", - acc_note || ee.kind == "note:" || ee.kind == "note")); + (acc_help || ee.kind == Some(ErrorKind::Help), + acc_note || ee.kind == Some(ErrorKind::Note))); // Scan and extract our error/warning messages, // which look like: @@ -1052,15 +1052,15 @@ fn check_expected_errors(revision: Option<&str>, let mut prev = 0; for (i, ee) in expected_errors.iter().enumerate() { if !found_flags[i] { - debug!("prefix={} ee.kind={} ee.msg={} line={}", + debug!("prefix={} ee.kind={:?} ee.msg={} line={}", prefixes[i], ee.kind, ee.msg, line); // Suggestions have no line number in their output, so take on the line number of // the previous expected error - if ee.kind == "suggestion" { - assert!(expected_errors[prev].kind == "help", + if ee.kind == Some(ErrorKind::Suggestion) { + assert!(expected_errors[prev].kind == Some(ErrorKind::Help), "SUGGESTIONs must be preceded by a HELP"); if line.contains(&ee.msg) { found_flags[i] = true; @@ -1070,7 +1070,7 @@ fn check_expected_errors(revision: Option<&str>, } if (prefix_matches(line, &prefixes[i]) || continuation(line)) && - line.contains(&ee.kind) && + (ee.kind.is_none() || line.contains(&ee.kind.as_ref().unwrap().to_string())) && line.contains(&ee.msg) { found_flags[i] = true; @@ -1096,7 +1096,10 @@ fn check_expected_errors(revision: Option<&str>, if !flag { let ee = &expected_errors[i]; error(revision, &format!("expected {} on line {} not found: {}", - ee.kind, ee.line_num, ee.msg)); + ee.kind.as_ref() + .map_or("message".into(), + |k| k.to_string()), + ee.line_num, ee.msg)); not_found += 1; } }