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: > > > 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? https://reviews.llvm.org/D41228 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits