|
2 | 2 | // Test that custom size limits work correctly |
3 | 3 | #![crate_type = "lib"] |
4 | 4 |
|
5 | | -struct MediumStruct { |
6 | | - data: [u64; 10], // 80 bytes - below custom 100-byte threshold |
| 5 | +struct Struct99 { |
| 6 | + data: [u8; 99], // just below custom 100-byte threshold |
7 | 7 | } |
8 | 8 |
|
9 | | -const _: () = { assert!(std::mem::size_of::<MediumStruct>() == 80) }; |
| 9 | +const _: () = { assert!(size_of::<Struct99>() == 99) }; |
10 | 10 |
|
11 | | -impl Clone for MediumStruct { |
12 | | - // CHECK-LABEL: <size_limit::MediumStruct as core::clone::Clone>::clone |
| 11 | +impl Clone for Struct99 { |
| 12 | + // CHECK-LABEL: <size_limit::Struct99 as core::clone::Clone>::clone |
13 | 13 | fn clone(&self) -> Self { |
14 | 14 | // Should NOT be annotated since 80 < 100 |
15 | | - // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#MEDIUM_COPY_LOC:]] |
16 | | - MediumStruct { data: self.data } |
| 15 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ99_COPY_LOC:]] |
| 16 | + Struct99 { data: self.data } |
17 | 17 | } |
18 | 18 | } |
19 | 19 |
|
20 | | -struct LargeStruct { |
21 | | - data: [u64; 20], // 160 bytes - above custom 100-byte threshold |
| 20 | +// CHECK-LABEL: size_limit::test_99_copy |
| 21 | +pub fn test_99_copy() { |
| 22 | + let sz99 = Struct99 { data: [42; 99] }; |
| 23 | + let _copy = sz99.clone(); |
22 | 24 | } |
23 | 25 |
|
24 | | -const _: () = { assert!(std::mem::size_of::<LargeStruct>() == 160) }; |
| 26 | +// CHECK-LABEL: size_limit::test_99_move |
| 27 | +pub fn test_99_move() { |
| 28 | + let sz99 = Struct99 { data: [42; 99] }; |
| 29 | + // Should NOT be annotated |
| 30 | + // CHECK-NOT: compiler_move |
| 31 | + let _moved = sz99; |
| 32 | +} |
| 33 | + |
| 34 | +struct Struct100 { |
| 35 | + data: [u8; 100], // 160 bytes - above custom 100-byte threshold |
| 36 | +} |
25 | 37 |
|
26 | | -impl Clone for LargeStruct { |
27 | | - // CHECK-LABEL: <size_limit::LargeStruct as core::clone::Clone>::clone |
| 38 | +const _: () = { assert!(size_of::<Struct100>() == 100) }; |
| 39 | + |
| 40 | +impl Clone for Struct100 { |
| 41 | + // CHECK-LABEL: <size_limit::Struct100 as core::clone::Clone>::clone |
28 | 42 | fn clone(&self) -> Self { |
29 | | - // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#LARGE_COPY_LOC:]] |
30 | | - // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#LARGE_RETURN_LOC:]] |
31 | | - LargeStruct { data: self.data } |
| 43 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_COPY_LOC:]] |
| 44 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_RETURN_LOC:]] |
| 45 | + Struct100 { data: self.data } |
32 | 46 | } |
33 | 47 | } |
34 | 48 |
|
35 | | -// CHECK-LABEL: size_limit::test_medium_copy |
36 | | -pub fn test_medium_copy() { |
37 | | - let medium = MediumStruct { data: [42; 10] }; |
38 | | - let _copy = medium.clone(); |
| 49 | +// CHECK-LABEL: size_limit::test_100_copy |
| 50 | +pub fn test_100_copy() { |
| 51 | + let sz100 = Struct100 { data: [42; 100] }; |
| 52 | + let _copy = sz100.clone(); |
39 | 53 | } |
40 | 54 |
|
41 | | -// CHECK-LABEL: size_limit::test_large_copy |
42 | | -pub fn test_large_copy() { |
43 | | - let large = LargeStruct { data: [42; 20] }; |
44 | | - let _copy = large.clone(); |
| 55 | +// CHECK-LABEL: size_limit::test_100_move |
| 56 | +pub fn test_100_move() { |
| 57 | + let sz100 = Struct100 { data: [42; 100] }; |
| 58 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_MOVE_LOC:]] |
| 59 | + let _moved = sz100; |
45 | 60 | } |
46 | 61 |
|
47 | | -// CHECK-LABEL: size_limit::test_medium_move |
48 | | -pub fn test_medium_move() { |
49 | | - let medium = MediumStruct { data: [42; 10] }; |
50 | | - // Should NOT be annotated |
51 | | - // CHECK-NOT: compiler_move |
52 | | - let _moved = medium; |
| 62 | +struct Struct101 { |
| 63 | + data: [u8; 101], // 160 bytes - above custom 101-byte threshold |
53 | 64 | } |
54 | 65 |
|
55 | | -// CHECK-LABEL: size_limit::test_large_move |
56 | | -pub fn test_large_move() { |
57 | | - let large = LargeStruct { data: [42; 20] }; |
58 | | - // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#LARGE_MOVE_LOC:]] |
59 | | - let _moved = large; |
| 66 | +const _: () = { assert!(size_of::<Struct101>() == 101) }; |
| 67 | + |
| 68 | +impl Clone for Struct101 { |
| 69 | + // CHECK-LABEL: <size_limit::Struct101 as core::clone::Clone>::clone |
| 70 | + fn clone(&self) -> Self { |
| 71 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_COPY_LOC:]] |
| 72 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_RETURN_LOC:]] |
| 73 | + Struct101 { data: self.data } |
| 74 | + } |
| 75 | +} |
| 76 | + |
| 77 | +// CHECK-LABEL: size_limit::test_101_copy |
| 78 | +pub fn test_101_copy() { |
| 79 | + let sz101 = Struct101 { data: [42; 101] }; |
| 80 | + let _copy = sz101.clone(); |
| 81 | +} |
| 82 | + |
| 83 | +// CHECK-LABEL: size_limit::test_101_move |
| 84 | +pub fn test_101_move() { |
| 85 | + let sz101 = Struct101 { data: [42; 101] }; |
| 86 | + // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_MOVE_LOC:]] |
| 87 | + let _moved = sz101; |
60 | 88 | } |
61 | 89 |
|
62 | 90 | // The scope for no-annotated is clone function itself |
63 | | -// CHECK-DAG: ![[#MEDIUM_COPY_LOC]] = !DILocation({{.*}}scope: ![[#MEDIUM_COPY_SCOPE:]] |
64 | | -// CHECK-DAG: ![[#MEDIUM_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "clone", |
| 91 | +// CHECK-DAG: ![[#SZ99_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ99_COPY_SCOPE:]] |
| 92 | +// CHECK-DAG: ![[#SZ99_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "clone", |
| 93 | + |
| 94 | +// Clone itself is copy, but return is move. |
| 95 | +// CHECK-DAG: ![[#SZ100_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_COPY_SCOPE:]] |
| 96 | +// CHECK-DAG: ![[#SZ100_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_copy<[u8; 100], 100>" |
| 97 | +// CHECK-DAG: ![[#SZ100_RETURN_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_RETURN_SCOPE:]] |
| 98 | +// CHECK-DAG: ![[#SZ100_RETURN_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u8; 100], 100>" |
| 99 | + |
| 100 | +// Assignment is move |
| 101 | +// CHECK-DAG: ![[#SZ100_MOVE_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_MOVE_SCOPE:]] |
| 102 | +// CHECK-DAG: ![[#SZ100_MOVE_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u8; 100], 100>" |
65 | 103 |
|
66 | 104 | // Clone itself is copy, but return is move. |
67 | | -// CHECK-DAG: ![[#LARGE_COPY_LOC]] = !DILocation({{.*}}scope: ![[#LARGE_COPY_SCOPE:]] |
68 | | -// CHECK-DAG: ![[#LARGE_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_copy<[u64; 20], 160>" |
69 | | -// CHECK-DAG: ![[#LARGE_RETURN_LOC]] = !DILocation({{.*}}scope: ![[#LARGE_RETURN_SCOPE:]] |
70 | | -// CHECK-DAG: ![[#LARGE_RETURN_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u64; 20], 160>" |
| 105 | +// CHECK-DAG: ![[#SZ101_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_COPY_SCOPE:]] |
| 106 | +// CHECK-DAG: ![[#SZ101_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_copy<[u8; 101], 101>" |
| 107 | +// CHECK-DAG: ![[#SZ101_RETURN_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_RETURN_SCOPE:]] |
| 108 | +// CHECK-DAG: ![[#SZ101_RETURN_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u8; 101], 101>" |
71 | 109 |
|
72 | 110 | // Assignment is move |
73 | | -// CHECK-DAG: ![[#LARGE_MOVE_LOC]] = !DILocation({{.*}}scope: ![[#LARGE_MOVE_SCOPE:]] |
74 | | -// CHECK-DAG: ![[#LARGE_MOVE_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u64; 20], 160>" |
| 111 | +// CHECK-DAG: ![[#SZ101_MOVE_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_MOVE_SCOPE:]] |
| 112 | +// CHECK-DAG: ![[#SZ101_MOVE_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<[u8; 101], 101>" |
0 commit comments