@@ -25,6 +25,7 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
25
25
Some ( e) => e,
26
26
} ;
27
27
let mut bytes = Vec :: new ( ) ;
28
+ let mut err = false ;
28
29
29
30
for expr in exprs. iter ( ) {
30
31
match expr. node {
@@ -40,7 +41,8 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
40
41
// u8 literal, push to vector expression
41
42
ast:: LitUint ( v, ast:: TyU8 ) => {
42
43
if v > 0xFF {
43
- cx. span_err ( expr. span , "too large u8 literal in bytes!" )
44
+ cx. span_err ( expr. span , "too large u8 literal in bytes!" ) ;
45
+ err = true ;
44
46
} else {
45
47
bytes. push ( cx. expr_u8 ( expr. span , v as u8 ) ) ;
46
48
}
@@ -49,9 +51,11 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
49
51
// integer literal, push to vector expression
50
52
ast:: LitIntUnsuffixed ( v) => {
51
53
if v > 0xFF {
52
- cx. span_err ( expr. span , "too large integer literal in bytes!" )
54
+ cx. span_err ( expr. span , "too large integer literal in bytes!" ) ;
55
+ err = true ;
53
56
} else if v < 0 {
54
- cx. span_err ( expr. span , "negative integer literal in bytes!" )
57
+ cx. span_err ( expr. span , "negative integer literal in bytes!" ) ;
58
+ err = true ;
55
59
} else {
56
60
bytes. push ( cx. expr_u8 ( expr. span , v as u8 ) ) ;
57
61
}
@@ -62,17 +66,34 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
62
66
if v. is_ascii ( ) {
63
67
bytes. push ( cx. expr_u8 ( expr. span , v as u8 ) ) ;
64
68
} else {
65
- cx. span_err ( expr. span , "non-ascii char literal in bytes!" )
69
+ cx. span_err ( expr. span , "non-ascii char literal in bytes!" ) ;
70
+ err = true ;
66
71
}
67
72
}
68
73
69
- _ => cx. span_err ( expr. span , "unsupported literal in bytes!" )
74
+ _ => {
75
+ cx. span_err ( expr. span , "unsupported literal in bytes!" ) ;
76
+ err = true ;
77
+ }
70
78
} ,
71
79
72
- _ => cx. span_err ( expr. span , "non-literal in bytes!" )
80
+ _ => {
81
+ cx. span_err ( expr. span , "non-literal in bytes!" ) ;
82
+ err = true ;
83
+ }
73
84
}
74
85
}
75
86
87
+ // For some reason using quote_expr!() here aborts if we threw an error.
88
+ // I'm assuming that the end of the recursive parse tricks the compiler
89
+ // into thinking this is a good time to stop. But we'd rather keep going.
90
+ if err {
91
+ // Since the compiler will stop after the macro expansion phase anyway, we
92
+ // don't need type info, so we can just return a DummyResult
93
+ return DummyResult :: expr ( sp) ;
94
+ }
95
+
76
96
let e = cx. expr_vec_slice ( sp, bytes) ;
97
+ let e = quote_expr ! ( cx, { static BYTES : & ' static [ u8 ] = $e; BYTES } ) ;
77
98
MacExpr :: new ( e)
78
99
}
0 commit comments