forked from OSchip/llvm-project
Add Decl::isParameterPack(), which covers both function and template
parameter packs, along with ParmVarDecl::isParameterPack(), which looks for function parameter packs. Use these routines to fix some obvious FIXMEs. llvm-svn: 122904
This commit is contained in:
parent
f491ee2ea6
commit
3c6bd2ad38
|
@ -1133,6 +1133,10 @@ public:
|
|||
return getType();
|
||||
}
|
||||
|
||||
/// \brief Determine whether this parameter is actually a function
|
||||
/// parameter pack.
|
||||
bool isParameterPack() const;
|
||||
|
||||
/// setOwningFunction - Sets the function declaration that owns this
|
||||
/// ParmVarDecl. Since ParmVarDecls are often created before the
|
||||
/// FunctionDecls that own them, this routine is required to update
|
||||
|
|
|
@ -567,6 +567,9 @@ public:
|
|||
/// template parameter pack.
|
||||
bool isTemplateParameterPack() const;
|
||||
|
||||
/// \brief Whether this declaration is a parameter pack.
|
||||
bool isParameterPack() const;
|
||||
|
||||
/// \brief Whether this declaration is a function or function template.
|
||||
bool isFunctionOrFunctionTemplate() const;
|
||||
|
||||
|
|
|
@ -1221,6 +1221,10 @@ SourceRange ParmVarDecl::getDefaultArgRange() const {
|
|||
return SourceRange();
|
||||
}
|
||||
|
||||
bool ParmVarDecl::isParameterPack() const {
|
||||
return isa<PackExpansionType>(getType());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// FunctionDecl Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -119,6 +119,13 @@ bool Decl::isTemplateParameterPack() const {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool Decl::isParameterPack() const {
|
||||
if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(this))
|
||||
return Parm->isParameterPack();
|
||||
|
||||
return isTemplateParameterPack();
|
||||
}
|
||||
|
||||
bool Decl::isFunctionOrFunctionTemplate() const {
|
||||
if (const UsingShadowDecl *UD = dyn_cast<UsingShadowDecl>(this))
|
||||
return UD->getTargetDecl()->isFunctionOrFunctionTemplate();
|
||||
|
|
|
@ -211,11 +211,8 @@ void DeclRefExpr::computeDependence() {
|
|||
// Determine whether this expression contains any unexpanded parameter
|
||||
// packs.
|
||||
// Is the declaration a parameter pack?
|
||||
if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
|
||||
if (NTTP->isParameterPack())
|
||||
ExprBits.ContainsUnexpandedParameterPack = true;
|
||||
}
|
||||
// FIXME: Variadic templates function parameter packs.
|
||||
if (D->isParameterPack())
|
||||
ExprBits.ContainsUnexpandedParameterPack = true;
|
||||
}
|
||||
|
||||
DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
|
||||
|
|
|
@ -602,9 +602,8 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
|
|||
case LookupResult::NotFoundInCurrentInstantiation:
|
||||
if (DeclarationName CorrectedName = CorrectTypo(R, S, 0, 0, false,
|
||||
CTC_NoKeywords)) {
|
||||
// FIXME: Variadic templates function parameter packs.
|
||||
if (NamedDecl *CorrectedResult = R.getAsSingle<NamedDecl>())
|
||||
if (CorrectedResult->isTemplateParameterPack()) {
|
||||
if (CorrectedResult->isParameterPack()) {
|
||||
ParameterPack = CorrectedResult;
|
||||
Diag(NameLoc, diag::err_sizeof_pack_no_pack_name_suggest)
|
||||
<< &Name << CorrectedName
|
||||
|
@ -624,8 +623,7 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
|
|||
return ExprError();
|
||||
}
|
||||
|
||||
// FIXME: Variadic templates function parameter packs.
|
||||
if (!ParameterPack || !ParameterPack->isTemplateParameterPack()) {
|
||||
if (!ParameterPack || !ParameterPack->isParameterPack()) {
|
||||
Diag(NameLoc, diag::err_sizeof_pack_no_pack_name)
|
||||
<< &Name;
|
||||
return ExprError();
|
||||
|
|
Loading…
Reference in New Issue