forked from OSchip/llvm-project
Fix overallocation and underalignment of ASTTemplateArgumentListInfo objects.
llvm-svn: 161918
This commit is contained in:
parent
3e45307564
commit
f3bb0b2a9b
|
@ -510,17 +510,23 @@ public:
|
|||
/// This is safe to be used inside an AST node, in contrast with
|
||||
/// TemplateArgumentListInfo.
|
||||
struct ASTTemplateArgumentListInfo {
|
||||
/// \brief The source location of the left angle bracket ('<');
|
||||
/// \brief The source location of the left angle bracket ('<').
|
||||
SourceLocation LAngleLoc;
|
||||
|
||||
/// \brief The source location of the right angle bracket ('>');
|
||||
/// \brief The source location of the right angle bracket ('>').
|
||||
SourceLocation RAngleLoc;
|
||||
|
||||
/// \brief The number of template arguments in TemplateArgs.
|
||||
/// The actual template arguments (if any) are stored after the
|
||||
/// ExplicitTemplateArgumentList structure.
|
||||
unsigned NumTemplateArgs;
|
||||
|
||||
union {
|
||||
/// \brief The number of template arguments in TemplateArgs.
|
||||
/// The actual template arguments (if any) are stored after the
|
||||
/// ExplicitTemplateArgumentList structure.
|
||||
unsigned NumTemplateArgs;
|
||||
|
||||
/// Force ASTTemplateArgumentListInfo to the right alignment
|
||||
/// for the following array of TemplateArgumentLocs.
|
||||
void *Aligner;
|
||||
};
|
||||
|
||||
/// \brief Retrieve the template arguments
|
||||
TemplateArgumentLoc *getTemplateArgs() {
|
||||
return reinterpret_cast<TemplateArgumentLoc *> (this + 1);
|
||||
|
|
|
@ -556,8 +556,7 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
|
|||
const ASTTemplateArgumentListInfo *
|
||||
ASTTemplateArgumentListInfo::Create(ASTContext &C,
|
||||
const TemplateArgumentListInfo &List) {
|
||||
std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
|
||||
ASTTemplateArgumentListInfo::sizeFor(List.size());
|
||||
std::size_t size = ASTTemplateArgumentListInfo::sizeFor(List.size());
|
||||
void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>());
|
||||
ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo();
|
||||
TAI->initializeFrom(List);
|
||||
|
@ -642,6 +641,7 @@ ASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc) {
|
|||
std::size_t
|
||||
ASTTemplateKWAndArgsInfo::sizeFor(unsigned NumTemplateArgs) {
|
||||
// Add space for the template keyword location.
|
||||
// FIXME: There's room for this in the padding before the template args in
|
||||
// 64-bit builds.
|
||||
return Base::sizeFor(NumTemplateArgs) + sizeof(SourceLocation);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue