forked from OSchip/llvm-project
Fix one place I missed that was memcpy'ing TypeLocs in a way that messes
up alignment. Fixes utilities/tuple/tuple.tuple/tuple.creation/tuple_cat.pass.cpp from the libc++ testsuite. llvm-svn: 184397
This commit is contained in:
parent
51f0317e52
commit
94e9eaa4d7
|
@ -494,17 +494,6 @@ public:
|
|||
assert(Argument.getKind() == TemplateArgument::TemplateExpansion);
|
||||
return LocInfo.getTemplateEllipsisLoc();
|
||||
}
|
||||
|
||||
/// \brief When the template argument is a pack expansion, returns
|
||||
/// the pattern of the pack expansion.
|
||||
///
|
||||
/// \param Ellipsis Will be set to the location of the ellipsis.
|
||||
///
|
||||
/// \param NumExpansions Will be set to the number of expansions that will
|
||||
/// be generated from this pack expansion, if known a priori.
|
||||
TemplateArgumentLoc getPackExpansionPattern(SourceLocation &Ellipsis,
|
||||
Optional<unsigned> &NumExpansions,
|
||||
ASTContext &Context) const;
|
||||
};
|
||||
|
||||
/// A convenient class for passing around template argument
|
||||
|
|
|
@ -5591,6 +5591,19 @@ public:
|
|||
/// false otherwise.
|
||||
bool containsUnexpandedParameterPacks(Declarator &D);
|
||||
|
||||
/// \brief Returns the pattern of the pack expansion for a template argument.
|
||||
///
|
||||
/// \param OrigLoc The template argument to expand.
|
||||
///
|
||||
/// \param Ellipsis Will be set to the location of the ellipsis.
|
||||
///
|
||||
/// \param NumExpansions Will be set to the number of expansions that will
|
||||
/// be generated from this pack expansion, if known a priori.
|
||||
TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(
|
||||
TemplateArgumentLoc OrigLoc,
|
||||
SourceLocation &Ellipsis,
|
||||
Optional<unsigned> &NumExpansions) const;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// C++ Template Argument Deduction (C++ [temp.deduct])
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -450,68 +450,6 @@ SourceRange TemplateArgumentLoc::getSourceRange() const {
|
|||
llvm_unreachable("Invalid TemplateArgument Kind!");
|
||||
}
|
||||
|
||||
TemplateArgumentLoc TemplateArgumentLoc::getPackExpansionPattern(
|
||||
SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions,
|
||||
ASTContext &Context) const {
|
||||
assert(Argument.isPackExpansion());
|
||||
|
||||
switch (Argument.getKind()) {
|
||||
case TemplateArgument::Type: {
|
||||
// FIXME: We shouldn't ever have to worry about missing
|
||||
// type-source info!
|
||||
TypeSourceInfo *ExpansionTSInfo = getTypeSourceInfo();
|
||||
if (!ExpansionTSInfo)
|
||||
ExpansionTSInfo = Context.getTrivialTypeSourceInfo(
|
||||
getArgument().getAsType(),
|
||||
Ellipsis);
|
||||
PackExpansionTypeLoc Expansion =
|
||||
ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
|
||||
Ellipsis = Expansion.getEllipsisLoc();
|
||||
|
||||
TypeLoc Pattern = Expansion.getPatternLoc();
|
||||
NumExpansions = Expansion.getTypePtr()->getNumExpansions();
|
||||
|
||||
// FIXME: This is horrible. We know where the source location data is for
|
||||
// the pattern, and we have the pattern's type, but we are forced to copy
|
||||
// them into an ASTContext because TypeSourceInfo bundles them together
|
||||
// and TemplateArgumentLoc traffics in TypeSourceInfo pointers.
|
||||
TypeSourceInfo *PatternTSInfo
|
||||
= Context.CreateTypeSourceInfo(Pattern.getType(),
|
||||
Pattern.getFullDataSize());
|
||||
memcpy(PatternTSInfo->getTypeLoc().getOpaqueData(),
|
||||
Pattern.getOpaqueData(), Pattern.getFullDataSize());
|
||||
return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
|
||||
PatternTSInfo);
|
||||
}
|
||||
|
||||
case TemplateArgument::Expression: {
|
||||
PackExpansionExpr *Expansion
|
||||
= cast<PackExpansionExpr>(Argument.getAsExpr());
|
||||
Expr *Pattern = Expansion->getPattern();
|
||||
Ellipsis = Expansion->getEllipsisLoc();
|
||||
NumExpansions = Expansion->getNumExpansions();
|
||||
return TemplateArgumentLoc(Pattern, Pattern);
|
||||
}
|
||||
|
||||
case TemplateArgument::TemplateExpansion:
|
||||
Ellipsis = getTemplateEllipsisLoc();
|
||||
NumExpansions = Argument.getNumTemplateExpansions();
|
||||
return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
|
||||
getTemplateQualifierLoc(),
|
||||
getTemplateNameLoc());
|
||||
|
||||
case TemplateArgument::Declaration:
|
||||
case TemplateArgument::NullPtr:
|
||||
case TemplateArgument::Template:
|
||||
case TemplateArgument::Integral:
|
||||
case TemplateArgument::Pack:
|
||||
case TemplateArgument::Null:
|
||||
return TemplateArgumentLoc();
|
||||
}
|
||||
|
||||
llvm_unreachable("Invalid TemplateArgument Kind!");
|
||||
}
|
||||
|
||||
const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
|
||||
const TemplateArgument &Arg) {
|
||||
switch (Arg.getKind()) {
|
||||
|
|
|
@ -849,3 +849,63 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
|
|||
return new (Context) SizeOfPackExpr(Context.getSizeType(), OpLoc,
|
||||
ParameterPack, NameLoc, RParenLoc);
|
||||
}
|
||||
|
||||
TemplateArgumentLoc
|
||||
Sema::getTemplateArgumentPackExpansionPattern(
|
||||
TemplateArgumentLoc OrigLoc,
|
||||
SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions) const {
|
||||
const TemplateArgument &Argument = OrigLoc.getArgument();
|
||||
assert(Argument.isPackExpansion());
|
||||
switch (Argument.getKind()) {
|
||||
case TemplateArgument::Type: {
|
||||
// FIXME: We shouldn't ever have to worry about missing
|
||||
// type-source info!
|
||||
TypeSourceInfo *ExpansionTSInfo = OrigLoc.getTypeSourceInfo();
|
||||
if (!ExpansionTSInfo)
|
||||
ExpansionTSInfo = Context.getTrivialTypeSourceInfo(Argument.getAsType(),
|
||||
Ellipsis);
|
||||
PackExpansionTypeLoc Expansion =
|
||||
ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
|
||||
Ellipsis = Expansion.getEllipsisLoc();
|
||||
|
||||
TypeLoc Pattern = Expansion.getPatternLoc();
|
||||
NumExpansions = Expansion.getTypePtr()->getNumExpansions();
|
||||
|
||||
// We need to copy the TypeLoc because TemplateArgumentLocs store a
|
||||
// TypeSourceInfo.
|
||||
// FIXME: Find some way to avoid the copy?
|
||||
TypeLocBuilder TLB;
|
||||
TLB.pushFullCopy(Pattern);
|
||||
TypeSourceInfo *PatternTSInfo =
|
||||
TLB.getTypeSourceInfo(Context, Pattern.getType());
|
||||
return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
|
||||
PatternTSInfo);
|
||||
}
|
||||
|
||||
case TemplateArgument::Expression: {
|
||||
PackExpansionExpr *Expansion
|
||||
= cast<PackExpansionExpr>(Argument.getAsExpr());
|
||||
Expr *Pattern = Expansion->getPattern();
|
||||
Ellipsis = Expansion->getEllipsisLoc();
|
||||
NumExpansions = Expansion->getNumExpansions();
|
||||
return TemplateArgumentLoc(Pattern, Pattern);
|
||||
}
|
||||
|
||||
case TemplateArgument::TemplateExpansion:
|
||||
Ellipsis = OrigLoc.getTemplateEllipsisLoc();
|
||||
NumExpansions = Argument.getNumTemplateExpansions();
|
||||
return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
|
||||
OrigLoc.getTemplateQualifierLoc(),
|
||||
OrigLoc.getTemplateNameLoc());
|
||||
|
||||
case TemplateArgument::Declaration:
|
||||
case TemplateArgument::NullPtr:
|
||||
case TemplateArgument::Template:
|
||||
case TemplateArgument::Integral:
|
||||
case TemplateArgument::Pack:
|
||||
case TemplateArgument::Null:
|
||||
return TemplateArgumentLoc();
|
||||
}
|
||||
|
||||
llvm_unreachable("Invalid TemplateArgument Kind!");
|
||||
}
|
||||
|
|
|
@ -3233,8 +3233,8 @@ bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
|
|||
SourceLocation Ellipsis;
|
||||
Optional<unsigned> OrigNumExpansions;
|
||||
TemplateArgumentLoc Pattern
|
||||
= In.getPackExpansionPattern(Ellipsis, OrigNumExpansions,
|
||||
getSema().Context);
|
||||
= getSema().getTemplateArgumentPackExpansionPattern(
|
||||
In, Ellipsis, OrigNumExpansions);
|
||||
|
||||
SmallVector<UnexpandedParameterPack, 2> Unexpanded;
|
||||
getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
|
||||
|
|
Loading…
Reference in New Issue