[PATCH] D137070: [clang][Interp] Support destructors

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 2 10:48:03 PST 2023


aaron.ballman added inline comments.


================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.cpp:1915-1916
+
+    if (const CXXDestructorDecl *Dtor = ElemRecord->getDestructor();
+        Dtor && !Dtor->isTrivial()) {
+      for (size_t I = 0, E = Desc->getNumElems(); I != E; ++I) {
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > `isTrivial()` only works once the class has been fully built up by Sema IIRC; we should have a test case for that situation.
> Are you saying that `isTrivial()` cannot be used like this, or just that it can, but needs a test case to ensure that this is true?
> 
> Also, how would such a test case look like?
`Sema::DeclareImplicitDestructor()` decides whether the destructor is trivial or not, and that is based on information that the class collects as the class is being declared. While the class is being parsed, the `DeclarationData` for the class is updated as we go and we use that to decide if we need the destructor, whether it's trivial, etc. So it's possible for us to have not seen a part of the class yet that would cause the special member function to be (non)trivial and so asking the method "are you trivial" may give a different answer depending on when the question is asked.

In terms of a test case, I think it would be trying to hit one of these cases http://eel.is/c++draft/class.mem#class.dtor-8 by using a constexpr function that needs to be evaluated before we get to something that causes the dtor to no longer be trivial.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137070/new/

https://reviews.llvm.org/D137070



More information about the cfe-commits mailing list