]> git.proxmox.com Git - rustc.git/blob - src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs
New upstream version 1.63.0+dfsg1
[rustc.git] / src / test / ui / macros / rfc-2011-nicer-assert-messages / all-expr-kinds.rs
1 // edition:2021
2 // ignore-tidy-linelength
3 // only-x86_64
4 // run-pass
5
6 #![allow(path_statements, unused_allocation)]
7 #![feature(box_syntax, core_intrinsics, generic_assert, generic_assert_internals)]
8
9 macro_rules! test {
10 (
11 let mut $elem_ident:ident = $elem_expr:expr;
12 [ $($assert:tt)* ] => $msg:literal
13 ) => {
14 {
15 #[allow(unused_assignments, unused_mut, unused_variables)]
16 let rslt = std::panic::catch_unwind(|| {
17 let mut $elem_ident = $elem_expr;
18 assert!($($assert)*);
19 });
20 let err = rslt.unwrap_err();
21 if let Some(elem) = err.downcast_ref::<String>() {
22 assert_eq!(elem, &$msg);
23 }
24 else if let Some(elem) = err.downcast_ref::<&str>() {
25 assert_eq!(elem, &$msg);
26 }
27 else {
28 panic!("assert!( ... ) should return a string");
29 }
30 }
31 }
32 }
33
34 macro_rules! tests {
35 (
36 let mut $elem_ident:ident = $elem_expr:expr;
37
38 $(
39 [ $($elem_assert:tt)* ] => $elem_msg:literal
40 )+
41 ) => {
42 $(
43 test!(
44 let mut $elem_ident = $elem_expr;
45 [ $($elem_assert)* ] => $elem_msg
46 );
47 )+
48 }
49 }
50
51 const FOO: Foo = Foo { bar: 1 };
52
53 #[derive(Clone, Copy, Debug, PartialEq)]
54 struct Foo {
55 bar: i32
56 }
57
58 impl Foo {
59 fn add(&self, a: i32, b: i32) -> i32 { a + b }
60 }
61
62 fn add(a: i32, b: i32) -> i32 { a + b }
63
64 fn main() {
65 // ***** Allowed *****
66
67 tests!(
68 let mut elem = 1i32;
69
70 // addr of
71 [ &elem == &3 ] => "Assertion failed: &elem == &3\nWith captures:\n elem = 1\n"
72
73 // array
74 [ [elem][0] == 3 ] => "Assertion failed: [elem][0] == 3\nWith captures:\n elem = 1\n"
75
76 // binary
77 [ elem + 1 == 3 ] => "Assertion failed: elem + 1 == 3\nWith captures:\n elem = 1\n"
78
79 // call
80 [ add(elem, elem) == 3 ] => "Assertion failed: add(elem, elem) == 3\nWith captures:\n elem = 1\n"
81
82 // cast
83 [ elem as i32 == 3 ] => "Assertion failed: elem as i32 == 3\nWith captures:\n elem = 1\n"
84
85 // index
86 [ [1i32, 1][elem as usize] == 3 ] => "Assertion failed: [1i32, 1][elem as usize] == 3\nWith captures:\n elem = 1\n"
87
88 // method call
89 [ FOO.add(elem, elem) == 3 ] => "Assertion failed: FOO.add(elem, elem) == 3\nWith captures:\n elem = 1\n"
90
91 // paren
92 [ (elem) == 3 ] => "Assertion failed: (elem) == 3\nWith captures:\n elem = 1\n"
93
94 // range
95 [ (0..elem) == (0..3) ] => "Assertion failed: (0..elem) == (0..3)\nWith captures:\n elem = 1\n"
96
97 // repeat
98 [ [elem; 1] == [3; 1] ] => "Assertion failed: [elem; 1] == [3; 1]\nWith captures:\n elem = 1\n"
99
100 // struct
101 [ Foo { bar: elem } == Foo { bar: 3 } ] => "Assertion failed: Foo { bar: elem } == Foo { bar: 3 }\nWith captures:\n elem = 1\n"
102
103 // tuple
104 [ (elem, 1) == (3, 3) ] => "Assertion failed: (elem, 1) == (3, 3)\nWith captures:\n elem = 1\n"
105
106 // unary
107 [ -elem == -3 ] => "Assertion failed: -elem == -3\nWith captures:\n elem = 1\n"
108 );
109
110 // ***** Disallowed *****
111
112 tests!(
113 let mut elem = 1i32;
114
115 // assign
116 [ { let local = elem; local } == 3 ] => "Assertion failed: { let local = elem; local } == 3"
117
118 // assign op
119 [ { elem += 1; elem } == 3 ] => "Assertion failed: { elem += 1; elem } == 3"
120
121 // async
122 [ { let _ = async { elem }; elem } == 3 ] => "Assertion failed: { let _ = async { elem }; elem } == 3"
123
124 // await
125
126 // block
127 [ { elem } == 3 ] => "Assertion failed: { elem } == 3"
128
129 // box
130 [ box elem == box 3 ] => "Assertion failed: box elem == box 3"
131
132 // break
133 [ loop { break elem; } == 3 ] => "Assertion failed: loop { break elem; } == 3"
134
135 // closure
136 [(|| elem)() == 3 ] => "Assertion failed: (|| elem)() == 3"
137
138 // const block
139
140 // continue
141
142 // err
143
144 // field
145 [ FOO.bar == 3 ] => "Assertion failed: FOO.bar == 3"
146
147 // for loop
148 [ { for _ in 0..elem { elem; } elem } == 3 ] => "Assertion failed: { for _ in 0..elem { elem; } elem } == 3"
149
150 // if
151 [ if true { elem } else { elem } == 3 ] => "Assertion failed: if true { elem } else { elem } == 3"
152
153 // inline asm
154
155 // let
156 [ if let true = true { elem } else { elem } == 3 ] => "Assertion failed: if let true = true { elem } else { elem } == 3"
157
158 // lit
159
160 // loop
161 [ loop { elem; break elem; } == 3 ] => "Assertion failed: loop { elem; break elem; } == 3"
162
163 // mac call
164
165 // match
166 [ match elem { _ => elem } == 3 ] => "Assertion failed: match elem { _ => elem, } == 3"
167
168 // ret
169 [ (|| { return elem; })() == 3 ] => "Assertion failed: (|| { return elem; })() == 3"
170
171 // try
172 [ (|| { Some(Some(elem)?) })() == Some(3) ] => "Assertion failed: (|| { Some(Some(elem)?) })() == Some(3)"
173
174 // try block
175
176 // underscore
177
178 // while
179 [ { while false { elem; break; } elem } == 3 ] => "Assertion failed: { while false { elem; break; } elem } == 3"
180
181 // yeet
182
183 // yield
184 );
185 }