Skip to content

Commit 455e32e

Browse files
committed
Fix CID 141172: Add missing move assignment op
1 parent b01682a commit 455e32e

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

src/type.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,25 @@ Type&
6161
Type::operator=(const Type& rhs)
6262
{
6363
// The operation sequence handles self-assignment
64-
rhs.p->use++;
65-
if (--p->use == 0)
64+
if (rhs.p) rhs.p->use++;
65+
if (p && --p->use == 0)
6666
delete p;
6767
p = rhs.p;
6868
return (*this);
6969
}
7070

71+
// Move assignment
72+
Type&
73+
Type::operator=(Type&& rhs) noexcept {
74+
if (this != &rhs) {
75+
if (p && --p->use == 0)
76+
delete p;
77+
p = rhs.p;
78+
rhs.p = nullptr;
79+
}
80+
return *this;
81+
}
82+
7183
Type
7284
Type_node::subscript() const
7385
{

src/type.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class Type {
235235
Type_node *p;
236236
public:
237237
Type(Type_node *n) : p(n) {}
238-
Type() { p = new Tbasic(b_undeclared); }
238+
Type() : p(new Tbasic(b_undeclared)) {}
239239
// Creation functions
240240
friend Type basic(enum e_btype t, enum e_sign s,
241241
enum e_storage_class sc, qualifiers_t);
@@ -259,9 +259,13 @@ class Type {
259259
void declare();
260260

261261
// Manage use count of underlying Type_node
262-
Type(const Type& t) : p(t.p) { ++p->use; } // Copy
263-
~Type() { if (--p->use == 0) delete p; }
262+
Type(const Type& t) : p(t.p) { if (p) ++p->use; } // Copy
263+
~Type() { if (p && --p->use == 0) delete p; }
264264
Type& operator=(const Type& t);
265+
// Move constructor
266+
Type(Type&& t) noexcept : p(t.p) { t.p = nullptr; }
267+
// Move assignment
268+
Type& operator=(Type&& rhs) noexcept;
265269

266270
// Interface to the Type_node functionality
267271
Type clone() const { return p->clone(); }

0 commit comments

Comments
 (0)