[clang] [clang] Avoid triggering vtable instantiation for C++23 constexpr dtor (PR #102605)

Mariya Podchishchaeva via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 9 07:04:43 PDT 2024


================
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+template <typename T> static void destroy() {
+    T t;
+    ++t;
+}
+
+struct Incomplete;
+
+template <typename = int> struct HasD {
+  ~HasD() { destroy<Incomplete*>(); }
+};
+
+struct HasVT {
+  virtual ~HasVT();
+};
+
+struct S : HasVT {
+  HasD<> v;
+};
+
----------------
Fznamznon wrote:

It complains
```
gh102293.cpp:23:15: error: static assertion expression is not an integral constant expression
   23 | static_assert((S{}, 1));
      |               ^~~~~~~~
gh102293.cpp:23:16: note: non-constexpr function '~HasD' cannot be used in a constant expression
   23 | static_assert((S{}, 1));
      |                ^
gh102293.cpp:23:16: note: in call to 'S{}.~S()'
   23 | static_assert((S{}, 1));
      |                ^
gh102293.cpp:12:3: note: declared here
   12 |   ~HasD() { destroy<Incomplete*>(); }
      |   ^
gh102293.cpp:6:5: error: arithmetic on a pointer to an incomplete type 'Incomplete'
    6 |     ++t;
      |     ^ ~
gh102293.cpp:12:13: note: in instantiation of function template specialization 'destroy<Incomplete *>' requested here
   12 |   ~HasD() { destroy<Incomplete*>(); }
      |             ^
gh102293.cpp:19:8: note: in instantiation of member function 'HasD<>::~HasD' requested here
   19 | struct S : HasVT {
      |        ^
gh102293.cpp:9:8: note: forward declaration of 'Incomplete'
    9 | struct Incomplete;
      |        ^
```
I suppose expectedly

https://github.com/llvm/llvm-project/pull/102605


More information about the cfe-commits mailing list