From df6fb60f8491e566d5228a91248a5db25725880c Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Wed, 6 May 2020 15:20:57 -0700 Subject: [PATCH] Make sure smallvec! is usable without being in scope Macro recursion should use a `$crate` prefix to reliably find itself. --- lib.rs | 2 +- tests/macro.rs | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/macro.rs diff --git a/lib.rs b/lib.rs index 9580952..4ac931c 100644 --- a/lib.rs +++ b/lib.rs @@ -145,7 +145,7 @@ macro_rules! smallvec { $crate::SmallVec::from_elem($elem, $n) }); ($($x:expr),*$(,)*) => ({ - let count = 0usize $(+ smallvec!(@one $x))*; + let count = 0usize $(+ $crate::smallvec!(@one $x))*; let mut vec = $crate::SmallVec::new(); if count <= vec.inline_size() { $(vec.push($x);)* diff --git a/tests/macro.rs b/tests/macro.rs new file mode 100644 index 0000000..6ecb8a9 --- /dev/null +++ b/tests/macro.rs @@ -0,0 +1,25 @@ +/// This file tests `smallvec!` without actually having the macro in scope. +/// This forces any recursion to use a `$crate` prefix to reliably find itself. + +#[test] +fn smallvec() { + let mut vec: smallvec::SmallVec<[i32; 2]>; + + macro_rules! check { + ($init:tt) => { + vec = smallvec::smallvec! $init; + assert_eq!(*vec, *vec! $init); + } + } + + check!([0; 0]); + check!([1; 1]); + check!([2; 2]); + check!([3; 3]); + + check!([]); + check!([1]); + check!([1, 2]); + check!([1, 2, 3]); +} +