[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