Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e6b85ab

Browse files
authoredMay 26, 2023
Rollup merge of rust-lang#111928 - c410-f3r:dqewdas, r=eholk
[RFC-2011] Expand more expressions cc rust-lang#44838 Expands `if`, `let`, `match` and also makes `generic_assert_internals` an allowed feature when using `assert!`. `#![feature(generic_assert)]` is still needed to activate everything. ```rust #![feature(generic_assert)] fn fun(a: Option<i32>, b: Option<i32>, c: Option<i32>) { assert!( if a.is_some() { 1 } else { 2 } == 3 && if let Some(elem) = b { elem == 4 } else { false } && match c { Some(_) => true, None => false } ); } fn main() { fun(Some(1), None, Some(2)); } // Assertion failed: assert!( // if a.is_some() { 1 } else { 2 } == 3 // && if let Some(elem) = b { elem == 4 } else { false } // && match c { Some(_) => true, None => false } // ); // // With captures: // a = Some(1) // b = None // c = Some(2) ```
2 parents 05f1b00 + 462a96c commit e6b85ab

9 files changed

+29
-86
lines changed
 

‎compiler/rustc_builtin_macros/src/assert/context.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,19 @@ impl<'cx, 'a> Context<'cx, 'a> {
233233
ExprKind::Cast(local_expr, _) => {
234234
self.manage_cond_expr(local_expr);
235235
}
236+
ExprKind::If(local_expr, _, _) => {
237+
self.manage_cond_expr(local_expr);
238+
}
236239
ExprKind::Index(prefix, suffix) => {
237240
self.manage_cond_expr(prefix);
238241
self.manage_cond_expr(suffix);
239242
}
243+
ExprKind::Let(_, local_expr, _) => {
244+
self.manage_cond_expr(local_expr);
245+
}
246+
ExprKind::Match(local_expr, _) => {
247+
self.manage_cond_expr(local_expr);
248+
}
240249
ExprKind::MethodCall(call) => {
241250
for arg in &mut call.args {
242251
self.manage_cond_expr(arg);
@@ -295,17 +304,14 @@ impl<'cx, 'a> Context<'cx, 'a> {
295304
| ExprKind::Continue(_)
296305
| ExprKind::Err
297306
| ExprKind::Field(_, _)
298-
| ExprKind::FormatArgs(_)
299307
| ExprKind::ForLoop(_, _, _, _)
300-
| ExprKind::If(_, _, _)
308+
| ExprKind::FormatArgs(_)
301309
| ExprKind::IncludedBytes(..)
302310
| ExprKind::InlineAsm(_)
303-
| ExprKind::OffsetOf(_, _)
304-
| ExprKind::Let(_, _, _)
305311
| ExprKind::Lit(_)
306312
| ExprKind::Loop(_, _, _)
307313
| ExprKind::MacCall(_)
308-
| ExprKind::Match(_, _)
314+
| ExprKind::OffsetOf(_, _)
309315
| ExprKind::Path(_, _)
310316
| ExprKind::Ret(_)
311317
| ExprKind::Try(_)

‎library/core/src/macros/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,7 @@ pub(crate) mod builtin {
14271427
#[rustc_builtin_macro]
14281428
#[macro_export]
14291429
#[rustc_diagnostic_item = "assert_macro"]
1430-
#[allow_internal_unstable(core_panic, edition_panic)]
1430+
#[allow_internal_unstable(core_panic, edition_panic, generic_assert_internals)]
14311431
macro_rules! assert {
14321432
($cond:expr $(,)?) => {{ /* compiler built-in */ }};
14331433
($cond:expr, $($arg:tt)+) => {{ /* compiler built-in */ }};

‎tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs

+11-74
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// needs-unwind Asserting on contents of error message
66

77
#![allow(path_statements, unused_allocation)]
8-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
8+
#![feature(core_intrinsics, generic_assert)]
99

1010
macro_rules! test {
1111
(
@@ -51,6 +51,7 @@ macro_rules! tests {
5151

5252
const FOO: Foo = Foo { bar: 1 };
5353

54+
5455
#[derive(Clone, Copy, Debug, PartialEq)]
5556
struct Foo {
5657
bar: i32
@@ -83,9 +84,18 @@ fn main() {
8384
// cast
8485
[ elem as i32 == 3 ] => "Assertion failed: elem as i32 == 3\nWith captures:\n elem = 1\n"
8586

87+
// if
88+
[ if elem == 3 { true } else { false } ] => "Assertion failed: if elem == 3 { true } else { false }\nWith captures:\n elem = 1\n"
89+
8690
// index
8791
[ [1i32, 1][elem as usize] == 3 ] => "Assertion failed: [1i32, 1][elem as usize] == 3\nWith captures:\n elem = 1\n"
8892

93+
// let
94+
[ if let 3 = elem { true } else { false } ] => "Assertion failed: if let 3 = elem { true } else { false }\nWith captures:\n elem = 1\n"
95+
96+
// match
97+
[ match elem { 3 => true, _ => false, } ] => "Assertion failed: match elem { 3 => true, _ => false, }\nWith captures:\n elem = 1\n"
98+
8999
// method call
90100
[ FOO.add(elem, elem) == 3 ] => "Assertion failed: FOO.add(elem, elem) == 3\nWith captures:\n elem = 1\n"
91101

@@ -107,77 +117,4 @@ fn main() {
107117
// unary
108118
[ -elem == -3 ] => "Assertion failed: -elem == -3\nWith captures:\n elem = 1\n"
109119
);
110-
111-
// ***** Disallowed *****
112-
113-
tests!(
114-
let mut elem = 1i32;
115-
116-
// assign
117-
[ { let local = elem; local } == 3 ] => "Assertion failed: { let local = elem; local } == 3"
118-
119-
// assign op
120-
[ { elem += 1; elem } == 3 ] => "Assertion failed: { elem += 1; elem } == 3"
121-
122-
// async
123-
[ { let _ = async { elem }; elem } == 3 ] => "Assertion failed: { let _ = async { elem }; elem } == 3"
124-
125-
// await
126-
127-
// block
128-
[ { elem } == 3 ] => "Assertion failed: { elem } == 3"
129-
130-
// break
131-
[ loop { break elem; } == 3 ] => "Assertion failed: loop { break elem; } == 3"
132-
133-
// closure
134-
[(|| elem)() == 3 ] => "Assertion failed: (|| elem)() == 3"
135-
136-
// const block
137-
138-
// continue
139-
140-
// err
141-
142-
// field
143-
[ FOO.bar == 3 ] => "Assertion failed: FOO.bar == 3"
144-
145-
// for loop
146-
[ { for _ in 0..elem { elem; } elem } == 3 ] => "Assertion failed: { for _ in 0..elem { elem; } elem } == 3"
147-
148-
// if
149-
[ if true { elem } else { elem } == 3 ] => "Assertion failed: if true { elem } else { elem } == 3"
150-
151-
// inline asm
152-
153-
// let
154-
[ if let true = true { elem } else { elem } == 3 ] => "Assertion failed: if let true = true { elem } else { elem } == 3"
155-
156-
// lit
157-
158-
// loop
159-
[ loop { elem; break elem; } == 3 ] => "Assertion failed: loop { elem; break elem; } == 3"
160-
161-
// mac call
162-
163-
// match
164-
[ match elem { _ => elem } == 3 ] => "Assertion failed: (match elem { _ => elem, }) == 3"
165-
166-
// ret
167-
[ (|| { return elem; })() == 3 ] => "Assertion failed: (|| { return elem; })() == 3"
168-
169-
// try
170-
[ (|| { Some(Some(elem)?) })() == Some(3) ] => "Assertion failed: (|| { Some(Some(elem)?) })() == Some(3)"
171-
172-
// try block
173-
174-
// underscore
175-
176-
// while
177-
[ { while false { elem; break; } elem } == 3 ] => "Assertion failed: { while false { elem; break; } elem } == 3"
178-
179-
// yeet
180-
181-
// yield
182-
);
183120
}

‎tests/ui/macros/rfc-2011-nicer-assert-messages/all-not-available-cases.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// run-pass
55
// needs-unwind Asserting on contents of error message
66

7-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
7+
#![feature(core_intrinsics, generic_assert)]
88

99
extern crate common;
1010

‎tests/ui/macros/rfc-2011-nicer-assert-messages/assert-with-custom-errors-does-not-create-unnecessary-code.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// compile-flags: --test
22
// run-pass
33

4-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
4+
#![feature(core_intrinsics, generic_assert)]
55

66
#[should_panic(expected = "Custom user message")]
77
#[test]

‎tests/ui/macros/rfc-2011-nicer-assert-messages/assert-without-captures-does-not-create-unnecessary-code.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// run-pass
44
// needs-unwind Asserting on contents of error message
55

6-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
6+
#![feature(core_intrinsics, generic_assert)]
77

88
extern crate common;
99

‎tests/ui/macros/rfc-2011-nicer-assert-messages/feature-gate-generic_assert.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// ignore-tidy-linelength
33
// run-pass
44

5-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
5+
#![feature(core_intrinsics, generic_assert)]
66

77
use std::fmt::{Debug, Formatter};
88

‎tests/ui/macros/rfc-2011-nicer-assert-messages/non-consuming-methods-have-optimized-codegen.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// check-pass
22
// compile-flags: -Z unpretty=expanded
33

4-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
4+
#![feature(core_intrinsics, generic_assert)]
55

66
fn arbitrary_consuming_method_for_demonstration_purposes() {
77
let elem = 1i32;

‎tests/ui/macros/rfc-2011-nicer-assert-messages/non-consuming-methods-have-optimized-codegen.stdout

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// check-pass
44
// compile-flags: -Z unpretty=expanded
55

6-
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
6+
#![feature(core_intrinsics, generic_assert)]
77
#[prelude_import]
88
use ::std::prelude::rust_2015::*;
99
#[macro_use]

0 commit comments

Comments
 (0)
Please sign in to comment.