variadics_please version
Version 1.1.0.
What you did
In a crate I'm working on I saw that the implementation was for up to 17 items. This drew my eye because the 16 length limit is a limitation of the C library I'm using. A reproduction of the issue is below and can be run with cargo +nightly -Zscript ./repro.rs.
---
[dependencies]
variadics_please = "1.1.0"
---
macro_rules! fake_impl {
($(#[$meta:meta])* $($ty:ident),*) => {
let s = stringify!($($meta)*);
if !s.is_empty() {
println!("{s}");
}
}
}
fn main() {
variadics_please::all_tuples!(
#[doc(fake_variadic)]
fake_impl,
0,
1,
T
);
}
What went wrong
Despite only running on the tuples () and (T,), this snipped outputs the following:
cfg_attr(any(docsrs, docsrs_dep), doc(fake_variadic))
cfg_attr(any(docsrs, docsrs_dep), doc =
"This trait is implemented for tuples up to 2 items long.")
This is incorrect, as it will only implement the trait for items up to 1 item long.
Additional information
With a brief grep in the bevy repository, this issue looks like it affects at least twenty different trait implementations.
The source of this issue looks to be a double counting in each of the macro functions in the line let len = 1 + input.end - input.start;. Although this is used as an endpoint in a loop, the result of that iteration is ignored as the next iteration is over input.start..=input.end, which is why calling all_tuples with a range of 0 to 1 hasn't been outputting three implementations.
variadics_pleaseversionVersion
1.1.0.What you did
In a crate I'm working on I saw that the implementation was for up to 17 items. This drew my eye because the 16 length limit is a limitation of the C library I'm using. A reproduction of the issue is below and can be run with
cargo +nightly -Zscript ./repro.rs.What went wrong
Despite only running on the tuples
()and(T,), this snipped outputs the following:This is incorrect, as it will only implement the trait for items up to 1 item long.
Additional information
With a brief
grepin the bevy repository, this issue looks like it affects at least twenty different trait implementations.The source of this issue looks to be a double counting in each of the macro functions in the line
let len = 1 + input.end - input.start;. Although this is used as an endpoint in a loop, the result of that iteration is ignored as the next iteration is overinput.start..=input.end, which is why callingall_tupleswith a range of 0 to 1 hasn't been outputting three implementations.