From 6c220ee13c23c35117b6f4b956922b53faa823a5 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Mon, 14 Sep 2026 13:00:20 +0100 Subject: [PATCH] Add more rules for move assignment and constructor --- rules/array/src.cpp | 10 ++++++++++ rules/array/tgt_refcount.rs | 4 ++++ rules/array/tgt_unsafe.rs | 8 ++++++++ rules/builtin/src.cpp | 6 ++++++ rules/builtin/tgt_refcount.rs | 5 +++++ rules/builtin/tgt_unsafe.rs | 7 +++++++ rules/deque/src.cpp | 18 ++++++++++++++++++ rules/deque/tgt_refcount.rs | 8 ++++++++ rules/deque/tgt_unsafe.rs | 16 ++++++++++++++++ rules/map/src.cpp | 5 +++++ rules/map/tgt_refcount.rs | 11 +++++++++++ rules/map/tgt_unsafe.rs | 4 ++++ rules/pair/src.cpp | 15 +++++++++++++++ rules/pair/tgt_refcount.rs | 21 +++++++++++++++++++++ rules/pair/tgt_unsafe.rs | 12 ++++++++++++ rules/string/src.cpp | 12 ++++++++++++ rules/string/tgt_refcount.rs | 16 ++++++++++++++++ rules/string/tgt_unsafe.rs | 16 ++++++++++++++++ rules/vector/src.cpp | 9 +++++++++ rules/vector/tgt_unsafe.rs | 8 ++++++++ 20 files changed, 211 insertions(+) diff --git a/rules/array/src.cpp b/rules/array/src.cpp index 4429fe38e..e6a94502b 100644 --- a/rules/array/src.cpp +++ b/rules/array/src.cpp @@ -29,3 +29,13 @@ template std::array &f5(std::array &dst, std::array &&src) { return dst.operator=(std::move(src)); } + +template +std::array f6(const std::array &o) { + return std::array(o); +} + +template +std::array &f7(std::array &dst, const std::array &src) { + return dst.operator=(src); +} diff --git a/rules/array/tgt_refcount.rs b/rules/array/tgt_refcount.rs index e558b8eeb..7b1fd4963 100644 --- a/rules/array/tgt_refcount.rs +++ b/rules/array/tgt_refcount.rs @@ -16,3 +16,7 @@ fn f3(a0: Ptr) -> Ptr { fn f5(a0: Ptr>, a1: &mut Vec) { a0.write(std::mem::take(&mut *a1)) } + +fn f7(a0: Ptr>, a1: Vec) { + a0.write(a1.clone()) +} diff --git a/rules/array/tgt_unsafe.rs b/rules/array/tgt_unsafe.rs index dd98ee0fc..b9bda11da 100644 --- a/rules/array/tgt_unsafe.rs +++ b/rules/array/tgt_unsafe.rs @@ -26,3 +26,11 @@ unsafe fn f4(a0: &mut Vec) -> Vec { unsafe fn f5(a0: &mut Vec, a1: &mut Vec) { *a0 = std::mem::take(&mut *a1) } + +unsafe fn f6(a0: Vec) -> Vec { + a0.clone() +} + +unsafe fn f7(a0: &mut Vec, a1: Vec) { + *a0 = a1.clone() +} diff --git a/rules/builtin/src.cpp b/rules/builtin/src.cpp index f52cf5a88..d22f82392 100644 --- a/rules/builtin/src.cpp +++ b/rules/builtin/src.cpp @@ -1,6 +1,8 @@ // Copyright (c) 2022-present INESC-ID. // Distributed under the MIT license that can be found in the LICENSE file. +#include + #if defined(__linux__) #include #elif !defined(__APPLE__) @@ -26,3 +28,7 @@ bool f10(long long a, long long b, long long *r) { return __builtin_mul_overflow #if defined(__x86_64__) || defined(__i386__) void f11(void) { return __builtin_ia32_pause(); } #endif + +void *f14(void *dst, const void *src, size_t n) { + return __builtin_memcpy(dst, src, n); +} diff --git a/rules/builtin/tgt_refcount.rs b/rules/builtin/tgt_refcount.rs index 4e1afbbc4..d1dd3570a 100644 --- a/rules/builtin/tgt_refcount.rs +++ b/rules/builtin/tgt_refcount.rs @@ -23,3 +23,8 @@ fn f13(a0: i64, a1: i64, a2: Ptr) -> bool { a2.write(val); ovf } + +fn f14(a0: AnyPtr, a1: AnyPtr, a2: usize) -> AnyPtr { + a0.memcpy(&a1, a2 as usize); + a0.clone() +} diff --git a/rules/builtin/tgt_unsafe.rs b/rules/builtin/tgt_unsafe.rs index 1d0e7cb87..95bdb6082 100644 --- a/rules/builtin/tgt_unsafe.rs +++ b/rules/builtin/tgt_unsafe.rs @@ -50,3 +50,10 @@ unsafe fn f13(a0: i64, a1: i64, a2: *mut i64) -> bool { *a2 = val; ovf } + +unsafe fn f14(a0: *mut u8, a1: *const u8, a2: usize) -> *mut u8 { + if a2 != 0 { + ::std::ptr::copy_nonoverlapping(a1, a0, a2 as usize) + } + a0 +} diff --git a/rules/deque/src.cpp b/rules/deque/src.cpp index b7c1bac32..1024ff652 100644 --- a/rules/deque/src.cpp +++ b/rules/deque/src.cpp @@ -22,3 +22,21 @@ template void f7(std::deque> &o, const std::vector &value) { return o.push_back(value); } + +template std::deque f8(const std::deque &o) { + return std::deque(o); +} + +template std::deque f9(std::deque &&o) { + return std::deque(std::move(o)); +} + +template +std::deque &f10(std::deque &dst, const std::deque &src) { + return dst.operator=(src); +} + +template +std::deque &f11(std::deque &dst, std::deque &&src) { + return dst.operator=(std::move(src)); +} diff --git a/rules/deque/tgt_refcount.rs b/rules/deque/tgt_refcount.rs index 8ff487e6f..d3915854c 100644 --- a/rules/deque/tgt_refcount.rs +++ b/rules/deque/tgt_refcount.rs @@ -16,3 +16,11 @@ fn f2(a0: Ptr) -> Ptr { fn f7(a0: Ptr>>>, a1: Value>) { a0.with_mut(|__v: &mut Vec>>| __v.push(a1)) } + +fn f10(a0: Ptr>, a1: Vec) { + a0.write(a1.clone()) +} + +fn f11(a0: Ptr>, a1: &mut Vec) { + a0.write(std::mem::take(&mut *a1)) +} diff --git a/rules/deque/tgt_unsafe.rs b/rules/deque/tgt_unsafe.rs index 8382d48f9..193ff3c79 100644 --- a/rules/deque/tgt_unsafe.rs +++ b/rules/deque/tgt_unsafe.rs @@ -32,3 +32,19 @@ unsafe fn f5(a0: &mut Vec) -> T1 { unsafe fn f7(a0: &mut Vec>, a1: Vec) { a0.push(a1) } + +unsafe fn f8(a0: Vec) -> Vec { + a0.clone() +} + +unsafe fn f9(a0: &mut Vec) -> Vec { + std::mem::take(&mut *a0) +} + +unsafe fn f10(a0: &mut Vec, a1: Vec) { + *a0 = a1.clone() +} + +unsafe fn f11(a0: &mut Vec, a1: &mut Vec) { + *a0 = std::mem::take(&mut *a1) +} diff --git a/rules/map/src.cpp b/rules/map/src.cpp index f1479d0e9..121a14051 100644 --- a/rules/map/src.cpp +++ b/rules/map/src.cpp @@ -126,3 +126,8 @@ template std::map &f25(std::map &dst, std::map &&src) { return dst.operator=(std::move(src)); } + +template +std::map &f26(std::map &dst, const std::map &src) { + return dst.operator=(src); +} diff --git a/rules/map/tgt_refcount.rs b/rules/map/tgt_refcount.rs index 457c23b73..c0fba36ab 100644 --- a/rules/map/tgt_refcount.rs +++ b/rules/map/tgt_refcount.rs @@ -151,3 +151,14 @@ fn f25( let __src = a1.with_mut(|__v: &mut BTreeMap>| std::mem::take(__v)); a0.write(__src) } + +fn f26( + a0: Ptr>>, + a1: BTreeMap>, +) { + a0.write( + a1.iter() + .map(|(k, v)| (k.clone(), Rc::new(RefCell::new(v.borrow().clone())))) + .collect(), + ) +} diff --git a/rules/map/tgt_unsafe.rs b/rules/map/tgt_unsafe.rs index 8024cad2b..91f23ba31 100644 --- a/rules/map/tgt_unsafe.rs +++ b/rules/map/tgt_unsafe.rs @@ -110,3 +110,7 @@ unsafe fn f24(a0: &mut BTreeMap>) -> BTreeMap> { unsafe fn f25(a0: &mut BTreeMap>, a1: &mut BTreeMap>) { *a0 = std::mem::take(&mut *a1) } + +unsafe fn f26(a0: &mut BTreeMap>, a1: BTreeMap>) { + *a0 = a1.clone() +} diff --git a/rules/pair/src.cpp b/rules/pair/src.cpp index 24d4ec4c4..dbf2fbf50 100644 --- a/rules/pair/src.cpp +++ b/rules/pair/src.cpp @@ -45,3 +45,18 @@ template auto f10(T1 &&a0, T2 &&a1) { template T1 &f11(std::pair &a0) { return a0.first; } + +template +std::pair f12(std::pair &&a0) { + return std::pair(std::move(a0)); +} + +template +std::pair &f13(std::pair &dst, const std::pair &src) { + return dst.operator=(src); +} + +template +std::pair &f14(std::pair &dst, std::pair &&src) { + return dst.operator=(std::move(src)); +} diff --git a/rules/pair/tgt_refcount.rs b/rules/pair/tgt_refcount.rs index d8a49175a..e69c4d842 100644 --- a/rules/pair/tgt_refcount.rs +++ b/rules/pair/tgt_refcount.rs @@ -68,3 +68,24 @@ fn f10(a0: T1, a1: T2) -> (Value, Value) { fn f11(a0: (Value, Value)) -> Value { a0.0 } + +fn f12(a0: &mut (Value, Value)) -> (Value, Value) { + std::mem::take(&mut *a0) +} + +fn f13( + a0: Ptr<(Value, Value)>, + a1: (Value, Value), +) { + a0.write(( + Rc::new(RefCell::new(a1.0.borrow().clone())), + Rc::new(RefCell::new(a1.1.borrow().clone())), + )) +} + +fn f14( + a0: Ptr<(Value, Value)>, + a1: &mut (Value, Value), +) { + a0.write(std::mem::take(&mut *a1)) +} diff --git a/rules/pair/tgt_unsafe.rs b/rules/pair/tgt_unsafe.rs index c00a09c9e..cfeaa58a5 100644 --- a/rules/pair/tgt_unsafe.rs +++ b/rules/pair/tgt_unsafe.rs @@ -33,3 +33,15 @@ unsafe fn f10(a0: T1, a1: T2) -> (T1, T2) { unsafe fn f11(a0: (T1, T2)) -> T1 { a0.0 } + +unsafe fn f12(a0: &mut (T1, T2)) -> (T1, T2) { + std::mem::take(&mut *a0) +} + +unsafe fn f13(a0: &mut (T1, T2), a1: (T1, T2)) { + *a0 = a1.clone() +} + +unsafe fn f14(a0: &mut (T1, T2), a1: &mut (T1, T2)) { + *a0 = std::mem::take(&mut *a1) +} diff --git a/rules/string/src.cpp b/rules/string/src.cpp index 1d6bfab9c..0a3581e8c 100644 --- a/rules/string/src.cpp +++ b/rules/string/src.cpp @@ -75,3 +75,15 @@ void f24(std::string &o) { return o.clear(); } void f25(std::string &o) { return o.shrink_to_fit(); } char &f26(std::string &o, std::size_t idx) { return o.at(idx); } + +std::string f27(const std::string &o) { return std::string(o); } + +std::string f28(std::string &&o) { return std::string(std::move(o)); } + +std::string &f29(std::string &dst, const std::string &src) { + return dst.operator=(src); +} + +std::string &f30(std::string &dst, std::string &&src) { + return dst.operator=(std::move(src)); +} diff --git a/rules/string/tgt_refcount.rs b/rules/string/tgt_refcount.rs index 389e68fa9..3550c267d 100644 --- a/rules/string/tgt_refcount.rs +++ b/rules/string/tgt_refcount.rs @@ -174,3 +174,19 @@ fn f24(a0: &mut Vec) { fn f25(a0: &mut Vec) { a0.shrink_to_fit() } + +fn f27(a0: Vec) -> Vec { + a0.clone() +} + +fn f28(a0: &mut Vec) -> Vec { + std::mem::take(&mut *a0) +} + +fn f29(a0: Ptr>, a1: Vec) { + a0.write(a1.clone()) +} + +fn f30(a0: Ptr>, a1: &mut Vec) { + a0.write(std::mem::take(&mut *a1)) +} diff --git a/rules/string/tgt_unsafe.rs b/rules/string/tgt_unsafe.rs index b36e9d9b7..e2c2bd91c 100644 --- a/rules/string/tgt_unsafe.rs +++ b/rules/string/tgt_unsafe.rs @@ -164,3 +164,19 @@ unsafe fn f26(a0: &mut Vec, a1: usize) -> *mut libc::c_char { &mut a0[a1 as usize] } } + +unsafe fn f27(a0: Vec) -> Vec { + a0.clone() +} + +unsafe fn f28(a0: &mut Vec) -> Vec { + std::mem::take(&mut *a0) +} + +unsafe fn f29(a0: &mut Vec, a1: Vec) { + *a0 = a1.clone() +} + +unsafe fn f30(a0: &mut Vec, a1: &mut Vec) { + *a0 = std::mem::take(&mut *a1) +} diff --git a/rules/vector/src.cpp b/rules/vector/src.cpp index 39b424fd9..73cb285f0 100644 --- a/rules/vector/src.cpp +++ b/rules/vector/src.cpp @@ -536,3 +536,12 @@ template > std::vector f108(std::vector &&o) { return std::vector(std::move(o)); } + +template std::vector f109(const std::vector &o) { + return std::vector(o); +} + +template > +std::vector f110(const std::vector &o) { + return std::vector(o); +} diff --git a/rules/vector/tgt_unsafe.rs b/rules/vector/tgt_unsafe.rs index 22abe970b..542283391 100644 --- a/rules/vector/tgt_unsafe.rs +++ b/rules/vector/tgt_unsafe.rs @@ -481,3 +481,11 @@ unsafe fn f107(a0: &mut Vec) -> Vec { unsafe fn f108(a0: &mut Vec) -> Vec { std::mem::take(&mut *a0) } + +unsafe fn f109(a0: Vec) -> Vec { + a0.clone() +} + +unsafe fn f110(a0: Vec) -> Vec { + a0.clone() +}