rsmith added inline comments.

================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:13121-13122
+  if (VD->isNoDestroy(getASTContext()) &&
+      !(VD->getType()->isArrayType() && getLangOpts().Exceptions &&
+        VD->isStaticLocal()))
     return;
----------------
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`.)


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