Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions CfrontCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,8 @@ void CfrontCodeGenerator::InsertCXXMethodDecl(const CXXMethodDecl* stmt, SkipBod
} else if(const auto* dtor = dyn_cast_or_null<CXXDestructorDecl>(stmt)) {
// Based on: https://www.dre.vanderbilt.edu/~schmidt/PDF/C++-translation.pdf

InsertVtblPtr(stmt, stmt->getParent(), bodyStmts);

if(body) {
bodyStmts.AddBodyStmts(body);
}
Expand All @@ -682,9 +684,9 @@ void CfrontCodeGenerator::InsertCXXMethodDecl(const CXXMethodDecl* stmt, SkipBod

bodyStmts.Add(
Call(GetSpecialMemberName(stmt, GetRecordDeclType(base.getType()->getAsRecordDecl())), {cast}));

body = mkCompoundStmt({bodyStmts});
}

body = mkCompoundStmt({bodyStmts});
}

params_store params{};
Expand Down
4 changes: 4 additions & 0 deletions tests/EduCfrontTest22.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class Fruit {
Print();
}

virtual ~Fruit() { Print(); }

virtual void Print() const { puts("Base"); }
};

Expand All @@ -18,6 +20,8 @@ class Apple : public Fruit {
: Fruit{}
{}

virtual ~Apple() override { Print(); }

void Print() const override { puts("Apple"); }
};

Expand Down
20 changes: 16 additions & 4 deletions tests/EduCfrontTest22.expect
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,16 @@ typedef struct Fruit
inline Fruit * Constructor_Fruit(Fruit * __this)
{
__this->__vptrFruit = __vtbl_array[0];
(*((void (*)(const Fruit *))((__this)->__vptrFruit[0]).f))((((const Fruit *)(char *)(__this)) + ((__this)->__vptrFruit[0]).d));
(*((void (*)(const Fruit *))((__this)->__vptrFruit[1]).f))((((const Fruit *)(char *)(__this)) + ((__this)->__vptrFruit[1]).d));
return __this;
}

inline void Destructor_Fruit(Fruit * __this)
{
__this->__vptrFruit = __vtbl_array[0];
(*((void (*)(const Fruit *))((__this)->__vptrFruit[1]).f))((((const Fruit *)(char *)(__this)) + ((__this)->__vptrFruit[1]).d));
}

inline void PrintFruit(const Fruit * __this)
{
puts("Base");
Expand All @@ -48,6 +54,12 @@ inline Apple * Constructor_Apple(Apple * __this)
return __this;
}

inline void Destructor_Apple(Apple * __this)
{
(*((void (*)(const Apple *))((__this)->__vptrFruit[1]).f))((((const Apple *)(char *)(__this)) + ((__this)->__vptrFruit[1]).d));
Destructor_Fruit((Fruit *)__this);
}

inline void PrintApple(const Apple * __this)
{
puts("Apple");
Expand All @@ -59,7 +71,7 @@ int __main(void)
Apple x;
Constructor_Apple((Apple *)&x);
return 0;
/* x // lifetime ends here */
(*((void (*)(Apple *))((&x)->__vptrFruit[0]).f))((((Apple *)(char *)(&x)) + ((&x)->__vptrFruit[0]).d));
}

int main(void)
Expand All @@ -71,8 +83,8 @@ int main(void)
/* ret // lifetime ends here */
}

__mptr __vtbl_Fruit[1] = {0, 0, (__vptp)PrintFruit};
__mptr __vtbl_Apple[1] = {0, 0, (__vptp)PrintApple};
__mptr __vtbl_Fruit[2] = {{0, 0, (__vptp)Destructor_Fruit}, {0, 0, (__vptp)PrintFruit}};
__mptr __vtbl_Apple[2] = {{0, 0, (__vptp)Destructor_Apple}, {0, 0, (__vptp)PrintApple}};

__mptr * __vtbl_array[2] = {__vtbl_Fruit, __vtbl_Apple};

Expand Down
2 changes: 2 additions & 0 deletions tests/EduCfrontTest5.expect
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ typedef struct Base

inline void Destructor_Base(Base * __this)
{
__this->__vptrBase = __vtbl_array[0];
}

inline Base * Constructor_Base(Base * __this)
Expand All @@ -68,6 +69,7 @@ typedef struct BaseSecond

inline void Destructor_BaseSecond(BaseSecond * __this)
{
__this->__vptrBaseSecond = __vtbl_array[1];
}

inline BaseSecond * Constructor_BaseSecond(BaseSecond * __this)
Expand Down
2 changes: 2 additions & 0 deletions tests/EduCfrontTest7.expect
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ typedef struct Base

inline void Destructor_Base(Base * __this)
{
__this->__vptrBase = __vtbl_array[0];
}

inline Base * Constructor_Base(Base * __this)
Expand Down Expand Up @@ -87,6 +88,7 @@ typedef struct BaseThird

inline void Destructor_BaseThird(BaseThird * __this)
{
__this->__vptrBaseThird = __vtbl_array[2];
}

inline BaseThird * Constructor_BaseThird(BaseThird * __this)
Expand Down
1 change: 1 addition & 0 deletions tests/EduCfrontVtable4Test.expect
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ typedef struct A

inline void Destructor_A(A * __this)
{
__this->__vptrA = __vtbl_array[0];
puts("dtor");
}

Expand Down
1 change: 1 addition & 0 deletions tests/EduCfrontVtable5Test.expect
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ typedef struct Base

inline void Destructor_Base(Base * __this)
{
__this->__vptrBase = __vtbl_array[0];
puts("~Base");
}

Expand Down
1 change: 1 addition & 0 deletions tests/EduCfrontVtable7Test.expect
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ typedef struct Fruit

inline void Destructor_Fruit(Fruit * __this)
{
__this->__vptrFruit = __vtbl_array[0];
puts("~Fruit");
}

Expand Down
1 change: 1 addition & 0 deletions tests/Issue701.expect
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ typedef struct Fruit

inline void Destructor_Fruit(Fruit * __this)
{
__this->__vptrFruit = __vtbl_array[0];
puts("~Fruit");
}

Expand Down
Loading