// run-pass #![allow(unused_mut)] // ignore-wasm32 // ignore-emscripten // ignore-sgx no processes // compile-flags: -C debug_assertions=yes #![stable(feature = "rustc", since = "1.0.0")] #![feature(const_fn, rustc_private, staged_api, rustc_attrs)] #![allow(const_err)] extern crate libc; use std::env; use std::process::{Command, Stdio}; // this will panic in debug mode and overflow in release mode // // NB we give bar an unused argument because otherwise memoization // of the const fn kicks in, causing a different code path in the // compiler to be executed (see PR #66294). #[stable(feature = "rustc", since = "1.0.0")] #[rustc_const_stable(feature = "rustc", since = "1.0.0")] #[rustc_promotable] const fn bar(_: bool) -> usize { 0 - 1 } fn foo() { let _: &'static _ = &bar(true); } #[cfg(unix)] fn check_status(status: std::process::ExitStatus) { use std::os::unix::process::ExitStatusExt; assert!(status.signal() == Some(libc::SIGILL) || status.signal() == Some(libc::SIGTRAP) || status.signal() == Some(libc::SIGABRT)); } #[cfg(not(unix))] fn check_status(status: std::process::ExitStatus) { assert!(!status.success()); } fn main() { let args: Vec = env::args().collect(); if args.len() > 1 && args[1] == "test" { foo(); return; } let mut p = Command::new(&args[0]) .stdout(Stdio::piped()) .stdin(Stdio::piped()) .arg("test").output().unwrap(); check_status(p.status); }