hans marked an inline comment as done.
hans added inline comments.

================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4344
+             (Record->hasTrivialDestructor() ||
+              Record->hasConstexprDestructor());
   }
----------------
efriedma wrote:
> For the purposes of CodeGen, checking `Record->hasConstexprDestructor()` 
> isn't really helpful.  Even if `Record->hasConstexprDestructor()` is true, a 
> destructor can still have side-effects.  Since the callers need to handle 
> that possibility anyway, you might as well just skip the 
> `Record->hasTrivialDestructor() || Record->hasConstexprDestructor()` check.
Maybe what we want is to also have an `ExcludeDtor` param that callers which 
have checked that no dtor call is needed could set?


================
Comment at: clang/test/CodeGenCXX/static-init.cpp:181
+#if __cplusplus >= 202002L
+// A const object with constexpr destructor can be emitted as a constant.
+namespace test5 {
----------------
efriedma wrote:
> I don't see how this works.  For a static local variable, in general, we 
> register the destructor with __cxa_atexit, and the destructor can have 
> arbitrary side-effects.  For example:
> 
> ```
> extern void foo();
> struct A {
>   constexpr A() : x(1) {}
>   constexpr ~A() {if (x) foo();}
>   int x;
> };
> const int *f() {
>   static const A a{};
>   return &a.x;
> }
> ```
Hmm, I guess I assumed the destructor being constexpr meant it wouldn't have 
side effects, which of course isn't necessarily true.. thanks for the example.


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

https://reviews.llvm.org/D145369

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to