]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/comparison-operators-newtype.rs
Auto merge of #106121 - RalfJung:miri, r=RalfJung
[rust.git] / src / test / codegen / comparison-operators-newtype.rs
1 // The `derive(PartialOrd)` for a newtype doesn't override `lt`/`le`/`gt`/`ge`.
2 // This double-checks that the `Option<Ordering>` intermediate values used
3 // in the operators for such a type all optimize away.
4
5 // compile-flags: -C opt-level=1
6 // min-llvm-version: 15.0
7
8 #![crate_type = "lib"]
9
10 use std::cmp::Ordering;
11
12 #[derive(PartialOrd, PartialEq)]
13 pub struct Foo(u16);
14
15 // CHECK-LABEL: @check_lt
16 // CHECK-SAME: (i16 %[[A:.+]], i16 %[[B:.+]])
17 #[no_mangle]
18 pub fn check_lt(a: Foo, b: Foo) -> bool {
19     // CHECK: %[[R:.+]] = icmp ult i16 %[[A]], %[[B]]
20     // CHECK-NEXT: ret i1 %[[R]]
21     a < b
22 }
23
24 // CHECK-LABEL: @check_le
25 // CHECK-SAME: (i16 %[[A:.+]], i16 %[[B:.+]])
26 #[no_mangle]
27 pub fn check_le(a: Foo, b: Foo) -> bool {
28     // CHECK: %[[R:.+]] = icmp ule i16 %[[A]], %[[B]]
29     // CHECK-NEXT: ret i1 %[[R]]
30     a <= b
31 }
32
33 // CHECK-LABEL: @check_gt
34 // CHECK-SAME: (i16 %[[A:.+]], i16 %[[B:.+]])
35 #[no_mangle]
36 pub fn check_gt(a: Foo, b: Foo) -> bool {
37     // CHECK: %[[R:.+]] = icmp ugt i16 %[[A]], %[[B]]
38     // CHECK-NEXT: ret i1 %[[R]]
39     a > b
40 }
41
42 // CHECK-LABEL: @check_ge
43 // CHECK-SAME: (i16 %[[A:.+]], i16 %[[B:.+]])
44 #[no_mangle]
45 pub fn check_ge(a: Foo, b: Foo) -> bool {
46     // CHECK: %[[R:.+]] = icmp uge i16 %[[A]], %[[B]]
47     // CHECK-NEXT: ret i1 %[[R]]
48     a >= b
49 }