blob: 791027d4fbc189ccd93b2c783368c5f4bebb38b1 [file] [log] [blame]
use std::path::{Path, PathBuf};
use crate::rustc_stderr::Level;
use crate::rustc_stderr::Message;
use super::*;
fn config() -> Config {
Config {
root_dir: PathBuf::from("$RUSTROOT"),
program: CommandBuilder::cmd("cake"),
..Config::rustc(PathBuf::new())
}
}
#[test]
fn issue_2156() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address $HEX is unallocated)
}
";
let comments = Comments::parse(s).unwrap();
let mut errors = vec![];
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message:"Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
}
]
];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[Error::PatternNotFound(pattern), Error::ErrorsWithoutPattern { path, .. }]
if path.as_ref().is_some_and(|p| p.line().get() == 5) && pattern.line().get() == 5 => {}
_ => panic!("{:#?}", errors),
}
}
#[test]
fn find_pattern() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(s).unwrap();
let config = config();
{
let messages = vec![vec![], vec![], vec![], vec![], vec![], vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[] => {}
_ => panic!("{:#?}", errors),
}
}
// only difference to above is a wrong line number
{
let messages = vec![vec![], vec![], vec![], vec![], vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[Error::PatternNotFound(pattern), Error::ErrorsWithoutPattern { path, .. }]
if path.as_ref().is_some_and(|p| p.line().get() == 4)
&& pattern.line().get() == 5 => {}
_ => panic!("not the expected error: {:#?}", errors),
}
}
// only difference to first is a wrong level
{
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Note,
line_col: None,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
// Note no `ErrorsWithoutPattern`, because there are no `//~NOTE` in the test file, so we ignore them
[Error::PatternNotFound(pattern)] if pattern.line().get() == 5 => {}
_ => panic!("not the expected error: {:#?}", errors),
}
}
}
#[test]
fn duplicate_pattern() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address 0x10 is unallocated)
//~^ ERROR: encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(s).unwrap();
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[Error::PatternNotFound(pattern)] if pattern.line().get() == 6 => {}
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_pattern() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address 0x10 is unallocated)
}
";
let comments = Comments::parse(s).unwrap();
let config = config();
let messages = vec![
vec![], vec![], vec![], vec![], vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
},
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
}
]
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[Error::ErrorsWithoutPattern { path, .. }]
if path.as_ref().is_some_and(|p| p.line().get() == 5) => {}
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_warn_pattern() {
let s = r"
use std::mem;
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address 0x10 is unallocated)
//~^ WARN: cake
}
";
let comments = Comments::parse(s).unwrap();
let config = config();
let messages= vec![
vec![],
vec![],
vec![],
vec![],
vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
},
Message {
message: "kaboom".to_string(),
level: Level::Warn,
line_col: None,
},
Message {
message: "cake".to_string(),
level: Level::Warn,
line_col: None,
},
],
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[Error::ErrorsWithoutPattern { path, msgs, .. }]
if path.as_ref().is_some_and(|p| p.line().get() == 5) =>
{
match &msgs[..] {
[Message {
message,
level: Level::Warn,
line_col: _,
}] if message == "kaboom" => {}
_ => panic!("{:#?}", msgs),
}
}
_ => panic!("{:#?}", errors),
}
}
#[test]
fn missing_implicit_warn_pattern() {
let s = r"
use std::mem;
//@require-annotations-for-level: ERROR
fn main() {
let _x: &i32 = unsafe { mem::transmute(16usize) }; //~ ERROR: encountered a dangling reference (address 0x10 is unallocated)
//~^ WARN: cake
}
";
let comments = Comments::parse(s).unwrap();
let config = config();
let messages = vec![
vec![],
vec![],
vec![],
vec![],
vec![],
vec![
Message {
message: "Undefined Behavior: type validation failed: encountered a dangling reference (address 0x10 is unallocated)".to_string(),
level: Level::Error,
line_col: None,
},
Message {
message: "kaboom".to_string(),
level: Level::Warn,
line_col: None,
},
Message {
message: "cake".to_string(),
level: Level::Warn,
line_col: None,
},
],
];
let mut errors = vec![];
check_annotations(
messages,
vec![],
Path::new("moobar"),
&mut errors,
&config,
"",
&comments,
)
.unwrap();
match &errors[..] {
[] => {}
_ => panic!("{:#?}", errors),
}
}