diff options
Diffstat (limited to 'lib/AST')
-rw-r--r-- | lib/AST/ExprCXX.cpp | 28 | ||||
-rw-r--r-- | lib/AST/ExprClassification.cpp | 1 | ||||
-rw-r--r-- | lib/AST/ExprConstant.cpp | 1 | ||||
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 5 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 6 | ||||
-rw-r--r-- | lib/AST/StmtProfile.cpp | 7 |
6 files changed, 48 insertions, 0 deletions
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 0426e59a74..2c790bd273 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -1056,3 +1056,31 @@ Stmt::child_iterator SizeOfPackExpr::child_begin() { Stmt::child_iterator SizeOfPackExpr::child_end() { return child_iterator(); } + +SubstNonTypeTemplateParmPackExpr:: +SubstNonTypeTemplateParmPackExpr(QualType T, + NonTypeTemplateParmDecl *Param, + SourceLocation NameLoc, + const TemplateArgument &ArgPack) + : Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary, + true, false, true), + Param(Param), Arguments(ArgPack.pack_begin()), + NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) { } + +TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { + return TemplateArgument(Arguments, NumArguments); +} + +SourceRange SubstNonTypeTemplateParmPackExpr::getSourceRange() const { + return NameLoc; +} + +Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_begin() { + return child_iterator(); +} + +Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_end() { + return child_iterator(); +} + + diff --git a/lib/AST/ExprClassification.cpp b/lib/AST/ExprClassification.cpp index a9ebe6fdb3..c9f4fa8daa 100644 --- a/lib/AST/ExprClassification.cpp +++ b/lib/AST/ExprClassification.cpp @@ -152,6 +152,7 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) { case Expr::ParenListExprClass: case Expr::InitListExprClass: case Expr::SizeOfPackExprClass: + case Expr::SubstNonTypeTemplateParmPackExprClass: return Cl::CL_PRValue; // Next come the complicated cases. diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 57ceb3f481..cb73810163 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -2645,6 +2645,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { case Expr::NoStmtClass: case Expr::OpaqueValueExprClass: case Expr::PackExpansionExprClass: + case Expr::SubstNonTypeTemplateParmPackExprClass: return ICEDiag(2, E->getLocStart()); case Expr::SizeOfPackExprClass: diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 0ebd7da679..2f8be294f2 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -1948,6 +1948,11 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { break; } + case Expr::SubstNonTypeTemplateParmPackExprClass: + mangleTemplateParameter( + cast<SubstNonTypeTemplateParmPackExpr>(E)->getParameterPack()->getIndex()); + break; + case Expr::DependentScopeDeclRefExprClass: { const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E); NestedNameSpecifier *NNS = DRE->getQualifier(); diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 2c8504357e..4c18a526bb 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -15,6 +15,7 @@ #include "clang/AST/StmtVisitor.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" +#include "clang/AST/DeclTemplate.h" #include "clang/AST/PrettyPrinter.h" #include "llvm/Support/Format.h" #include "clang/AST/Expr.h" @@ -1255,6 +1256,11 @@ void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { OS << "sizeof...(" << E->getPack()->getNameAsString() << ")"; } +void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr( + SubstNonTypeTemplateParmPackExpr *Node) { + OS << Node->getParameterPack()->getNameAsString(); +} + // Obj-C void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index 232f48e1ee..e75c274015 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -841,6 +841,13 @@ void StmtProfiler::VisitSizeOfPackExpr(SizeOfPackExpr *S) { VisitDecl(S->getPack()); } +void StmtProfiler::VisitSubstNonTypeTemplateParmPackExpr( + SubstNonTypeTemplateParmPackExpr *S) { + VisitExpr(S); + VisitDecl(S->getParameterPack()); + VisitTemplateArgument(S->getArgumentPack()); +} + void StmtProfiler::VisitOpaqueValueExpr(OpaqueValueExpr *E) { VisitExpr(E); } |