From c36c0fdc154bed5563b73497532242404e736231 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 18 Feb 2022 17:21:16 -0800 Subject: [PATCH 1/2] Add test of negative literal --- tests/test_ensure.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_ensure.rs b/tests/test_ensure.rs index c75edc5..411983d 100644 --- a/tests/test_ensure.rs +++ b/tests/test_ensure.rs @@ -327,10 +327,14 @@ fn test_path() { fn f() {} let test = || Ok(ensure!(f::<1>() != ())); assert_err(test, "Condition failed: `f::<1>() != ()` (() vs ())"); + let test = || Ok(ensure!(f::<-1>() != ())); + assert_err(test, "Condition failed: `f::<-1>() != ()`"); // FIXME fn g() {} let test = || Ok(ensure!(g::() != ())); assert_err(test, "Condition failed: `g::() != ()` (() vs ())"); + let test = || Ok(ensure!(g::() != ())); + assert_err(test, "Condition failed: `g::() != ()` (() vs ())"); #[derive(PartialOrd, PartialEq, Debug)] enum E<'a, T> { From c38e117db2f87147806dfb3fb359e7dcbcbcaa28 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 18 Feb 2022 17:26:49 -0800 Subject: [PATCH 2/2] Handle negative literal const generic argument after left arrow --- src/ensure.rs | 16 ++++++++++++++++ tests/test_ensure.rs | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ensure.rs b/src/ensure.rs index dcb9b09..96a810a 100644 --- a/src/ensure.rs +++ b/src/ensure.rs @@ -257,6 +257,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!(generic (epath $stack) $bail ($($fuel)*) {($($buf)* $colons <) $($parse)*} (< $($rest)*) < $($rest)*) }; + (epath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($colons:tt $($dup:tt)*) :: <- $($rest:tt)*) => { + $crate::__parse_ensure!(generic (epath $stack) $bail ($($fuel)*) {($($buf)* $colons <) $($parse)*} (- $($rest)*) - $($rest)*) + }; + (epath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($colons:tt $($dup:tt)*) :: $ident:ident $($rest:tt)*) => { $crate::__parse_ensure!(epath $stack $bail ($($fuel)*) {($($buf)* $colons $ident) $($parse)*} ($($rest)*) $($rest)*) }; @@ -303,6 +307,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!(generic (atom $stack) $bail ($($fuel)*) {($($buf)* $dot $ident $colons <) $($parse)*} (< $($rest)*) < $($rest)*) }; + (atom $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($dot:tt $ident:tt $colons:tt $($dup:tt)*) . $i:ident :: <- $($rest:tt)*) => { + $crate::__parse_ensure!(generic (atom $stack) $bail ($($fuel)*) {($($buf)* $dot $ident $colons <) $($parse)*} (- $($rest)*) - $($rest)*) + }; + (atom $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($dot:tt $($dup:tt)*) . $field:ident $($rest:tt)*) => { $crate::__parse_ensure!(atom $stack $bail ($($fuel)*) {($($buf)* $dot $field) $($parse)*} ($($rest)*) $($rest)*) }; @@ -427,6 +435,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!(generic (tpath $stack) $bail ($($fuel)*) {($($buf)* <) $($parse)*} (< $($rest)*) < $($rest)*) }; + (tpath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} $dup:tt <- $($rest:tt)*) => { + $crate::__parse_ensure!(generic (tpath $stack) $bail ($($fuel)*) {($($buf)* <) $($parse)*} (- $($rest)*) - $($rest)*) + }; + (tpath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($colons:tt $langle:tt $($dup:tt)*) :: < $($rest:tt)*) => { $crate::__parse_ensure!(generic (tpath $stack) $bail ($($fuel)*) {($($buf)* $colons $langle) $($parse)*} ($($rest)*) $($rest)*) }; @@ -435,6 +447,10 @@ macro_rules! __parse_ensure { $crate::__parse_ensure!(generic (tpath $stack) $bail ($($fuel)*) {($($buf)* $colons <) $($parse)*} (< $($rest)*) < $($rest)*) }; + (tpath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($colons:tt $($dup:tt)*) :: <- $($rest:tt)*) => { + $crate::__parse_ensure!(generic (tpath $stack) $bail ($($fuel)*) {($($buf)* $colons <) $($parse)*} (- $($rest)*) - $($rest)*) + }; + (tpath $stack:tt $bail:tt (~$($fuel:tt)*) {($($buf:tt)*) $($parse:tt)*} ($colons:tt $($dup:tt)*) :: $ident:ident $($rest:tt)*) => { $crate::__parse_ensure!(tpath $stack $bail ($($fuel)*) {($($buf)* $colons $ident) $($parse)*} ($($rest)*) $($rest)*) }; diff --git a/tests/test_ensure.rs b/tests/test_ensure.rs index 411983d..4bb12f9 100644 --- a/tests/test_ensure.rs +++ b/tests/test_ensure.rs @@ -328,7 +328,7 @@ fn test_path() { let test = || Ok(ensure!(f::<1>() != ())); assert_err(test, "Condition failed: `f::<1>() != ()` (() vs ())"); let test = || Ok(ensure!(f::<-1>() != ())); - assert_err(test, "Condition failed: `f::<-1>() != ()`"); // FIXME + assert_err(test, "Condition failed: `f::<-1>() != ()` (() vs ())"); fn g() {} let test = || Ok(ensure!(g::() != ()));