Skip to content

clippy::cast_lossless lint should be silenced #270

@sunshowers

Description

@sunshowers

With Rust 1.80 and this code:

#[usdt::provider(provider = "nexus_db_queries")]
mod probes {
    // Fires before we start a search over a range for a VNI.
    //
    // Includes the starting VNI and the size of the range being searched.
    fn vni__search__range__start(
        _: &usdt::UniqueId,
        start_vni: u32,
        size: u32,
    ) {
    }

    // Fires when we successfully find a VNI.
    fn vni__search__range__found(_: &usdt::UniqueId, vni: u32) {}

    // Fires when we fail to find a VNI in the provided range.
    fn vni__search__range__empty(_: &usdt::UniqueId) {}
}

// ...

crate::probes::vni__search__range__start!(|| {
    (&id, u32::from(vni), VniSearchIter::STEP_SIZE)
});

Running cargo clippy with the clippy::cast_lossless lint enabled produces this warning:

asting `u32` to `#[usdt::provider(provider = "nexus_db_queries")]` may become silently lossy if you later change the type
   --> nexus/db-queries/src/lib.rs:24:1
    |
24  |   #[usdt::provider(provider = "nexus_db_queries")]
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
   ::: nexus/db-queries/src/db/datastore/vpc.rs:360:13
    |
360 | /             crate::probes::vni__search__range__start!(|| {
361 | |                 (&id, u32::from(vni), VniSearchIter::STEP_SIZE)
362 | |             });
    | |______________- in this macro invocation
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless
    = note: `-D clippy::cast-lossless` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(clippy::cast_lossless)]`
    = note: this error originates in the macro `crate::probes::vni__search__range__start` (in Nightly builds, run with -Z macro-backtrace for more info)
help: try
    |
24  + #[usdt::provider(provider = "nexus_db_queries")]::from(crate::probes::vni__search__range__start!(|| {
25  +                 (&id, u32::from(vni), VniSearchIter::STEP_SIZE)
26  +             }))
    |

error: casting `u32` to `#[usdt::provider(provider = "nexus_db_queries")]` may become silently lossy if you later change the type
   --> nexus/db-queries/src/lib.rs:24:1
    |
24  |   #[usdt::provider(provider = "nexus_db_queries")]
    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
   ::: nexus/db-queries/src/db/datastore/vpc.rs:372:21
    |
372 | /                     crate::probes::vni__search__range__found!(|| {
373 | |                         (&id, u32::from(vpc.vni.0))
374 | |                     });
    | |______________________- in this macro invocation
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless
    = note: this error originates in the macro `crate::probes::vni__search__range__found` (in Nightly builds, run with -Z macro-backtrace for more info)
help: try
    |
24  + #[usdt::provider(provider = "nexus_db_queries")]::from(crate::probes::vni__search__range__found!(|| {
25  +                         (&id, u32::from(vpc.vni.0))
26  +                     }))
    |

From a quick look at cargo expand, it looks like this code is produced:

if is_enabled != 0 {
    let args = __usdt_private_args_lambda();
    let arg_0 = args.0.as_u64() as i64;
    let arg_1 = (*<_ as ::std::borrow::Borrow<
        u32,
    >>::borrow(&args.1) as i64);
    let arg_2 = (*<_ as ::std::borrow::Borrow<
        u32,
    >>::borrow(&args.2) as i64);

    // ...
}

I think this code is what's producing the warning.

Since this is autogenerated code, we should silence this lint. I think annotating with automatically_derived might work? If not then explicitly silencing this lint should do the job.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions