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

================
Comment at: include/clang/AST/Type.h:1152
+    NTFK_Struct,  // non-trivial C struct.
+    NTFK_Array    // array that has non-trivial elements.
+  };
----------------
rjmccall wrote:
> ahatanak wrote:
> > rjmccall wrote:
> > > ahatanak wrote:
> > > > rjmccall wrote:
> > > > > We don't actually distinguish arrays in DestructionKind.  Is it 
> > > > > important here?  You can't actually do anything with that information.
> > > > > 
> > > > > Regarding your naming question, I wonder if it would be useful to 
> > > > > just invent a new term here, something meaning "non-trivial" but 
> > > > > without the C++ baggage.  Maybe just "PrimitiveCopyKind", with the 
> > > > > understanding that C++ can never do a "primitive" copy?  And for 
> > > > > consistency with DestructionKind, maybe you should lowercase the 
> > > > > second words.
> > > > > 
> > > > > I'm not sure how isNonTrivialToCopy is supposed to be used.  Where 
> > > > > does the function come from?  And why is a context required when it 
> > > > > isn't required for isDestructedType?
> > > > Enum NonTrivialCopyKind and isNonTrivialToCopy() are used just to 
> > > > distinguish the different types of fields in a C struct. Currently, 
> > > > there are four types that are handled by visitField functions in 
> > > > CGNonTrivialStruct.cpp:
> > > > 
> > > > - struct field
> > > > - array field
> > > > - __strong field
> > > > - trivial field that can be copied using memcpy
> > > > 
> > > > I thought using enums would make the code easier to read, but of course 
> > > > it's possible to remove them and instead just check the field types 
> > > > calling functions like getAsArrayType or getAs<RecordType>. ASTContext 
> > > > is passed to isNonTrivialToCopy so that it can call 
> > > > ASTContext::getAsArrayType to determine whether the type is an array. 
> > > > Maybe there is another way to detect an array that doesn't require 
> > > > ASTContext?
> > > > 
> > > > As for the naming, PrimitiveCopyKind seems find if we want to 
> > > > distinguish it from C++ non-trivial classes (I don't have a better 
> > > > name). If we are going to call non-trivial C structs primitiveCopyKind, 
> > > > what should we call the C structs that are trivial (those that can be 
> > > > copied using memcpy)?
> > > I think "trivial" is a reasonable kind of primitive-copy semantics.  
> > > Basically, we're saying that all complete object types other than 
> > > non-trivial C++ types have some sort of primitive-copy semantics, and 
> > > this enum tells us what those semantics are.
> > > 
> > > DestructionKind has to deal with arrays as well, but it does so by just 
> > > reporting the appropriate value for the underlying element type without 
> > > mentioning that it's specifically an *array* of the type.  I think that's 
> > > a reasonable design, since most places do not need to distinguish arrays 
> > > from non-arrays.  IRGen does, but only when you're actually finally 
> > > emitting code; prior to that (when e.g. deciding that a field is 
> > > non-trivial to copy) you can just use the enum value.
> > > 
> > > You can do without getAsArrayType the same way that isDestructedType() 
> > > does: the more complex operation is only necessary in order to preserve 
> > > qualifiers on the element type, but that's unnecessary for this operation 
> > > because the array type itself is considered to have the same qualifiers 
> > > as its element type.  That is, you can ask the original type whether it's 
> > > __strong/__weak-qualified without having to specifically handle array 
> > > types, and once you've done all of those queries, you can use the 
> > > "unsafe" operations to drill down to the element type because you no 
> > > longer care about qualification.
> > So QualType::hasNonTrivialToDefaultInitializeStruct should be renamed to 
> > QualType::hasPrimitiveDefaultInitializeStruct and 
> > RecordDecl::isNonTrivialToPrimitiveDefaultInitialize to 
> > RecordDecl::isPrimitiveDefaultInitialize, for example?
> > 
> > Also, I realized that, after I made the changes that removed the NonTrivial 
> > flags from RecordDecl, CGNonTrivialStruct.cpp is the only user of enum 
> > NonTrivialCopyKind and the following methods of QualType 
> > (Sema::isValidVarArgType calls nonTrivialToDestroy, but it should call 
> > methods like hasNonTrivialToDestroyStruct that detect non-trivial C structs 
> > instead):
> > 
> > nonTrivialToDefaultInitialize
> > nonTrivialToCopy
> > nonTrivialToDestructiveMove
> > nonTrivialToDestroy
> > 
> > Maybe we should make these enums and functions local to 
> > CGNonTrivialStruct.cpp to avoid adding something that is not used outside 
> > CGNonTrivialStruct.cpp?
> I think the right name would be isNonTrivialToPrimitiveDefaultInitialize(), 
> and like isDestructedType() it would return an enum that happens to have a 
> zero value (and is thus false) for the trivial case.
> 
> I think we are likely to add more places that use these methods and enums.  
> For example, if we want to add a diagnostic that warns about memcpy'ing 
> non-trivial struct types, that diagnostic should probably include a note 
> about which field is non-trivial, and that will still basically want to do 
> this same investigation.
I renamed the functions to names that start with isNonTrivialToPrimitive and 
removed the enumerator for "Array" from the enum too.


https://reviews.llvm.org/D41228



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

Reply via email to