diff options
| author | Alex Burka <aburka@seas.upenn.edu> | 2016-03-03 11:45:58 -0500 |
|---|---|---|
| committer | Alex Burka <aburka@seas.upenn.edu> | 2016-03-14 16:47:04 -0400 |
| commit | a09a41928ff9a9188453013d3c8efce19626e08d (patch) | |
| tree | 42f0b64d730000e996c24840f9212a0d17d564dc /src/libsyntax_ext | |
| parent | c433b703ead56ec4dd05b5f3ad39301d27e19953 (diff) | |
| download | rust-a09a41928ff9a9188453013d3c8efce19626e08d.tar.gz rust-a09a41928ff9a9188453013d3c8efce19626e08d.zip | |
derive: emit intrinsics::unreachable for impls on empty enums
fixes #31574
Diffstat (limited to 'src/libsyntax_ext')
| -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 c0237a5d29a..3896a7ce714 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, @@ -1297,16 +1313,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 @@ -1382,7 +1389,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 { |
