[cfe-dev] Clang not generating the destructor
Nathan Sidwell via cfe-dev
cfe-dev at lists.llvm.org
Fri Apr 30 05:50:44 PDT 2021
On 4/28/21 9:55 PM, Riyaz Puthiyapurayil via cfe-dev wrote:
> The following test case fails to compile with clang++ because it does
> not generate code for a destructor (as indicated below). Is this a bug
> or am I missing something? Gcc works fine.
smells like a bug.
>
> Wandbox permlink: https://wandbox.org/permlink/H7BcjQzXwoqZclj3
> <https://wandbox.org/permlink/H7BcjQzXwoqZclj3>
>
> // prog.cpp
>
> #include "D.h"
>
> D *f(char c) {
>
> return c ? new D(c) : new D(-1);
>
> }
>
> D *x;
>
> int main() {
>
> x = f('a');
>
> return 0;
>
> }
>
> // D.h
>
> #ifndef D_H
>
> #define D_H
>
> extern void unknown();
>
> template<typename T>
>
> class C {
>
> T t;
>
> public:
>
> explicit C(T t_) : t(t_) {}
>
> ~C() {}
>
> };
>
> class D {
>
> union U
>
> {
>
> explicit U(int i) : ci(i) { unknown(); }
>
> explicit U(char c) : cc(c) {}
>
> ~U() {}
>
> C<int> ci; // destructor C<int>::~C() not generated
>
> C<char> cc;
>
> };
>
> U u;
>
> bool uIsInt;
>
> public:
>
> explicit D(int i) : u(i), uIsInt(true) {}
>
> explicit D(char c) : u(c), uIsInt(false) {}
>
> ~D(); // explicit destruction of u
>
> };
>
> D* f(char c);
>
> #endif // D_H
>
> // unk.cpp
>
> #include "D.h"
>
> void unknown() {}
>
> D::~D() {
>
> if (uIsInt)
>
> u.ci.~C();
>
> else
>
> u.cc.~C();
>
> }
>
> $ clang++ prog.cpp unk.cpp
>
> /tmp/prog-bfa5e6.o: In function `D::U::U(int)':
>
> prog.cc:(.text._ZN1D1UC2Ei[_ZN1D1UC2Ei]+0x3e): undefined reference to
> `C<int>::~C()'
>
> clang-11: error: linker command failed with exit code 1 (use -v to see
> invocation)
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
--
Nathan Sidwell
More information about the cfe-dev
mailing list