lkml.org 
[lkml]   [2022]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 09/25] rust: add `build_error` crate
    Date
    From: Gary Guo <gary@garyguo.net>

    The `build_error` crate provides the `build_error` function which
    is then used to provide the `build_error!` and the `build_assert!`
    macros.

    `build_assert!` is intended to be used when `static_assert!` cannot
    be used, e.g. when the condition refers to generic parameters or
    parameters of an inline function.

    Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com>
    Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com>
    Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
    Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
    Signed-off-by: Gary Guo <gary@garyguo.net>
    Co-developed-by: Miguel Ojeda <ojeda@kernel.org>
    Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
    ---
    rust/build_error.rs | 29 +++++++++++++++++++++++++++++
    1 file changed, 29 insertions(+)
    create mode 100644 rust/build_error.rs

    diff --git a/rust/build_error.rs b/rust/build_error.rs
    new file mode 100644
    index 000000000000..34e589149d3e
    --- /dev/null
    +++ b/rust/build_error.rs
    @@ -0,0 +1,29 @@
    +// SPDX-License-Identifier: GPL-2.0
    +
    +//! Build-time error.
    +//!
    +//! This crate provides a function `build_error`, which will panic in
    +//! compile-time if executed in const context, and will cause a build error
    +//! if not executed at compile time and the optimizer does not optimise away the
    +//! call.
    +//!
    +//! It is used by `build_assert!` in the kernel crate, allowing checking of
    +//! conditions that could be checked statically, but could not be enforced in
    +//! Rust yet (e.g. perform some checks in const functions, but those
    +//! functions could still be called in the runtime).
    +
    +#![no_std]
    +
    +/// Panics if executed in const context, or triggers a build error if not.
    +#[inline(never)]
    +#[cold]
    +#[no_mangle]
    +#[track_caller]
    +pub const fn build_error(msg: &'static str) -> ! {
    + panic!("{}", msg);
    +}
    +
    +#[cfg(CONFIG_RUST_BUILD_ASSERT_WARN)]
    +#[link_section = ".gnu.warning.build_error"]
    +#[used]
    +static BUILD_ERROR_WARNING: [u8; 45] = *b"call to build_error present after compilation";
    --
    2.36.1
    \
     
     \ /
      Last update: 2022-05-23 04:05    [W:4.660 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site