Skip to content

Commit 00207ea

Browse files
committed
Improve derived discriminant testing.
Currently the generated code for methods like `eq`, `ne`, and `partial_cmp` includes stuff like this: ``` let __self_vi = ::core::intrinsics::discriminant_value(&*self); let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other); if true && __self_vi == __arg_1_vi { ... } ``` This commit removes the unnecessary `true &&`, and makes the generating code a little easier to read in the process. It also fixes some errors in comments.
1 parent ea74997 commit 00207ea

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

compiler/rustc_builtin_macros/src/deriving/generic/mod.rs

+16-21
Original file line numberDiff line numberDiff line change
@@ -1392,37 +1392,32 @@ impl<'a> MethodDef<'a> {
13921392
//
13931393
// i.e., for `enum E<T> { A, B(1), C(T, T) }`, and a deriving
13941394
// with three Self args, builds three statements:
1395-
//
13961395
// ```
1397-
// let __self0_vi = std::intrinsics::discriminant_value(&self);
1398-
// let __self1_vi = std::intrinsics::discriminant_value(&arg1);
1399-
// let __self2_vi = std::intrinsics::discriminant_value(&arg2);
1396+
// let __self_vi = std::intrinsics::discriminant_value(&self);
1397+
// let __arg_1_vi = std::intrinsics::discriminant_value(&arg1);
1398+
// let __arg_2_vi = std::intrinsics::discriminant_value(&arg2);
14001399
// ```
14011400
let mut index_let_stmts: Vec<ast::Stmt> = Vec::with_capacity(vi_idents.len() + 1);
14021401

1403-
// We also build an expression which checks whether all discriminants are equal
1404-
// discriminant_test = __self0_vi == __self1_vi && __self0_vi == __self2_vi && ...
1402+
// We also build an expression which checks whether all discriminants are equal:
1403+
// `__self_vi == __arg_1_vi && __self_vi == __arg_2_vi && ...`
14051404
let mut discriminant_test = cx.expr_bool(span, true);
1406-
1407-
let mut first_ident = None;
1408-
for (&ident, self_arg) in iter::zip(&vi_idents, &self_args) {
1405+
for (i, (&ident, self_arg)) in iter::zip(&vi_idents, &self_args).enumerate() {
14091406
let self_addr = cx.expr_addr_of(span, self_arg.clone());
14101407
let variant_value =
14111408
deriving::call_intrinsic(cx, span, sym::discriminant_value, vec![self_addr]);
14121409
let let_stmt = cx.stmt_let(span, false, ident, variant_value);
14131410
index_let_stmts.push(let_stmt);
14141411

1415-
match first_ident {
1416-
Some(first) => {
1417-
let first_expr = cx.expr_ident(span, first);
1418-
let id = cx.expr_ident(span, ident);
1419-
let test = cx.expr_binary(span, BinOpKind::Eq, first_expr, id);
1420-
discriminant_test =
1421-
cx.expr_binary(span, BinOpKind::And, discriminant_test, test)
1422-
}
1423-
None => {
1424-
first_ident = Some(ident);
1425-
}
1412+
if i > 0 {
1413+
let id0 = cx.expr_ident(span, vi_idents[0]);
1414+
let id = cx.expr_ident(span, ident);
1415+
let test = cx.expr_binary(span, BinOpKind::Eq, id0, id);
1416+
discriminant_test = if i == 1 {
1417+
test
1418+
} else {
1419+
cx.expr_binary(span, BinOpKind::And, discriminant_test, test)
1420+
};
14261421
}
14271422
}
14281423

@@ -1453,7 +1448,7 @@ impl<'a> MethodDef<'a> {
14531448
// }
14541449
// }
14551450
// else {
1456-
// <delegated expression referring to __self0_vi, et al.>
1451+
// <delegated expression referring to __self_vi, et al.>
14571452
// }
14581453
let all_match = cx.expr_match(span, match_arg, match_arms);
14591454
let arm_expr = cx.expr_if(span, discriminant_test, all_match, Some(arm_expr));

src/test/ui/deriving/deriving-all-codegen.stdout

+11-11
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ impl ::core::cmp::PartialEq for Fieldless {
648648
{
649649
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
650650
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
651-
if true && __self_vi == __arg_1_vi {
651+
if __self_vi == __arg_1_vi {
652652
match (&*self, &*other) { _ => true, }
653653
} else { false }
654654
}
@@ -672,7 +672,7 @@ impl ::core::cmp::PartialOrd for Fieldless {
672672
{
673673
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
674674
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
675-
if true && __self_vi == __arg_1_vi {
675+
if __self_vi == __arg_1_vi {
676676
match (&*self, &*other) {
677677
_ =>
678678
::core::option::Option::Some(::core::cmp::Ordering::Equal),
@@ -692,7 +692,7 @@ impl ::core::cmp::Ord for Fieldless {
692692
{
693693
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
694694
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
695-
if true && __self_vi == __arg_1_vi {
695+
if __self_vi == __arg_1_vi {
696696
match (&*self, &*other) {
697697
_ => ::core::cmp::Ordering::Equal,
698698
}
@@ -783,7 +783,7 @@ impl ::core::cmp::PartialEq for Mixed {
783783
{
784784
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
785785
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
786-
if true && __self_vi == __arg_1_vi {
786+
if __self_vi == __arg_1_vi {
787787
match (&*self, &*other) {
788788
(&Mixed::R(ref __self_0), &Mixed::R(ref __arg_1_0)) =>
789789
(*__self_0) == (*__arg_1_0),
@@ -800,7 +800,7 @@ impl ::core::cmp::PartialEq for Mixed {
800800
{
801801
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
802802
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
803-
if true && __self_vi == __arg_1_vi {
803+
if __self_vi == __arg_1_vi {
804804
match (&*self, &*other) {
805805
(&Mixed::R(ref __self_0), &Mixed::R(ref __arg_1_0)) =>
806806
(*__self_0) != (*__arg_1_0),
@@ -837,7 +837,7 @@ impl ::core::cmp::PartialOrd for Mixed {
837837
{
838838
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
839839
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
840-
if true && __self_vi == __arg_1_vi {
840+
if __self_vi == __arg_1_vi {
841841
match (&*self, &*other) {
842842
(&Mixed::R(ref __self_0), &Mixed::R(ref __arg_1_0)) =>
843843
match ::core::cmp::PartialOrd::partial_cmp(&(*__self_0),
@@ -880,7 +880,7 @@ impl ::core::cmp::Ord for Mixed {
880880
{
881881
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
882882
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
883-
if true && __self_vi == __arg_1_vi {
883+
if __self_vi == __arg_1_vi {
884884
match (&*self, &*other) {
885885
(&Mixed::R(ref __self_0), &Mixed::R(ref __arg_1_0)) =>
886886
match ::core::cmp::Ord::cmp(&(*__self_0), &(*__arg_1_0)) {
@@ -973,7 +973,7 @@ impl ::core::cmp::PartialEq for Fielded {
973973
{
974974
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
975975
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
976-
if true && __self_vi == __arg_1_vi {
976+
if __self_vi == __arg_1_vi {
977977
match (&*self, &*other) {
978978
(&Fielded::X(ref __self_0), &Fielded::X(ref __arg_1_0)) =>
979979
(*__self_0) == (*__arg_1_0),
@@ -991,7 +991,7 @@ impl ::core::cmp::PartialEq for Fielded {
991991
{
992992
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
993993
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
994-
if true && __self_vi == __arg_1_vi {
994+
if __self_vi == __arg_1_vi {
995995
match (&*self, &*other) {
996996
(&Fielded::X(ref __self_0), &Fielded::X(ref __arg_1_0)) =>
997997
(*__self_0) != (*__arg_1_0),
@@ -1029,7 +1029,7 @@ impl ::core::cmp::PartialOrd for Fielded {
10291029
{
10301030
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
10311031
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
1032-
if true && __self_vi == __arg_1_vi {
1032+
if __self_vi == __arg_1_vi {
10331033
match (&*self, &*other) {
10341034
(&Fielded::X(ref __self_0), &Fielded::X(ref __arg_1_0)) =>
10351035
match ::core::cmp::PartialOrd::partial_cmp(&(*__self_0),
@@ -1072,7 +1072,7 @@ impl ::core::cmp::Ord for Fielded {
10721072
{
10731073
let __self_vi = ::core::intrinsics::discriminant_value(&*self);
10741074
let __arg_1_vi = ::core::intrinsics::discriminant_value(&*other);
1075-
if true && __self_vi == __arg_1_vi {
1075+
if __self_vi == __arg_1_vi {
10761076
match (&*self, &*other) {
10771077
(&Fielded::X(ref __self_0), &Fielded::X(ref __arg_1_0)) =>
10781078
match ::core::cmp::Ord::cmp(&(*__self_0), &(*__arg_1_0)) {

0 commit comments

Comments
 (0)