@@ -209,6 +209,8 @@ use syntax::ptr::P;
209
209
210
210
use self :: ty:: { LifetimeBounds , Path , Ptr , PtrTy , Self_ , Ty } ;
211
211
212
+ use deriving;
213
+
212
214
pub mod ty;
213
215
214
216
pub struct TraitDef < ' a > {
@@ -381,22 +383,6 @@ fn find_type_parameters(ty: &ast::Ty, ty_param_names: &[ast::Name]) -> Vec<P<ast
381
383
visitor. types
382
384
}
383
385
384
- /// Replacement for expr_unreachable which generates intrinsics::unreachable()
385
- /// instead of unreachable!()
386
- fn expr_unreachable_intrinsic ( cx : & ExtCtxt , sp : Span ) -> P < Expr > {
387
- let path = cx. std_path ( & [ "intrinsics" , "unreachable" ] ) ;
388
- let call = cx. expr_call_global (
389
- sp, path, vec ! [ ] ) ;
390
- let unreachable = cx. expr_block ( P ( ast:: Block {
391
- stmts : vec ! [ ] ,
392
- expr : Some ( call) ,
393
- id : ast:: DUMMY_NODE_ID ,
394
- rules : ast:: BlockCheckMode :: Unsafe ( ast:: CompilerGenerated ) ,
395
- span : sp } ) ) ;
396
-
397
- unreachable
398
- }
399
-
400
386
impl < ' a > TraitDef < ' a > {
401
387
pub fn expand ( & self ,
402
388
cx : & mut ExtCtxt ,
@@ -1277,15 +1263,11 @@ impl<'a> MethodDef<'a> {
1277
1263
1278
1264
let mut first_ident = None ;
1279
1265
for ( & ident, self_arg) in vi_idents. iter ( ) . zip ( & self_args) {
1280
- let path = cx. std_path ( & [ "intrinsics" , "discriminant_value" ] ) ;
1281
- let call = cx. expr_call_global (
1282
- sp, path, vec ! [ cx. expr_addr_of( sp, self_arg. clone( ) ) ] ) ;
1283
- let variant_value = cx. expr_block ( P ( ast:: Block {
1284
- stmts : vec ! [ ] ,
1285
- expr : Some ( call) ,
1286
- id : ast:: DUMMY_NODE_ID ,
1287
- rules : ast:: BlockCheckMode :: Unsafe ( ast:: CompilerGenerated ) ,
1288
- span : sp } ) ) ;
1266
+ let self_addr = cx. expr_addr_of ( sp, self_arg. clone ( ) ) ;
1267
+ let variant_value = deriving:: call_intrinsic ( cx,
1268
+ sp,
1269
+ "discriminant_value" ,
1270
+ vec ! [ self_addr] ) ;
1289
1271
1290
1272
let target_ty = cx. ty_ident ( sp, cx. ident_of ( target_type_name) ) ;
1291
1273
let variant_disr = cx. expr_cast ( sp, variant_value, target_ty) ;
@@ -1313,7 +1295,9 @@ impl<'a> MethodDef<'a> {
1313
1295
//Since we know that all the arguments will match if we reach the match expression we
1314
1296
//add the unreachable intrinsics as the result of the catch all which should help llvm
1315
1297
//in optimizing it
1316
- match_arms. push ( cx. arm ( sp, vec ! [ cx. pat_wild( sp) ] , expr_unreachable_intrinsic ( cx, sp) ) ) ;
1298
+ match_arms. push ( cx. arm ( sp,
1299
+ vec ! [ cx. pat_wild( sp) ] ,
1300
+ deriving:: call_intrinsic ( cx, sp, "unreachable" , vec ! [ ] ) ) ) ;
1317
1301
1318
1302
// Final wrinkle: the self_args are expressions that deref
1319
1303
// down to desired l-values, but we cannot actually deref
@@ -1389,7 +1373,7 @@ impl<'a> MethodDef<'a> {
1389
1373
// derive Debug on such a type could here generate code
1390
1374
// that needs the feature gate enabled.)
1391
1375
1392
- expr_unreachable_intrinsic ( cx, sp)
1376
+ deriving :: call_intrinsic ( cx, sp, "unreachable" , vec ! [ ] )
1393
1377
}
1394
1378
else {
1395
1379
0 commit comments