1
1
use rustc_errors:: { Applicability , DiagnosticBuilder } ;
2
2
3
3
use rustc_ast:: ptr:: P ;
4
- use rustc_ast:: token:: { self , TokenKind } ;
5
- use rustc_ast:: tokenstream:: { DelimSpan , TokenStream , TokenTree } ;
4
+ use rustc_ast:: token;
5
+ use rustc_ast:: tokenstream:: { DelimSpan , TokenStream } ;
6
6
use rustc_ast:: { self as ast, * } ;
7
7
use rustc_ast_pretty:: pprust;
8
8
use rustc_expand:: base:: * ;
@@ -26,31 +26,41 @@ pub fn expand_assert<'cx>(
26
26
// `core::panic` and `std::panic` are different macros, so we use call-site
27
27
// context to pick up whichever is currently in scope.
28
28
let sp = cx. with_call_site_ctxt ( sp) ;
29
- let tokens = custom_message. unwrap_or_else ( || {
30
- TokenStream :: from ( TokenTree :: token (
31
- TokenKind :: lit (
32
- token:: Str ,
33
- Symbol :: intern ( & format ! (
34
- "assertion failed: {}" ,
35
- pprust:: expr_to_string( & cond_expr) . escape_debug( )
36
- ) ) ,
37
- None ,
38
- ) ,
39
- DUMMY_SP ,
40
- ) )
41
- } ) ;
42
- let args = P ( MacArgs :: Delimited ( DelimSpan :: from_single ( sp) , MacDelimiter :: Parenthesis , tokens) ) ;
43
- let panic_call = MacCall {
44
- path : Path :: from_ident ( Ident :: new ( sym:: panic, sp) ) ,
45
- args,
46
- prior_type_ascription : None ,
29
+
30
+ let panic_call = {
31
+ if let Some ( tokens) = custom_message {
32
+ // Pass the custom message to panic!().
33
+ cx. expr (
34
+ sp,
35
+ ExprKind :: MacCall ( MacCall {
36
+ path : Path :: from_ident ( Ident :: new ( sym:: panic, sp) ) ,
37
+ args : P ( MacArgs :: Delimited (
38
+ DelimSpan :: from_single ( sp) ,
39
+ MacDelimiter :: Parenthesis ,
40
+ tokens,
41
+ ) ) ,
42
+ prior_type_ascription : None ,
43
+ } ) ,
44
+ )
45
+ } else {
46
+ // Pass our own message directly to $crate::panicking::panic(),
47
+ // because it might contain `{` and `}` that should always be
48
+ // passed literally.
49
+ cx. expr_call_global (
50
+ sp,
51
+ cx. std_path ( & [ sym:: panicking, sym:: panic] ) ,
52
+ vec ! [ cx. expr_str(
53
+ DUMMY_SP ,
54
+ Symbol :: intern( & format!(
55
+ "assertion failed: {}" ,
56
+ pprust:: expr_to_string( & cond_expr) . escape_debug( )
57
+ ) ) ,
58
+ ) ] ,
59
+ )
60
+ }
47
61
} ;
48
- let if_expr = cx. expr_if (
49
- sp,
50
- cx. expr ( sp, ExprKind :: Unary ( UnOp :: Not , cond_expr) ) ,
51
- cx. expr ( sp, ExprKind :: MacCall ( panic_call) ) ,
52
- None ,
53
- ) ;
62
+ let if_expr =
63
+ cx. expr_if ( sp, cx. expr ( sp, ExprKind :: Unary ( UnOp :: Not , cond_expr) ) , panic_call, None ) ;
54
64
MacEager :: expr ( if_expr)
55
65
}
56
66
0 commit comments