erik.pilkington marked 2 inline comments as done.
erik.pilkington added inline comments.


================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:13121-13122
+  if (VD->isNoDestroy(getASTContext()) &&
+      !(VD->getType()->isArrayType() && getLangOpts().Exceptions &&
+        VD->isStaticLocal()))
     return;
----------------
rjmccall wrote:
> erik.pilkington wrote:
> > rjmccall wrote:
> > > 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.
> > Sure, done. Moving this to initialization time seems like a nice cleanup.
> Hmm.  What I just mentioned for the documentation is relevant here, right?  
> We only need to check access to subobject destructors if exceptions are 
> enabled, so this attempt to avoid duplicate diagnostics might leave us not 
> flagging the use if exceptions are disabled.
> 
> Well, maybe the check isn't actually restricted that way, hmm.  Shouldn't it 
> be?
I thought we tried in general to keep `-fno-exceptions` as similar to normal 
C++ as possible, rather than invent new language rules for it (even when they 
make sense).


================
Comment at: clang/lib/Sema/SemaInit.cpp:6328
+    if (hasAccessibleDestructor(S.Context.getBaseElementType(AT), Loc, S))
+      return ExprError();
+
----------------
rjmccall wrote:
> There's no way that the right semantics are to return failure if the type has 
> an accessible destructor. :)  Looks like the function is misnamed.  Also, it 
> should also be named something that makes it clear that it's more than a 
> predicate, it's actually checking access to / marking the use of the 
> destructor.  I know this is an existing function, but could you take care of 
> that?
Yeah, the name doesn't make much sense. I'll update it...


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