Skip to content

Commit

Permalink
make it possible to enable const_precise_live_drops per-function
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Aug 24, 2024
1 parent edbc000 commit d21c427
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 8 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_const_eval/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ const_eval_unstable_const_fn = `{$def_path}` is not yet stable as a const fn
const_eval_unstable_in_stable =
const-stable function cannot use `#[feature({$gate})]`
.unstable_sugg = if it is not part of the public API, make this function unstably const
.bypass_sugg = otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
.bypass_sugg = otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks (but requires team approval)
const_eval_unterminated_c_string =
reading a null-terminated string starting at {$pointer} with no null found before end of allocation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@ use super::check::Qualifs;
use super::ops::{self, NonConstOp};
use super::qualifs::{NeedsNonConstDrop, Qualif};
use super::ConstCx;
use crate::check_consts::rustc_allow_const_fn_unstable;

/// Returns `true` if we should use the more precise live drop checker that runs after drop
/// elaboration.
pub fn checking_enabled(ccx: &ConstCx<'_, '_>) -> bool {
// Const-stable functions must always use the stable live drop checker.
// Const-stable functions must always use the stable live drop checker...
if ccx.is_const_stable_const_fn() {
return false;
// ...except if they have the feature flag set via `rustc_allow_const_fn_unstable`.
return rustc_allow_const_fn_unstable(
ccx.tcx,
ccx.body.source.def_id().expect_local(),
sym::const_precise_live_drops,
);
}

ccx.tcx.features().const_precise_live_drops
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/consts/min_const_fn/allow_const_fn_ptr_run_pass.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
//@ run-pass
#![feature(rustc_allow_const_fn_unstable)]

#![feature(rustc_attrs, staged_api)]
#![stable(feature = "rust1", since = "1.0.0")]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ help: if it is not part of the public API, make this function unstably const
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks (but requires team approval)
|
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ help: if it is not part of the public API, make this function unstably const
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks (but requires team approval)
|
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
error[E0493]: destructor of `Option<T>` cannot be evaluated at compile-time
--> $DIR/precise-drop-allow-const-fn-unstable.rs:11:24
|
LL | pub const fn unwrap<T>(this: Option<T>) -> T {
| ^^^^ the destructor for this type cannot be evaluated in constant functions
...
LL | }
| - value is dropped here

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0493`.
17 changes: 17 additions & 0 deletions tests/ui/consts/precise-drop-allow-const-fn-unstable.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//@ revisions: allow not_allow
//@ compile-flags: --crate-type=lib -Cinstrument-coverage -Zno-profiler-runtime
//@[allow] check-pass

#![feature(staged_api, rustc_allow_const_fn_unstable)]
#![stable(feature = "rust_test", since = "1.0.0")]

#[stable(feature = "rust_test", since = "1.0.0")]
#[rustc_const_stable(feature = "rust_test", since = "1.0.0")]
#[cfg_attr(allow, rustc_allow_const_fn_unstable(const_precise_live_drops))]
pub const fn unwrap<T>(this: Option<T>) -> T {
//[not_allow]~^ ERROR: cannot be evaluated
match this {
Some(x) => x,
None => panic!(),
}
}
2 changes: 1 addition & 1 deletion tests/ui/internal/internal-unstable-const.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ help: if it is not part of the public API, make this function unstably const
LL + #[rustc_const_unstable(feature = "...", issue = "...")]
LL | pub const fn foo() -> f32 {
|
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks
help: otherwise `#[rustc_allow_const_fn_unstable]` can be used to bypass stability checks (but requires team approval)
|
LL + #[rustc_allow_const_fn_unstable(const_fn_floating_point_arithmetic)]
LL | pub const fn foo() -> f32 {
Expand Down

0 comments on commit d21c427

Please sign in to comment.