| // The `derive(PartialOrd)` for a newtype doesn't override `lt`/`le`/`gt`/`ge`. |
| // This double-checks that the `Option<Ordering>` intermediate values used |
| // in the operators for such a type all optimize away. |
| |
| //@ compile-flags: -C opt-level=1 |
| |
| #![crate_type = "lib"] |
| |
| use std::cmp::Ordering; |
| |
| #[derive(PartialOrd, PartialEq)] |
| pub struct Foo(u16); |
| |
| // CHECK-LABEL: @check_lt |
| // CHECK-SAME: (i16{{.*}} %[[A:.+]], i16{{.*}} %[[B:.+]]) |
| #[no_mangle] |
| pub fn check_lt(a: Foo, b: Foo) -> bool { |
| // CHECK: %[[R:.+]] = icmp ult i16 %[[A]], %[[B]] |
| // CHECK-NEXT: ret i1 %[[R]] |
| a < b |
| } |
| |
| // CHECK-LABEL: @check_le |
| // CHECK-SAME: (i16{{.*}} %[[A:.+]], i16{{.*}} %[[B:.+]]) |
| #[no_mangle] |
| pub fn check_le(a: Foo, b: Foo) -> bool { |
| // CHECK: %[[R:.+]] = icmp ule i16 %[[A]], %[[B]] |
| // CHECK-NEXT: ret i1 %[[R]] |
| a <= b |
| } |
| |
| // CHECK-LABEL: @check_gt |
| // CHECK-SAME: (i16{{.*}} %[[A:.+]], i16{{.*}} %[[B:.+]]) |
| #[no_mangle] |
| pub fn check_gt(a: Foo, b: Foo) -> bool { |
| // CHECK: %[[R:.+]] = icmp ugt i16 %[[A]], %[[B]] |
| // CHECK-NEXT: ret i1 %[[R]] |
| a > b |
| } |
| |
| // CHECK-LABEL: @check_ge |
| // CHECK-SAME: (i16{{.*}} %[[A:.+]], i16{{.*}} %[[B:.+]]) |
| #[no_mangle] |
| pub fn check_ge(a: Foo, b: Foo) -> bool { |
| // CHECK: %[[R:.+]] = icmp uge i16 %[[A]], %[[B]] |
| // CHECK-NEXT: ret i1 %[[R]] |
| a >= b |
| } |