mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-19 08:11:11 -04:00
Rewrite the initializer macros `[pin_]init!` using `syn`. No functional
changes intended aside from improved error messages on syntactic and
semantical errors. For example if one forgets to use `<-` with an
initializer (and instead uses `:`):
impl Bar {
fn new() -> impl PinInit<Self> { ... }
}
impl Foo {
fn new() -> impl PinInit<Self> {
pin_init!(Self { bar: Bar::new() })
}
}
Then the declarative macro would report:
error[E0308]: mismatched types
--> tests/ui/compile-fail/init/colon_instead_of_arrow.rs:21:9
|
14 | fn new() -> impl PinInit<Self> {
| ------------------ the found opaque type
...
21 | pin_init!(Self { bar: Bar::new() })
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| expected `Bar`, found opaque type
| arguments to this function are incorrect
|
= note: expected struct `Bar`
found opaque type `impl pin_init::PinInit<Bar>`
note: function defined here
--> $RUST/core/src/ptr/mod.rs
|
| pub const unsafe fn write<T>(dst: *mut T, src: T) {
| ^^^^^
= note: this error originates in the macro `$crate::__init_internal` which comes from the expansion of the macro `pin_init` (in Nightly builds, run with -Z macro-backtrace for more info)
And the new error is:
error[E0308]: mismatched types
--> tests/ui/compile-fail/init/colon_instead_of_arrow.rs:21:31
|
14 | fn new() -> impl PinInit<Self> {
| ------------------ the found opaque type
...
21 | pin_init!(Self { bar: Bar::new() })
| --- ^^^^^^^^^^ expected `Bar`, found opaque type
| |
| arguments to this function are incorrect
|
= note: expected struct `Bar`
found opaque type `impl pin_init::PinInit<Bar>`
note: function defined here
--> $RUST/core/src/ptr/mod.rs
|
| pub const unsafe fn write<T>(dst: *mut T, src: T) {
| ^^^^^
Importantly, this error gives much more accurate span locations,
pointing to the offending field, rather than the entire macro
invocation.
Tested-by: Andreas Hindborg <a.hindborg@kernel.org>
Reviewed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Benno Lossin <lossin@kernel.org>
61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
|
|
// When fixdep scans this, it will find this string `CONFIG_RUSTC_VERSION_TEXT`
|
|
// and thus add a dependency on `include/config/RUSTC_VERSION_TEXT`, which is
|
|
// touched by Kconfig when the version string from the compiler changes.
|
|
|
|
//! `pin-init` proc macros.
|
|
|
|
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
|
|
// Documentation is done in the pin-init crate instead.
|
|
#![allow(missing_docs)]
|
|
|
|
use proc_macro::TokenStream;
|
|
use syn::parse_macro_input;
|
|
|
|
use crate::diagnostics::DiagCtxt;
|
|
|
|
mod diagnostics;
|
|
mod init;
|
|
mod pin_data;
|
|
mod pinned_drop;
|
|
mod zeroable;
|
|
|
|
#[proc_macro_attribute]
|
|
pub fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
|
|
let args = parse_macro_input!(args);
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| pin_data::pin_data(args, input, dcx)).into()
|
|
}
|
|
|
|
#[proc_macro_attribute]
|
|
pub fn pinned_drop(args: TokenStream, input: TokenStream) -> TokenStream {
|
|
let args = parse_macro_input!(args);
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| pinned_drop::pinned_drop(args, input, dcx)).into()
|
|
}
|
|
|
|
#[proc_macro_derive(Zeroable)]
|
|
pub fn derive_zeroable(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| zeroable::derive(input, dcx)).into()
|
|
}
|
|
|
|
#[proc_macro_derive(MaybeZeroable)]
|
|
pub fn maybe_derive_zeroable(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| zeroable::maybe_derive(input, dcx)).into()
|
|
}
|
|
#[proc_macro]
|
|
pub fn init(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| init::expand(input, Some("::core::convert::Infallible"), false, dcx))
|
|
.into()
|
|
}
|
|
|
|
#[proc_macro]
|
|
pub fn pin_init(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input);
|
|
DiagCtxt::with(|dcx| init::expand(input, Some("::core::convert::Infallible"), true, dcx)).into()
|
|
}
|