From 34761f5ffe5dac96e2b7daf9f84a0601aa9f8c88 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 26 Nov 2021 21:52:42 -0800 Subject: [PATCH 1/3] Add test of unsplit right angle brackets Currently these aren't being parsed successfully so this fails with: ---- test_path stdout ---- thread 'test_path' panicked at 'assertion failed: `(left == right)` left: `"Condition failed: `E::U::<> > E::U::`"`, right: `"Condition failed: `E::U::<> > E::U::` (U vs U)"`', tests/test_ensure.rs:332:5 thread 'test_path' panicked at 'assertion failed: `(left == right)` left: `"Condition failed: `E::U:: > E::U`"`, right: `"Condition failed: `E::U:: > E::U` (U vs U)"`', tests/test_ensure.rs:336:5 thread 'test_path' panicked at 'assertion failed: `(left == right)` left: `"Condition failed: `E::U:: > E::U`"`, right: `"Condition failed: `E::U:: > E::U` (U vs U)"`', tests/test_ensure.rs:340:5 --- tests/test_ensure.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_ensure.rs b/tests/test_ensure.rs index b2f8a0b..ed47751 100644 --- a/tests/test_ensure.rs +++ b/tests/test_ensure.rs @@ -319,6 +319,25 @@ fn test_path() { test, "Condition failed: `Chain::<'static>::new.t(1) == 2` (1 vs 2)", ); + + #[derive(PartialOrd, PartialEq, Debug)] + enum E<'a, T> { + #[allow(dead_code)] + T(&'a T), + U, + } + + #[rustfmt::skip] + let test = || Ok(ensure!(E::U::<>>E::U::)); + assert_err(test, "Condition failed: `E::U::<> > E::U::` (U vs U)"); + + #[rustfmt::skip] + let test = || Ok(ensure!(E::U::>E::U)); + assert_err(test, "Condition failed: `E::U:: > E::U` (U vs U)"); + + #[rustfmt::skip] + let test = || Ok(ensure!(E::U::>E::U)); + assert_err(test, "Condition failed: `E::U:: > E::U` (U vs U)"); } #[test] From 483ef066e4ae87e2d80ecfe417b16c6af2aaa8a7 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 26 Nov 2021 21:48:17 -0800 Subject: [PATCH 2/3] Handle parsing unseparated right angle brackets in generics --- src/ensure.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ensure.rs b/src/ensure.rs index a8e8445..ba0a125 100644 --- a/src/ensure.rs +++ b/src/ensure.rs @@ -319,6 +319,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* $rangle) $($parse)*} ($($rest)*) $($rest)*) }; + (generic ($pop:ident $stack:tt) $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} $dup:tt >> $($rest:tt)*) => { + $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* >) $($parse)*} (> $($rest)*) > $($rest)*) + }; + (generic $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} $dup:tt $lit:literal $($rest:tt)*) => { $crate::__parse_ensure!(arglist $stack $bail ($($fuel)*) {($($buf)* $lit) $($parse)*} ($($rest)*) $($rest)*) }; @@ -339,6 +343,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* $ty >) $($parse)*} ($($rest)*) $($rest)*) }; + (generic ($pop:ident $stack:tt) $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} $dup:tt $ty:ty >> $($rest:tt)*) => { + $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* $ty >) $($parse)*} (> $($rest)*) > $($rest)*) + }; + (arglist $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($comma:tt $($dup:tt)*) , $($rest:tt)*) => { $crate::__parse_ensure!(generic $stack $bail ($($fuel)*) {($($buf)* $comma) $($parse)*} ($($rest)*) $($rest)*) }; @@ -347,6 +355,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* $rangle) $($parse)*} ($($rest)*) $($rest)*) }; + (arglist ($pop:ident $stack:tt) $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} $dup:tt >> $($rest:tt)*) => { + $crate::__parse_ensure!($pop $stack $bail ($($fuel)*) {($($buf)* >) $($parse)*} (> $($rest)*) > $($rest)*) + }; + // high precedence binary operators (atom $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($add:tt $($dup:tt)*) + $($rest:tt)*) => { From fa70762163efe2e7ad470598a5aeb146c21c3487 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 26 Nov 2021 22:01:58 -0800 Subject: [PATCH 3/3] Ignore items_after_statements Clippy pedantic lint in test error: adding items after statements is confusing, since items exist from the start of the scope --> tests/test_ensure.rs:324:5 | 324 | / enum E<'a, T> { 325 | | #[allow(dead_code)] 326 | | T(&'a T), 327 | | U, 328 | | } | |_____^ | = note: `-D clippy::items-after-statements` implied by `-D clippy::pedantic` = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements --- tests/test_ensure.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_ensure.rs b/tests/test_ensure.rs index ed47751..4cd71e1 100644 --- a/tests/test_ensure.rs +++ b/tests/test_ensure.rs @@ -2,6 +2,7 @@ clippy::diverging_sub_expression, clippy::if_same_then_else, clippy::ifs_same_cond, + clippy::items_after_statements, clippy::let_and_return, clippy::let_underscore_drop, clippy::match_bool,