| //@ compile-flags: -Z annotate-moves=100 -Copt-level=0 -g |
| // Test that custom size limits work correctly |
| #![crate_type = "lib"] |
| |
| struct Struct99 { |
| data: [u8; 99], // just below custom 100-byte threshold |
| } |
| |
| const _: () = { assert!(size_of::<Struct99>() == 99) }; |
| |
| impl Clone for Struct99 { |
| // CHECK-LABEL: <size_limit::Struct99 as core::clone::Clone>::clone |
| fn clone(&self) -> Self { |
| // Should NOT be annotated since 99 < 100 |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ99_COPY_LOC:]] |
| Struct99 { data: self.data } |
| } |
| } |
| |
| // CHECK-LABEL: size_limit::test_99_copy |
| pub fn test_99_copy() { |
| let sz99 = Struct99 { data: [42; 99] }; |
| let _copy = sz99.clone(); |
| } |
| |
| // CHECK-LABEL: size_limit::test_99_move |
| pub fn test_99_move() { |
| let sz99 = Struct99 { data: [42; 99] }; |
| // Should NOT be annotated |
| // CHECK-NOT: compiler_move |
| let _moved = sz99; |
| } |
| |
| struct Struct100 { |
| data: [u8; 100], // 100 bytes - equal to custom 100-byte threshold |
| } |
| |
| const _: () = { assert!(size_of::<Struct100>() == 100) }; |
| |
| impl Clone for Struct100 { |
| // CHECK-LABEL: <size_limit::Struct100 as core::clone::Clone>::clone |
| fn clone(&self) -> Self { |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_COPY_LOC:]] |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_RETURN_LOC:]] |
| Struct100 { data: self.data } |
| } |
| } |
| |
| // CHECK-LABEL: size_limit::test_100_copy |
| pub fn test_100_copy() { |
| let sz100 = Struct100 { data: [42; 100] }; |
| let _copy = sz100.clone(); |
| } |
| |
| // CHECK-LABEL: size_limit::test_100_move |
| pub fn test_100_move() { |
| let sz100 = Struct100 { data: [42; 100] }; |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ100_MOVE_LOC:]] |
| let _moved = sz100; |
| } |
| |
| struct Struct101 { |
| data: [u8; 101], // 101 bytes - above custom 100-byte threshold |
| } |
| |
| const _: () = { assert!(size_of::<Struct101>() == 101) }; |
| |
| impl Clone for Struct101 { |
| // CHECK-LABEL: <size_limit::Struct101 as core::clone::Clone>::clone |
| fn clone(&self) -> Self { |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_COPY_LOC:]] |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_RETURN_LOC:]] |
| Struct101 { data: self.data } |
| } |
| } |
| |
| // CHECK-LABEL: size_limit::test_101_copy |
| pub fn test_101_copy() { |
| let sz101 = Struct101 { data: [42; 101] }; |
| let _copy = sz101.clone(); |
| } |
| |
| // CHECK-LABEL: size_limit::test_101_move |
| pub fn test_101_move() { |
| let sz101 = Struct101 { data: [42; 101] }; |
| // CHECK: call void @llvm.memcpy{{.*}}, !dbg ![[#SZ101_MOVE_LOC:]] |
| let _moved = sz101; |
| } |
| |
| // The scope for no-annotated is clone function itself |
| // CHECK-DAG: ![[#SZ99_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ99_COPY_SCOPE:]] |
| // CHECK-DAG: ![[#SZ99_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "clone", |
| |
| // Clone itself is copy, but return is move. |
| // CHECK-DAG: ![[#SZ100_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_COPY_SCOPE:]] |
| // CHECK-DAG: ![[#SZ100_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_copy<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |
| // CHECK-DAG: ![[#SZ100_RETURN_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_RETURN_SCOPE:]] |
| // CHECK-DAG: ![[#SZ100_RETURN_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |
| |
| // Assignment is move |
| // CHECK-DAG: ![[#SZ100_MOVE_LOC]] = !DILocation({{.*}}scope: ![[#SZ100_MOVE_SCOPE:]] |
| // CHECK-DAG: ![[#SZ100_MOVE_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |
| |
| // Clone itself is copy, but return is move. |
| // CHECK-DAG: ![[#SZ101_COPY_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_COPY_SCOPE:]] |
| // CHECK-DAG: ![[#SZ101_COPY_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_copy<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |
| // CHECK-DAG: ![[#SZ101_RETURN_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_RETURN_SCOPE:]] |
| // CHECK-DAG: ![[#SZ101_RETURN_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |
| |
| // Assignment is move |
| // CHECK-DAG: ![[#SZ101_MOVE_LOC]] = !DILocation({{.*}}scope: ![[#SZ101_MOVE_SCOPE:]] |
| // CHECK-DAG: ![[#SZ101_MOVE_SCOPE]] = {{(distinct )?}}!DISubprogram(name: "compiler_move<{{(array\$<|\[)u8[,;].*}},{{ *[0-9]+}}>" |