profile
viewpoint

Ask questionsUnsafety checks for "unconst" operations do not trigger in unstable functions

Some operations, such as raw pointer comparisons, require unsafe when inside a const context. To my knowledge, none of these operations have been const-stabilized. Accordingly, the following example fails to compile due to a missing unsafe block.

#![feature(const_compare_raw_pointers)]
#![feature(const_fn)]

const fn unstable(a: *const i32, b: *const i32) -> bool {
    a == b
}

However, the check does not run for const_unstable functions. The following compiles successfully:

#![stable(feature = "foo", since = "1.33.0")]
#![feature(staged_api)]
#![feature(const_compare_raw_pointers)]
#![feature(const_fn)]

#[stable(feature = "foo", since = "1.33.0")]
#[rustc_const_unstable(feature = "const_foo", issue = "none")]
const fn unstable(a: *const i32, b: *const i32) -> bool {
    a == b
}

This is an easy problem to fix, but the root cause here is poor naming. Specifically, fn_queries::is_const_fn should be renamed is_callable_as_const_fn and is_const_fn_raw should be is_declared_const_fn. We have had other issues due to this in the past. cc @rust-lang/wg-const-eval to weigh in on the renaming.

rust-lang/rust

Answer questions ecstatic-morse

Oh, the names are different than in the email I got because you edited.

Damn. I was hoping no one would catch me :smile:.

is_const_callable_fn would indeed take feature flags into account to mirror the current behavior of is_const_fn. I originally had is_stably_const_fn, but that's not really correct, since it would also return true if the function was unstable but the requisite feature flags were set.

useful!
source:https://uonfu.com/
Github User Rank List