File tree 3 files changed +46
-2
lines changed
3 files changed +46
-2
lines changed Original file line number Diff line number Diff line change @@ -118,6 +118,20 @@ impl Annotatable {
118
118
}
119
119
}
120
120
121
+ pub fn expect_stmt ( self ) -> ast:: Stmt {
122
+ match self {
123
+ Annotatable :: Stmt ( stmt) => stmt. into_inner ( ) ,
124
+ _ => panic ! ( "expected statement" ) ,
125
+ }
126
+ }
127
+
128
+ pub fn expect_expr ( self ) -> P < ast:: Expr > {
129
+ match self {
130
+ Annotatable :: Expr ( expr) => expr,
131
+ _ => panic ! ( "expected expression" ) ,
132
+ }
133
+ }
134
+
121
135
pub fn derive_allowed ( & self ) -> bool {
122
136
match * self {
123
137
Annotatable :: Item ( ref item) => match item. node {
Original file line number Diff line number Diff line change @@ -143,7 +143,7 @@ impl ExpansionKind {
143
143
}
144
144
145
145
fn expect_from_annotatables < I : IntoIterator < Item = Annotatable > > ( self , items : I ) -> Expansion {
146
- let items = items. into_iter ( ) ;
146
+ let mut items = items. into_iter ( ) ;
147
147
match self {
148
148
ExpansionKind :: Items =>
149
149
Expansion :: Items ( items. map ( Annotatable :: expect_item) . collect ( ) ) ,
@@ -153,7 +153,14 @@ impl ExpansionKind {
153
153
Expansion :: TraitItems ( items. map ( Annotatable :: expect_trait_item) . collect ( ) ) ,
154
154
ExpansionKind :: ForeignItems =>
155
155
Expansion :: ForeignItems ( items. map ( Annotatable :: expect_foreign_item) . collect ( ) ) ,
156
- _ => unreachable ! ( ) ,
156
+ ExpansionKind :: Stmts => Expansion :: Stmts ( items. map ( Annotatable :: expect_stmt) . collect ( ) ) ,
157
+ ExpansionKind :: Expr => Expansion :: Expr (
158
+ items. next ( ) . expect ( "expected exactly one expression" ) . expect_expr ( )
159
+ ) ,
160
+ ExpansionKind :: OptExpr =>
161
+ Expansion :: OptExpr ( items. next ( ) . map ( Annotatable :: expect_expr) ) ,
162
+ ExpansionKind :: Pat | ExpansionKind :: Ty =>
163
+ panic ! ( "patterns and types aren't annotatable" ) ,
157
164
}
158
165
}
159
166
}
Original file line number Diff line number Diff line change
1
+ // Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+ #![ feature( stmt_expr_attributes) ]
11
+
12
+ fn main ( ) {
13
+ #[ derive( Debug ) ] //~ ERROR `derive`
14
+ println ! ( "Hello, world!" ) ;
15
+
16
+ let _ = #[ derive ( Debug ) ] "Hello, world!" ;
17
+ //~^ ERROR `derive`
18
+
19
+ let _ = [
20
+ #[ derive( Debug ) ] //~ ERROR `derive`
21
+ "Hello, world!"
22
+ ] ;
23
+ }
You can’t perform that action at this time.
0 commit comments