rsmith added inline comments.

================
Comment at: clang/lib/AST/Type.cpp:2500
+    return BaseElementType.isTriviallyCopyableType(Context) &&
+           !BaseElementType.isDestructedType();
+  }
----------------
devin.jeanpierre wrote:
> rsmith wrote:
> > You can simplify this a little by dropping this `isDestructedType()` check; 
> > trivially copyable implies trivially destructible.
> > 
> > It would be a little more precise to check for 
> > `!isNonTrivialToPrimitiveDestructiveMove() && !isDestructedType()` here; 
> > that'd treat `__autoreleasing` pointers as trivially-relocatable, but not 
> > `__strong` pointers (because "destructive move" there actually means 
> > "non-destructive move" and needs to leave the object in a valid but 
> > unspecified state, which means nulling out a moved-from `__strong` 
> > pointer). I think getting this "fully" right would require a bit more 
> > plumbing to properly handle the case of a `struct` containing a `__strong` 
> > pointer (which is trivially relocatable but not trivially anything else).
> Oooh. `isNonTrivialToPrimitiveDestructiveMove` is perfect.
> 
> Actually, a struct containing a `__strong` pointer is already handled -- 
> Clang 
> [already](https://github.com/llvm/llvm-project/blob/603c1a62f8595f70c3e96ecbec8976d411c0cc08/clang/lib/AST/DeclCXX.cpp#L1037-L1059)
>  ensures they're passed in registers, and does all the appropriate logic. 
> It's just `__strong` pointers themselves that I'd need to handle the same way 
> here. Unfortunately, I really, *really* don't understand the source code 
> dealing with `__strong` pointers in structs. (In particular, I don't 
> understand the difference between GC::Strong and ObjCLifetime::OCL_Strong, 
> plus I'm uncomfy with the global language opts.)
> 
> It's tempting to use the return value of 
> `isNonTrivialToPrimitiveDestructiveMove` and check for `Strong` -- but now 
> that's some *third* thing, and not mirroring the logic of when it's in a 
> struct as a data member.
The existing handling only covers Objective-C++ and not (non-C++) Objective-C 
(the C and C++ codepaths for computing struct properties are entirely 
different, because the C++ side of things is primarily working out properties 
of special member functions). It looks like your test coverage doesn't cover 
the non-C++ side of this.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D114732

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

Reply via email to