about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorErik Desjardins <erikdesjardins@users.noreply.github.com>2022-02-12 14:01:33 -0500
committerErik Desjardins <erikdesjardins@users.noreply.github.com>2022-02-27 12:16:16 -0500
commitfec4335407c9a292c524e07996ccd4d26c563548 (patch)
tree4af67f978ab9bb4689527c4f1048c2fcf4a8eb83 /src/test/codegen
parent3b1fe7e7c95e14dd8a420edf2f8a160c70211e04 (diff)
Apply noundef metadata to loads of types that do not permit raw init
This matches the noundef attributes we apply on arguments/return types.
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/loads.rs87
1 files changed, 83 insertions, 4 deletions
diff --git a/src/test/codegen/loads.rs b/src/test/codegen/loads.rs
index 3c9ecec2cbf..977175a4a62 100644
--- a/src/test/codegen/loads.rs
+++ b/src/test/codegen/loads.rs
@@ -2,11 +2,87 @@
 
 #![crate_type = "lib"]
 
+use std::mem::MaybeUninit;
+use std::num::NonZeroU16;
+
 pub struct Bytes {
-  a: u8,
-  b: u8,
-  c: u8,
-  d: u8,
+    a: u8,
+    b: u8,
+    c: u8,
+    d: u8,
+}
+
+#[derive(Copy, Clone)]
+pub enum MyBool {
+    True,
+    False,
+}
+
+// CHECK-LABEL: @load_ref
+#[no_mangle]
+pub fn load_ref<'a>(x: &&'a i32) -> &'a i32 {
+// Alignment of a reference itself is target dependent, so just match any alignment:
+// the main thing we care about here is !nonnull and !noundef.
+// CHECK: load i32*, i32** %x, align {{[0-9]+}}, !nonnull !{{[0-9]+}}, !noundef !{{[0-9]+}}
+    *x
+}
+
+// CHECK-LABEL: @load_box
+#[no_mangle]
+pub fn load_box<'a>(x: Box<Box<i32>>) -> Box<i32> {
+// Alignment of a box itself is target dependent, so just match any alignment:
+// the main thing we care about here is !nonnull and !noundef.
+// CHECK: load i32*, i32** %x, align {{[0-9]+}}, !nonnull !{{[0-9]+}}, !noundef !{{[0-9]+}}
+    *x
+}
+
+// CHECK-LABEL: @load_bool
+#[no_mangle]
+pub fn load_bool(x: &bool) -> bool {
+// CHECK: load i8, i8* %x, align 1, !range ![[BOOL_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
+    *x
+}
+
+// CHECK-LABEL: @load_maybeuninit_bool
+#[no_mangle]
+pub fn load_maybeuninit_bool(x: &MaybeUninit<bool>) -> MaybeUninit<bool> {
+// CHECK: load i8, i8* %x, align 1{{$}}
+    *x
+}
+
+// CHECK-LABEL: @load_enum_bool
+#[no_mangle]
+pub fn load_enum_bool(x: &MyBool) -> MyBool {
+// CHECK: load i8, i8* %x, align 1, !range ![[BOOL_RANGE]], !noundef !{{[0-9]+}}
+    *x
+}
+
+// CHECK-LABEL: @load_maybeuninit_enum_bool
+#[no_mangle]
+pub fn load_maybeuninit_enum_bool(x: &MaybeUninit<MyBool>) -> MaybeUninit<MyBool> {
+// CHECK: load i8, i8* %x, align 1{{$}}
+    *x
+}
+
+// CHECK-LABEL: @load_int
+#[no_mangle]
+pub fn load_int(x: &u16) -> u16 {
+// CHECK: load i16, i16* %x, align 2{{$}}
+    *x
+}
+
+// CHECK-LABEL: @load_nonzero_int
+#[no_mangle]
+pub fn load_nonzero_int(x: &NonZeroU16) -> NonZeroU16 {
+// CHECK: load i16, i16* %x, align 2, !range ![[NONZEROU16_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
+    *x
+}
+
+// CHECK-LABEL: @load_option_nonzero_int
+#[no_mangle]
+pub fn load_option_nonzero_int(x: &Option<NonZeroU16>) -> Option<NonZeroU16> {
+// CHECK: load i16, i16* %x, align 2{{$}}
+    *x
 }
 
 // CHECK-LABEL: @borrow
@@ -43,3 +119,6 @@ pub fn small_struct_alignment(x: Bytes) -> Bytes {
 // CHECK: ret i32 [[VAR]]
     x
 }
+
+// CHECK: ![[BOOL_RANGE]] = !{i8 0, i8 2}
+// CHECK: ![[NONZEROU16_RANGE]] = !{i16 1, i16 0}