rjmccall added inline comments.

================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:13121-13122
+  if (VD->isNoDestroy(getASTContext()) &&
+      !(VD->getType()->isArrayType() && getLangOpts().Exceptions &&
+        VD->isStaticLocal()))
     return;
----------------
rsmith wrote:
> Hmm, perhaps it would be cleaner if the destructor for array elements were 
> required by the initialization of the array, instead of here. That's how this 
> works for struct aggregate initialization (see 
> `InitListChecker::CheckStructUnionTypes`), and (indirectly) how it works for 
> initialization by constructor, and so on. And it reflects the fact that it's 
> the initialization process that needs the array element destructor, not the 
> destruction of the variable (which never happens).
> 
> For the case of aggregate initialization of an array, we appear to fail to 
> implement [dcl.init.aggr]/8:
> 
> """
> The destructor for each element of class type is potentially invoked (11.3.6) 
> from the context where the aggregate initialization occurs. [Note: This 
> provision ensures that destructors can be called for fully-constructed 
> subobjects in case an exception is thrown (14.2). — end note]
> """
> 
> (But there doesn't appear to be any corresponding wording for default / value 
> initialization of arrays. See also the special case at the end of 
> `BuildCXXNewExpr`.)
That makes sense to me.  The default/value initialization case seems like an 
obvious oversight in the standard, but I think it might be a distinction 
without a difference: the special cases for base-or-member initializers and 
new-expressions might cover literally every situation where initialization 
doesn't come with an adjacent need for non-exceptional destruction.


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

https://reviews.llvm.org/D61165



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

Reply via email to