mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
test: added codegen tests for permutations of Option::or
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
// Tests output of multiple permutations of `Option::or`
|
||||
//@ compile-flags: -Copt-level=3 -Zmerge-functions=disabled
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// CHECK-LABEL: @or_match_u8
|
||||
#[no_mangle]
|
||||
pub fn or_match_u8(opta: Option<u8>, optb: Option<u8>) -> Option<u8> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: or i1 %0
|
||||
// CHECK-NEXT: select i1 %0
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// ret { i1, i8 }
|
||||
match opta {
|
||||
Some(x) => Some(x),
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @or_match_alt_u8
|
||||
#[no_mangle]
|
||||
pub fn or_match_alt_u8(opta: Option<u8>, optb: Option<u8>) -> Option<u8> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: select i1
|
||||
// CHECK-NEXT: or i1
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// ret { i1, i8 }
|
||||
match opta {
|
||||
Some(_) => opta,
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @option_or_u8
|
||||
#[no_mangle]
|
||||
pub fn option_or_u8(opta: Option<u8>, optb: Option<u8>) -> Option<u8> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: select i1
|
||||
// CHECK-NEXT: or i1
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// ret { i1, i8 }
|
||||
opta.or(optb)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @if_some_u8
|
||||
#[no_mangle]
|
||||
pub fn if_some_u8(opta: Option<u8>, optb: Option<u8>) -> Option<u8> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: select i1
|
||||
// CHECK-NEXT: or i1
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// CHECK-NEXT: insertvalue { i1, i8 }
|
||||
// ret { i1, i8 }
|
||||
if opta.is_some() { opta } else { optb }
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @or_match_slice_u8
|
||||
#[no_mangle]
|
||||
pub fn or_match_slice_u8(opta: Option<[u8; 1]>, optb: Option<[u8; 1]>) -> Option<[u8; 1]> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i16 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i16 %0, i16 %1
|
||||
// ret i16
|
||||
match opta {
|
||||
Some(x) => Some(x),
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @or_match_slice_alt_u8
|
||||
#[no_mangle]
|
||||
pub fn or_match_slice_alt_u8(opta: Option<[u8; 1]>, optb: Option<[u8; 1]>) -> Option<[u8; 1]> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i16 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i16 %0, i16 %1
|
||||
// ret i16
|
||||
match opta {
|
||||
Some(_) => opta,
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @option_or_slice_u8
|
||||
#[no_mangle]
|
||||
pub fn option_or_slice_u8(opta: Option<[u8; 1]>, optb: Option<[u8; 1]>) -> Option<[u8; 1]> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i16 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i16 %0, i16 %1
|
||||
// ret i16
|
||||
opta.or(optb)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @if_some_slice_u8
|
||||
#[no_mangle]
|
||||
pub fn if_some_slice_u8(opta: Option<[u8; 1]>, optb: Option<[u8; 1]>) -> Option<[u8; 1]> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i16 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i16 %0, i16 %1
|
||||
// ret i16
|
||||
if opta.is_some() { opta } else { optb }
|
||||
}
|
||||
|
||||
pub struct Test {
|
||||
_a: u8,
|
||||
_b: u8,
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @or_match_type
|
||||
#[no_mangle]
|
||||
pub fn or_match_type(opta: Option<Test>, optb: Option<Test>) -> Option<Test> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i24 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i24 %0, i24 %1
|
||||
// ret i24
|
||||
match opta {
|
||||
Some(x) => Some(x),
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @or_match_alt_type
|
||||
#[no_mangle]
|
||||
pub fn or_match_alt_type(opta: Option<Test>, optb: Option<Test>) -> Option<Test> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i24 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i24 %0, i24 %1
|
||||
// ret i24
|
||||
match opta {
|
||||
Some(_) => opta,
|
||||
None => optb,
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @option_or_type
|
||||
#[no_mangle]
|
||||
pub fn option_or_type(opta: Option<Test>, optb: Option<Test>) -> Option<Test> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i24 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i24 %0, i24 %1
|
||||
// ret i24
|
||||
opta.or(optb)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @if_some_type
|
||||
#[no_mangle]
|
||||
pub fn if_some_type(opta: Option<Test>, optb: Option<Test>) -> Option<Test> {
|
||||
// CHECK: start:
|
||||
// CHECK-NEXT: trunc i24 %0 to i1
|
||||
// CHECK-NEXT: select i1 %2, i24 %0, i24 %1
|
||||
// ret i24
|
||||
if opta.is_some() { opta } else { optb }
|
||||
}
|
||||
Reference in New Issue
Block a user