| 4609 | //----------------------------------------------------------------------------- |
| 4610 | |
| 4611 | void CodeGenerator::InsertTemplateArg(const TemplateArgument& arg) |
| 4612 | { |
| 4613 | switch(arg.getKind()) { |
| 4614 | case TemplateArgument::Type: mOutputFormatHelper.Append(GetName(arg.getAsType())); break; |
| 4615 | case TemplateArgument::Declaration: |
| 4616 | // TODO: handle pointers |
| 4617 | if(const auto decl = dyn_cast_or_null<TemplateParamObjectDecl>(arg.getAsDecl())) { |
| 4618 | mOutputFormatHelper.Append(GetName(*decl)); |
| 4619 | } else { |
| 4620 | mOutputFormatHelper.Append("&"sv, GetName(*arg.getAsDecl(), QualifiedName::Yes)); |
| 4621 | } |
| 4622 | break; |
| 4623 | case TemplateArgument::NullPtr: mOutputFormatHelper.Append(kwNullptr); break; |
| 4624 | case TemplateArgument::Integral: |
| 4625 | |
| 4626 | if(const auto& integral = arg.getAsIntegral(); arg.getIntegralType()->isCharType()) { |
| 4627 | const char c{static_cast<char>(integral.getZExtValue())}; |
| 4628 | mOutputFormatHelper.Append("'"sv, std::string{c}, "'"sv); |
| 4629 | } else { |
| 4630 | mOutputFormatHelper.Append(integral); |
| 4631 | } |
| 4632 | |
| 4633 | break; |
| 4634 | case TemplateArgument::Expression: { |
| 4635 | if(auto val = EvaluateNTTPAsConstantExpr(arg.getAsExpr()->IgnoreParenImpCasts())) { |
| 4636 | mOutputFormatHelper.Append( |
| 4637 | GetName(val->first), |
| 4638 | BuildTemplateParamObjectName(val->second.getAsString(GetGlobalAST(), val->first))); |
| 4639 | } else { |
| 4640 | InsertArg(arg.getAsExpr()); |
| 4641 | } |
| 4642 | } |
| 4643 | |
| 4644 | break; |
| 4645 | case TemplateArgument::Pack: HandleTemplateParameterPack(arg.pack_elements()); break; |
| 4646 | case TemplateArgument::Template: [[fallthrough]]; |
| 4647 | case TemplateArgument::TemplateExpansion: |
| 4648 | if(const auto* tmplDecl = arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) { |
| 4649 | mOutputFormatHelper.Append(GetName(*tmplDecl, QualifiedName::Yes)); |
| 4650 | |
| 4651 | #if IS_CLANG_NEWER_THAN(20) |
| 4652 | } else if(const auto* depName = arg.getAsTemplateOrTemplatePattern().getAsDependentTemplateName(); |
| 4653 | depName->getName().getIdentifier()) { |
| 4654 | InsertNamespace(depName->getQualifier()); |
| 4655 | |
| 4656 | mOutputFormatHelper.Append(kwTemplateSpace, GetName(*depName)); |
| 4657 | #else |
| 4658 | } else if(const auto* depName = arg.getAsTemplateOrTemplatePattern().getAsDependentTemplateName(); |
| 4659 | depName->isIdentifier()) { |
| 4660 | InsertNamespace(depName->getQualifier()); |
| 4661 | |
| 4662 | mOutputFormatHelper.Append(kwTemplateSpace, depName->getIdentifier()->getName()); |
| 4663 | #endif |
| 4664 | } else { |
| 4665 | ToDo(arg, mOutputFormatHelper); |
| 4666 | } |
| 4667 | |
| 4668 | break; |
no test coverage detected