[PATCH] D11298: Convert a few classes over to use the new TrailingObjects helper.
Richard Smith
richard at metafoo.co.uk
Mon Aug 3 13:17:06 PDT 2015
rsmith added inline comments.
================
Comment at: include/clang/AST/Decl.h:3620
@@ +3619,3 @@
+ public DeclContext,
+ llvm::TrailingObjects<CapturedDecl, ImplicitParamDecl *> {
+protected:
----------------
I would prefer to see an explicit `private` access specifier here.
================
Comment at: include/clang/AST/Decl.h:3638-3642
@@ -3628,6 +3637,7 @@
ImplicitParamDecl **getParams() const {
- return reinterpret_cast<ImplicitParamDecl **>(
- const_cast<CapturedDecl *>(this) + 1);
+ // FIXME: doesn't seem like it should be using a const_cast.
+ return const_cast<CapturedDecl *>(this)
+ ->getTrailingObjects<ImplicitParamDecl *>();
}
----------------
The uses of this below appear to be const-correct; maybe add const and non-const overloads without the `const_cast`?
================
Comment at: include/clang/AST/Decl.h:3702
@@ -3691,2 +3701,3 @@
friend class ASTDeclWriter;
+ friend class TrailingObjects;
};
----------------
I predict one of our supported host compilers will choke on this.
*experiments*
That compiler is MSVC. It appears all our supported compilers provide enough C++11 to allow
friend TrailingObjects;
================
Comment at: include/clang/AST/DeclTemplate.h:47
@@ -45,2 +46,3 @@
/// derived classes.
-class LLVM_ALIGNAS(/*alignof(void*)*/ LLVM_PTR_SIZE) TemplateParameterList {
+class LLVM_ALIGNAS(/*alignof(void*)*/ LLVM_PTR_SIZE) TemplateParameterList final
+ : llvm::TrailingObjects<TemplateParameterList, NamedDecl *> {
----------------
Can you remove the LLVM_ALIGNAS?
================
Comment at: include/clang/AST/DeclTemplate.h:145
@@ -136,4 +144,3 @@
/// derived classes. Suitable for creating on the stack.
-template<size_t N>
-class FixedSizeTemplateParameterList : public TemplateParameterList {
- NamedDecl *Params[N];
+template <size_t N> class FixedSizeTemplateParameterListStorage {
+ char Mem[TemplateParameterList::totalSizeToAlloc<NamedDecl *>(N)];
----------------
This type is now underaligned.
================
Comment at: include/clang/AST/DeclTemplate.h:146
@@ -140,1 +145,3 @@
+template <size_t N> class FixedSizeTemplateParameterListStorage {
+ char Mem[TemplateParameterList::totalSizeToAlloc<NamedDecl *>(N)];
----------------
Do all of our supported compilers provide enough `constexpr` support for this to actually work? How would you feel about:
TemplateParameterList List;
NamedDecl *Params[N];
(Yeah, I don't like this either.)
================
Comment at: include/clang/AST/DeclTemplate.h:165
@@ -151,6 +164,3 @@
/// \brief The template argument list.
- ///
- /// The integer value will be non-zero to indicate that this
- /// template argument list does own the pointer.
- llvm::PointerIntPair<const TemplateArgument *, 1> Arguments;
+ const TemplateArgument *Arguments;
----------------
Please check in the removal of the `Owned` flag separately.
================
Comment at: include/clang/AST/DeclTemplate.h:1290-1302
@@ -1262,15 +1289,15 @@
/// pack.
QualType getExpansionType(unsigned I) const {
assert(I < NumExpandedTypes && "Out-of-range expansion type index");
- void * const *TypesAndInfos = reinterpret_cast<void * const*>(this + 1);
+ void *const *TypesAndInfos = getTrailingObjects<void *>();
return QualType::getFromOpaquePtr(TypesAndInfos[2*I]);
}
/// \brief Retrieve a particular expansion type source info within an
/// expanded parameter pack.
TypeSourceInfo *getExpansionTypeSourceInfo(unsigned I) const {
assert(I < NumExpandedTypes && "Out-of-range expansion type index");
- void * const *TypesAndInfos = reinterpret_cast<void * const*>(this + 1);
+ void *const *TypesAndInfos = getTrailingObjects<void *>();
return static_cast<TypeSourceInfo *>(TypesAndInfos[2*I+1]);
}
----------------
Wow, this is still pretty gross. Can we use `std::pair<QualType, TypeSourceInfo*>` as the trailing object type, or something morally equivalent?
================
Comment at: lib/AST/Decl.cpp:3129
@@ +3128,3 @@
+ void *Buffer = Context.Allocate(
+ totalSizeToAlloc<TemplateArgumentLoc, FunctionTemplateDecl *>(
+ TArgs.size(), Ts.size()));
----------------
Why do you need to specify the types here? Shouldn't they be implied by the type of the `TrailingObjects` base class?
================
Comment at: lib/AST/Decl.cpp:3896
@@ -3893,3 +3895,3 @@
unsigned NumParams) {
- return new (C, DC, NumParams * sizeof(ImplicitParamDecl *))
+ return new (C, DC, additionalSizeToAlloc<ImplicitParamDecl *>(NumParams))
CapturedDecl(DC, NumParams);
----------------
Likewise here.
http://reviews.llvm.org/D11298
More information about the cfe-commits
mailing list