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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits