diff options
| author | bors <bors@rust-lang.org> | 2016-03-15 06:51:30 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-15 06:51:30 -0700 |
| commit | f9121e87a662568d42cc481f87d81ed4df38cc0d (patch) | |
| tree | 2944cd21fb6c26ad15849ed2360457449967a377 /src/libsyntax_ext/deriving | |
| parent | 483fc715c6ea7cdd15d41d79df9def97401cd699 (diff) | |
| parent | a09a41928ff9a9188453013d3c8efce19626e08d (diff) | |
| download | rust-f9121e87a662568d42cc481f87d81ed4df38cc0d.tar.gz rust-f9121e87a662568d42cc481f87d81ed4df38cc0d.zip | |
Auto merge of #32250 - durka:derive-31574, r=alexcrichton
derive: use intrinsics::unreachable over unreachable!() derive: use intrinsics::unreachable over unreachable!() Fixes #31574. Spawned from #32139. r? @alexcrichton
Diffstat (limited to 'src/libsyntax_ext/deriving')
| -rw-r--r-- | src/libsyntax_ext/deriving/generic/mod.rs | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/libsyntax_ext/deriving/generic/mod.rs b/src/libsyntax_ext/deriving/generic/mod.rs index 937055fcfa6..84bd9f43102 100644 --- a/src/libsyntax_ext/deriving/generic/mod.rs +++ b/src/libsyntax_ext/deriving/generic/mod.rs @@ -381,6 +381,22 @@ fn find_type_parameters(ty: &ast::Ty, ty_param_names: &[ast::Name]) -> Vec<P<ast visitor.types } +/// Replacement for expr_unreachable which generates intrinsics::unreachable() +/// instead of unreachable!() +fn expr_unreachable_intrinsic(cx: &ExtCtxt, sp: Span) -> P<Expr> { + let path = cx.std_path(&["intrinsics", "unreachable"]); + let call = cx.expr_call_global( + sp, path, vec![]); + let unreachable = cx.expr_block(P(ast::Block { + stmts: vec![], + expr: Some(call), + id: ast::DUMMY_NODE_ID, + rules: ast::BlockCheckMode::Unsafe(ast::CompilerGenerated), + span: sp })); + + unreachable +} + impl<'a> TraitDef<'a> { pub fn expand(&self, cx: &mut ExtCtxt, @@ -1299,16 +1315,7 @@ impl<'a> MethodDef<'a> { //Since we know that all the arguments will match if we reach the match expression we //add the unreachable intrinsics as the result of the catch all which should help llvm //in optimizing it - let path = cx.std_path(&["intrinsics", "unreachable"]); - let call = cx.expr_call_global( - sp, path, vec![]); - let unreachable = cx.expr_block(P(ast::Block { - stmts: vec![], - expr: Some(call), - id: ast::DUMMY_NODE_ID, - rules: ast::BlockCheckMode::Unsafe(ast::CompilerGenerated), - span: sp })); - match_arms.push(cx.arm(sp, vec![cx.pat_wild(sp)], unreachable)); + match_arms.push(cx.arm(sp, vec![cx.pat_wild(sp)], expr_unreachable_intrinsic(cx, sp))); // Final wrinkle: the self_args are expressions that deref // down to desired l-values, but we cannot actually deref @@ -1384,7 +1391,7 @@ impl<'a> MethodDef<'a> { // derive Debug on such a type could here generate code // that needs the feature gate enabled.) - cx.expr_unreachable(sp) + expr_unreachable_intrinsic(cx, sp) } else { |
