diff --git a/src/libsyntax/ext/deriving/cmp/totalord.rs b/src/libsyntax/ext/deriving/cmp/totalord.rs index 83af45462ec..6900773f44d 100644 --- a/src/libsyntax/ext/deriving/cmp/totalord.rs +++ b/src/libsyntax/ext/deriving/cmp/totalord.rs @@ -66,12 +66,19 @@ pub fn cs_cmp(cx: &mut ExtCtxt, span: Span, cx.ident_of("cmp"), cx.ident_of("Equal"))); + let cmp_path = vec![ + cx.ident_of("std"), + cx.ident_of("cmp"), + cx.ident_of("Ord"), + cx.ident_of("cmp"), + ]; + /* Builds: - let __test = self_field1.cmp(&other_field2); + let __test = ::std::cmp::Ord::cmp(&self_field1, &other_field1); if other == ::std::cmp::Ordering::Equal { - let __test = self_field2.cmp(&other_field2); + let __test = ::std::cmp::Ord::cmp(&self_field2, &other_field2); if __test == ::std::cmp::Ordering::Equal { ... } else { @@ -83,11 +90,11 @@ pub fn cs_cmp(cx: &mut ExtCtxt, span: Span, FIXME #6449: These `if`s could/should be `match`es. */ - cs_same_method_fold( + cs_fold( // foldr nests the if-elses correctly, leaving the first field // as the outermost one, and the last as the innermost. false, - |cx, span, old, new| { + |cx, span, old, self_f, other_fs| { // let __test = new; // if __test == ::std::cmp::Ordering::Equal { // old @@ -95,6 +102,20 @@ pub fn cs_cmp(cx: &mut ExtCtxt, span: Span, // __test // } + let new = { + let other_f = match other_fs { + [ref o_f] => o_f, + _ => cx.span_bug(span, "not exactly 2 arguments in `deriving(PartialOrd)`"), + }; + + let args = vec![ + cx.expr_addr_of(span, self_f), + cx.expr_addr_of(span, other_f.clone()), + ]; + + cx.expr_call_global(span, cmp_path.clone(), args) + }; + let assign = cx.stmt_let(span, false, test_id, new); let cond = cx.expr_binary(span, ast::BiEq, diff --git a/src/test/run-pass/issue-18738.rs b/src/test/run-pass/issue-18738.rs index 7958b9ec117..35bd68d803a 100644 --- a/src/test/run-pass/issue-18738.rs +++ b/src/test/run-pass/issue-18738.rs @@ -8,18 +8,18 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#[deriving(PartialEq, PartialOrd)] +#[deriving(Eq, PartialEq, PartialOrd, Ord)] enum Test<'a> { Int(&'a int), Slice(&'a [u8]), } -#[deriving(PartialEq, PartialOrd)] +#[deriving(Eq, PartialEq, PartialOrd, Ord)] struct Version { vendor_info: &'static str } -#[deriving(PartialEq, PartialOrd)] +#[deriving(Eq, PartialEq, PartialOrd, Ord)] struct Foo(&'static str); fn main() {}