You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
use std::fs;
|
|
use std::process::Command;
|
|
use std::sync::Once;
|
|
|
|
pub fn setup() {
|
|
static BUILD: Once = Once::new();
|
|
BUILD.call_once(|| {
|
|
let status = Command::new("cargo")
|
|
.arg("build")
|
|
.status()
|
|
.expect("failed to build");
|
|
assert!(status.success());
|
|
});
|
|
}
|
|
|
|
pub fn contains_panic(name: &str, code: &str) -> bool {
|
|
let tempdir = tempfile::tempdir().unwrap();
|
|
|
|
let prelude = stringify! {
|
|
use no_panic::no_panic;
|
|
};
|
|
|
|
let rs = tempdir.path().join(format!("{}.rs", name));
|
|
fs::write(&rs, format!("{}{}", prelude, code)).unwrap();
|
|
|
|
let status = Command::new("rustc")
|
|
.arg("--crate-name")
|
|
.arg(name)
|
|
.arg(rs)
|
|
.arg("--edition=2018")
|
|
.arg("-C")
|
|
.arg("opt-level=3")
|
|
.arg("--emit=asm")
|
|
.arg("--out-dir")
|
|
.arg(tempdir.path())
|
|
.arg("--extern")
|
|
.arg("no_panic=target/debug/libno_panic.so")
|
|
.status()
|
|
.expect("failed to execute rustc");
|
|
assert!(status.success());
|
|
|
|
let asm = tempdir.path().join(format!("{}.s", name));
|
|
let asm = fs::read_to_string(asm).unwrap();
|
|
asm.contains("detected panic in function")
|
|
}
|
|
|
|
macro_rules! assert_no_panic {
|
|
($(mod $name:ident { $($content:tt)* })*) => {
|
|
mod no_panic {
|
|
use crate::compiletest;
|
|
$(
|
|
#[test]
|
|
fn $name() {
|
|
compiletest::setup();
|
|
let name = stringify!($name);
|
|
let content = stringify!($($content)*);
|
|
assert!(!compiletest::contains_panic(name, content));
|
|
}
|
|
)*
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! assert_link_error {
|
|
($(mod $name:ident { $($content:tt)* })*) => {
|
|
mod link_error {
|
|
use crate::compiletest;
|
|
$(
|
|
#[test]
|
|
fn $name() {
|
|
compiletest::setup();
|
|
let name = stringify!($name);
|
|
let content = stringify!($($content)*);
|
|
assert!(compiletest::contains_panic(name, content));
|
|
}
|
|
)*
|
|
}
|
|
};
|
|
}
|