lkml.org 
[lkml]   [2021]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/17] rust: add `build_error` crate
    Date
    From: Miguel Ojeda <ojeda@kernel.org>

    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: Geoffrey Thomas <geofft@ldpreload.com>
    Signed-off-by: Geoffrey Thomas <geofft@ldpreload.com>
    Co-developed-by: Finn Behrens <me@kloenk.de>
    Signed-off-by: Finn Behrens <me@kloenk.de>
    Co-developed-by: Adam Bratschi-Kaye <ark.email@gmail.com>
    Signed-off-by: Adam Bratschi-Kaye <ark.email@gmail.com>
    Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
    Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
    Co-developed-by: Boqun Feng <boqun.feng@gmail.com>
    Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
    Co-developed-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
    Signed-off-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
    Co-developed-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Co-developed-by: Sven Van Asbroeck <thesven73@gmail.com>
    Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com>
    Co-developed-by: Gary Guo <gary@garyguo.net>
    Signed-off-by: Gary Guo <gary@garyguo.net>
    Co-developed-by: Boris-Chengbiao Zhou <bobo1239@web.de>
    Signed-off-by: Boris-Chengbiao Zhou <bobo1239@web.de>
    Co-developed-by: Fox Chen <foxhlchen@gmail.com>
    Signed-off-by: Fox Chen <foxhlchen@gmail.com>
    Co-developed-by: Ayaan Zaidi <zaidi.ayaan@gmail.com>
    Signed-off-by: Ayaan Zaidi <zaidi.ayaan@gmail.com>
    Co-developed-by: Douglas Su <d0u9.su@outlook.com>
    Signed-off-by: Douglas Su <d0u9.su@outlook.com>
    Co-developed-by: Yuki Okushi <jtitor@2k36.org>
    Signed-off-by: Yuki Okushi <jtitor@2k36.org>
    Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
    ---
    rust/build_error.rs | 33 +++++++++++++++++++++++++++++++++
    1 file changed, 33 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 00000000000..d47fa8393cb
    --- /dev/null
    +++ b/rust/build_error.rs
    @@ -0,0 +1,33 @@
    +// 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]
    +#![feature(const_panic, core_panic)]
    +
    +/// 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) -> ! {
    + // Could also be `panic!(msg)` to avoid using unstable feature `core_panic`,
    + // but it is not allowed in Rust 2021, while `panic!("{}", msg)` could not
    + // yet be used in const context.
    + core::panicking::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.32.0
    \
     
     \ /
      Last update: 2021-07-04 22:30    [W:4.139 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site