//@ 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::() == 99) }; impl Clone for Struct99 { // CHECK-LABEL: ::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::() == 100) }; impl Clone for Struct100 { // CHECK-LABEL: ::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::() == 101) }; impl Clone for Struct101 { // CHECK-LABEL: ::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]+}}>"