2 // ignore-tidy-linelength
6 #![allow(path_statements, unused_allocation)]
7 #![feature(box_syntax, core_intrinsics, generic_assert, generic_assert_internals)]
11 let mut $elem_ident
:ident
= $elem_expr
:expr
;
12 [ $
($assert
:tt
)* ] => $msg
:literal
15 #[allow(unused_assignments, unused_mut, unused_variables)]
16 let rslt
= std
::panic
::catch_unwind(|| {
17 let mut $elem_ident
= $elem_expr
;
20 let err
= rslt
.unwrap_err();
21 if let Some(elem
) = err
.downcast_ref
::<String
>() {
22 assert_eq
!(elem
, &$msg
);
24 else if let Some(elem
) = err
.downcast_ref
::<&str>() {
25 assert_eq
!(elem
, &$msg
);
28 panic
!("assert!( ... ) should return a string");
36 let mut $elem_ident
:ident
= $elem_expr
:expr
;
39 [ $
($elem_assert
:tt
)* ] => $elem_msg
:literal
44 let mut $elem_ident
= $elem_expr
;
45 [ $
($elem_assert
)* ] => $elem_msg
51 const FOO
: Foo
= Foo { bar: 1 }
;
53 #[derive(Clone, Copy, Debug, PartialEq)]
59 fn add(&self, a
: i32, b
: i32) -> i32 { a + b }
62 fn add(a
: i32, b
: i32) -> i32 { a + b }
65 // ***** Allowed *****
71 [ &elem
== &3 ] => "Assertion failed: &elem == &3\nWith captures:\n elem = 1\n"
74 [ [elem
][0] == 3 ] => "Assertion failed: [elem][0] == 3\nWith captures:\n elem = 1\n"
77 [ elem
+ 1 == 3 ] => "Assertion failed: elem + 1 == 3\nWith captures:\n elem = 1\n"
80 [ add(elem
, elem
) == 3 ] => "Assertion failed: add(elem, elem) == 3\nWith captures:\n elem = 1\n"
83 [ elem
as i32 == 3 ] => "Assertion failed: elem as i32 == 3\nWith captures:\n elem = 1\n"
86 [ [1i32, 1][elem
as usize] == 3 ] => "Assertion failed: [1i32, 1][elem as usize] == 3\nWith captures:\n elem = 1\n"
89 [ FOO
.add(elem
, elem
) == 3 ] => "Assertion failed: FOO.add(elem, elem) == 3\nWith captures:\n elem = 1\n"
92 [ (elem
) == 3 ] => "Assertion failed: (elem) == 3\nWith captures:\n elem = 1\n"
95 [ (0..elem
) == (0..3) ] => "Assertion failed: (0..elem) == (0..3)\nWith captures:\n elem = 1\n"
98 [ [elem
; 1] == [3; 1] ] => "Assertion failed: [elem; 1] == [3; 1]\nWith captures:\n elem = 1\n"
101 [ Foo { bar: elem }
== Foo { bar: 3 }
] => "Assertion failed: Foo { bar: elem } == Foo { bar: 3 }\nWith captures:\n elem = 1\n"
104 [ (elem
, 1) == (3, 3) ] => "Assertion failed: (elem, 1) == (3, 3)\nWith captures:\n elem = 1\n"
107 [ -elem
== -3 ] => "Assertion failed: -elem == -3\nWith captures:\n elem = 1\n"
110 // ***** Disallowed *****
116 [ { let local = elem; local }
== 3 ] => "Assertion failed: { let local = elem; local } == 3"
119 [ { elem += 1; elem }
== 3 ] => "Assertion failed: { elem += 1; elem } == 3"
122 [ { let _ = async { elem }
; elem
} == 3 ] => "Assertion failed: { let _ = async { elem }; elem } == 3"
127 [ { elem }
== 3 ] => "Assertion failed: { elem } == 3"
130 [ box elem
== box 3 ] => "Assertion failed: box elem == box 3"
133 [ loop { break elem; }
== 3 ] => "Assertion failed: loop { break elem; } == 3"
136 [(|| elem
)() == 3 ] => "Assertion failed: (|| elem)() == 3"
145 [ FOO
.bar
== 3 ] => "Assertion failed: FOO.bar == 3"
148 [ { for _ in 0..elem { elem; } elem
} == 3 ] => "Assertion failed: { for _ in 0..elem { elem; } elem } == 3"
151 [ if true { elem }
else { elem }
== 3 ] => "Assertion failed: if true { elem } else { elem } == 3"
156 [ if let true = true { elem }
else { elem }
== 3 ] => "Assertion failed: if let true = true { elem } else { elem } == 3"
161 [ loop { elem; break elem; }
== 3 ] => "Assertion failed: loop { elem; break elem; } == 3"
166 [ match elem { _ => elem }
== 3 ] => "Assertion failed: match elem { _ => elem, } == 3"
169 [ (|| { return elem; }
)() == 3 ] => "Assertion failed: (|| { return elem; })() == 3"
172 [ (|| { Some(Some(elem)?) }
)() == Some(3) ] => "Assertion failed: (|| { Some(Some(elem)?) })() == Some(3)"
179 [ { while false { elem; break; } elem
} == 3 ] => "Assertion failed: { while false { elem; break; } elem } == 3"