diff --git a/src/main.rs b/src/main.rs index a3489fe0..23562938 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,6 +40,10 @@ impl Callbacks for CompilerCalls { .push((pass.to_owned(), false)); } + // A call inlined by the MIR inliner leaves no `Call` terminator behind, so the + // arguments are never checked against the callee's specification. + config.opts.unstable_opts.inline_mir = Some(false); + config.override_queries = Some(|_sess, providers| { providers.mir_borrowck = thrust::mir_borrowck_skip_formula_fn; }); diff --git a/tests/ui/fail/trusted_requires_opt_level.rs b/tests/ui/fail/trusted_requires_opt_level.rs new file mode 100644 index 00000000..97b5bc8d --- /dev/null +++ b/tests/ui/fail/trusted_requires_opt_level.rs @@ -0,0 +1,11 @@ +//@error-in-other-file: Unsat +//@compile-flags: -C debug-assertions=off -C opt-level=3 + +#[thrust::trusted] +#[thrust_macros::requires(x != 0)] +#[thrust_macros::ensures(true)] +fn assume_nonzero(x: i32) {} + +fn main() { + assume_nonzero(0); +} diff --git a/tests/ui/pass/trusted_requires_opt_level.rs b/tests/ui/pass/trusted_requires_opt_level.rs new file mode 100644 index 00000000..dd197254 --- /dev/null +++ b/tests/ui/pass/trusted_requires_opt_level.rs @@ -0,0 +1,11 @@ +//@check-pass +//@compile-flags: -C debug-assertions=off -C opt-level=3 + +#[thrust::trusted] +#[thrust_macros::requires(x != 0)] +#[thrust_macros::ensures(true)] +fn assume_nonzero(x: i32) {} + +fn main() { + assume_nonzero(1); +}