21
21
using namespace clang ;
22
22
using namespace clang ::interp;
23
23
24
+ template <typename T> static constexpr bool needsCtor () {
25
+ if constexpr (std::is_same_v<T, Integral<8 , true >> ||
26
+ std::is_same_v<T, Integral<8 , false >> ||
27
+ std::is_same_v<T, Integral<16 , true >> ||
28
+ std::is_same_v<T, Integral<16 , false >> ||
29
+ std::is_same_v<T, Integral<32 , true >> ||
30
+ std::is_same_v<T, Integral<32 , false >> ||
31
+ std::is_same_v<T, Integral<64 , true >> ||
32
+ std::is_same_v<T, Integral<64 , false >> ||
33
+ std::is_same_v<T, Boolean>)
34
+ return false ;
35
+
36
+ return true ;
37
+ }
38
+
24
39
template <typename T>
25
40
static void ctorTy (Block *, std::byte *Ptr, bool , bool , bool , bool , bool ,
26
41
const Descriptor *) {
42
+ static_assert (needsCtor<T>());
27
43
new (Ptr) T ();
28
44
}
29
45
30
46
template <typename T>
31
47
static void dtorTy (Block *, std::byte *Ptr, const Descriptor *) {
48
+ static_assert (needsCtor<T>());
32
49
reinterpret_cast <T *>(Ptr)->~T ();
33
50
}
34
51
@@ -45,9 +62,11 @@ static void ctorArrayTy(Block *, std::byte *Ptr, bool, bool, bool, bool, bool,
45
62
const Descriptor *D) {
46
63
new (Ptr) InitMapPtr (std::nullopt);
47
64
48
- Ptr += sizeof (InitMapPtr);
49
- for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
50
- new (&reinterpret_cast <T *>(Ptr)[I]) T ();
65
+ if constexpr (needsCtor<T>()) {
66
+ Ptr += sizeof (InitMapPtr);
67
+ for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
68
+ new (&reinterpret_cast <T *>(Ptr)[I]) T ();
69
+ }
51
70
}
52
71
}
53
72
@@ -57,9 +76,12 @@ static void dtorArrayTy(Block *, std::byte *Ptr, const Descriptor *D) {
57
76
58
77
if (IMP)
59
78
IMP = std::nullopt;
60
- Ptr += sizeof (InitMapPtr);
61
- for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
62
- reinterpret_cast <T *>(Ptr)[I].~T ();
79
+
80
+ if constexpr (needsCtor<T>()) {
81
+ Ptr += sizeof (InitMapPtr);
82
+ for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
83
+ reinterpret_cast <T *>(Ptr)[I].~T ();
84
+ }
63
85
}
64
86
}
65
87
@@ -74,10 +96,14 @@ static void moveArrayTy(Block *, std::byte *Src, std::byte *Dst,
74
96
}
75
97
Src += sizeof (InitMapPtr);
76
98
Dst += sizeof (InitMapPtr);
77
- for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
78
- auto *SrcPtr = &reinterpret_cast <T *>(Src)[I];
79
- auto *DstPtr = &reinterpret_cast <T *>(Dst)[I];
80
- new (DstPtr) T (std::move (*SrcPtr));
99
+ if constexpr (!needsCtor<T>()) {
100
+ std::memcpy (Dst, Src, D->getNumElems () * D->getElemSize ());
101
+ } else {
102
+ for (unsigned I = 0 , NE = D->getNumElems (); I < NE; ++I) {
103
+ auto *SrcPtr = &reinterpret_cast <T *>(Src)[I];
104
+ auto *DstPtr = &reinterpret_cast <T *>(Dst)[I];
105
+ new (DstPtr) T (std::move (*SrcPtr));
106
+ }
81
107
}
82
108
}
83
109
0 commit comments