diff options
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index d84d0ca1..0d96d18 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1899,8 +1899,7 @@ namespace { private: ExprResult - transformNonTypeTemplateParmRef(Decl *AssociatedDecl, - const NonTypeTemplateParmDecl *parm, + transformNonTypeTemplateParmRef(Decl *AssociatedDecl, const NamedDecl *parm, SourceLocation loc, TemplateArgument arg, UnsignedOrNone PackIndex, bool Final); }; @@ -2338,22 +2337,25 @@ TemplateInstantiator::TransformOpenACCRoutineDeclAttr( } ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef( - Decl *AssociatedDecl, const NonTypeTemplateParmDecl *parm, - SourceLocation loc, TemplateArgument arg, UnsignedOrNone PackIndex, - bool Final) { + Decl *AssociatedDecl, const NamedDecl *parm, SourceLocation loc, + TemplateArgument arg, UnsignedOrNone PackIndex, bool Final) { ExprResult result; // Determine the substituted parameter type. We can usually infer this from // the template argument, but not always. auto SubstParamType = [&] { - QualType T; - if (parm->isExpandedParameterPack()) - T = parm->getExpansionType(*SemaRef.ArgPackSubstIndex); - else - T = parm->getType(); - if (parm->isParameterPack() && isa<PackExpansionType>(T)) - T = cast<PackExpansionType>(T)->getPattern(); - return SemaRef.SubstType(T, TemplateArgs, loc, parm->getDeclName()); + if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(parm)) { + QualType T; + if (NTTP->isExpandedParameterPack()) + T = NTTP->getExpansionType(*SemaRef.ArgPackSubstIndex); + else + T = NTTP->getType(); + if (parm->isParameterPack() && isa<PackExpansionType>(T)) + T = cast<PackExpansionType>(T)->getPattern(); + return SemaRef.SubstType(T, TemplateArgs, loc, parm->getDeclName()); + } + return SemaRef.SubstType(arg.getAsExpr()->getType(), TemplateArgs, loc, + parm->getDeclName()); }; bool refParam = false; @@ -2408,7 +2410,9 @@ ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef( Expr *resultExpr = result.get(); return new (SemaRef.Context) SubstNonTypeTemplateParmExpr( resultExpr->getType(), resultExpr->getValueKind(), loc, resultExpr, - AssociatedDecl, parm->getIndex(), PackIndex, refParam, Final); + AssociatedDecl, + clang::getDepthAndIndex(const_cast<NamedDecl *>(parm)).second, PackIndex, + refParam, Final); } ExprResult |