Skip to content

Commit

Permalink
Remove unnecessary unsafe block around calls to discriminant_value
Browse files Browse the repository at this point in the history
Since 63793 the discriminant_value intrinsic is safe to call. Remove
unnecessary unsafe block around calls to this intrinsic in built-in
derive macros.
  • Loading branch information
tmiasko committed Oct 11, 2020
1 parent c38f001 commit 50da126
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 15 deletions.
22 changes: 8 additions & 14 deletions compiler/rustc_builtin_macros/src/deriving/generic/mod.rs
Expand Up @@ -1137,12 +1137,9 @@ impl<'a> MethodDef<'a> {
/// for each of the self-args, carried in precomputed variables.

/// ```{.text}
/// let __self0_vi = unsafe {
/// std::intrinsics::discriminant_value(&self) };
/// let __self1_vi = unsafe {
/// std::intrinsics::discriminant_value(&arg1) };
/// let __self2_vi = unsafe {
/// std::intrinsics::discriminant_value(&arg2) };
/// let __self0_vi = std::intrinsics::discriminant_value(&self);
/// let __self1_vi = std::intrinsics::discriminant_value(&arg1);
/// let __self2_vi = std::intrinsics::discriminant_value(&arg2);
///
/// if __self0_vi == __self1_vi && __self0_vi == __self2_vi && ... {
/// match (...) {
Expand Down Expand Up @@ -1325,7 +1322,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
Some(deriving::call_intrinsic(cx, sp, sym::unreachable, vec![]))
Some(deriving::call_unreachable(cx, sp))
}
_ => None,
};
Expand Down Expand Up @@ -1356,12 +1353,9 @@ impl<'a> MethodDef<'a> {
// with three Self args, builds three statements:
//
// ```
// let __self0_vi = unsafe {
// std::intrinsics::discriminant_value(&self) };
// let __self1_vi = unsafe {
// std::intrinsics::discriminant_value(&arg1) };
// let __self2_vi = unsafe {
// std::intrinsics::discriminant_value(&arg2) };
// let __self0_vi = std::intrinsics::discriminant_value(&self);
// let __self1_vi = std::intrinsics::discriminant_value(&arg1);
// let __self2_vi = std::intrinsics::discriminant_value(&arg2);
// ```
let mut index_let_stmts: Vec<ast::Stmt> = Vec::with_capacity(vi_idents.len() + 1);

Expand Down Expand Up @@ -1474,7 +1468,7 @@ impl<'a> MethodDef<'a> {
// derive Debug on such a type could here generate code
// that needs the feature gate enabled.)

deriving::call_intrinsic(cx, sp, sym::unreachable, vec![])
deriving::call_unreachable(cx, sp)
} else {
// Final wrinkle: the self_args are expressions that deref
// down to desired places, but we cannot actually deref
Expand Down
9 changes: 8 additions & 1 deletion compiler/rustc_builtin_macros/src/deriving/mod.rs
Expand Up @@ -68,7 +68,14 @@ fn call_intrinsic(
) -> P<ast::Expr> {
let span = cx.with_def_site_ctxt(span);
let path = cx.std_path(&[sym::intrinsics, intrinsic]);
let call = cx.expr_call_global(span, path, args);
cx.expr_call_global(span, path, args)
}

/// Constructs an expression that calls the `unreachable` intrinsic.
fn call_unreachable(cx: &ExtCtxt<'_>, span: Span) -> P<ast::Expr> {
let span = cx.with_def_site_ctxt(span);
let path = cx.std_path(&[sym::intrinsics, sym::unreachable]);
let call = cx.expr_call_global(span, path, vec![]);

cx.expr_block(P(ast::Block {
stmts: vec![cx.stmt_expr(call)],
Expand Down

0 comments on commit 50da126

Please sign in to comment.