The `#[bench(args)]` option does not support generic arguments
This code:
use std::ops::{Add, Mul};
#[divan::bench(args=[(3,4), (5,6)], types=[u8, u32, u64, u128, usize])]
fn f<T>((x, y): (T,T)) -> (T,T)
where T: Copy + Add<Output = T> + Mul<Output = T>
{
(x + y, x * y)
}
fn main() {
println!("f::<u128>(3,4) = {:?}", f::<u128>((3,4)));
println!("f::<u8>(3,4) = {:?}", f::<u8>((3,4)));
divan::main();
}
produces this error:
error[E0412]: cannot find type `T` in this scope: bug_divan(bench)
--> benches/bug_divan.rs:4:18
|
4 | fn f<T>((x, y): (T,T)) -> (T,T)
| ^ not found in this scope
error[E0412]: cannot find type `T` in this scope
--> benches/bug_divan.rs:4:20
|
4 | fn f<T>((x, y): (T,T)) -> (T,T)
| ^ not found in this scope
For more information about this error, try `rustc --explain E0412`.
error: could not compile `fe_cards` (bench "bug_divan") due to 2 previous errors
When the divan attribute above f is removed; the program compiles and runs. I'm sorry, I'm new to rust and macros are beyond my ken, so I can't offer any suggestions.
Anyway; thank you for divan and I liked your talk. At the moment, I'm exploring the performance of different combinatorial algorithm implementations and the effects of different primitive type choises. divan is a nice fit.
I didn't design the args option to work with a generic type argument. I'm in the middle of a refactor and may be able to fix this issue as a part of that.
The solution here is perhaps to have each f::<T> instantiated with its own args slice, rather than have a single args slice shared for all generic types. Perhaps a later optimization would be to create a single args slice if T is not reference in any of the argument types.
Update on this: I have a solution that will land in 0.2.
Fantastic -- sorry for the late reply.