@@ -5045,15 +5045,16 @@ std::string Converter::ConvertTake(clang::Expr *arg) {
50455045
50465046std::string Converter::ConvertMappedMethodCall (
50475047 clang::Expr *expr, const TranslationRule::MethodCallFragment &mc,
5048- clang::Expr **args, unsigned num_args, TempMaterializationCtx *ctx) {
5049- return ConvertIRFragment (mc.receiver , expr, args, num_args, ctx) +
5050- ConvertIRFragment (mc.body , expr, args, num_args, ctx);
5048+ llvm::ArrayRef<clang::TemplateArgument> bindings, clang::Expr **args,
5049+ unsigned num_args, TempMaterializationCtx *ctx) {
5050+ return ConvertIRFragment (mc.receiver , bindings, expr, args, num_args, ctx) +
5051+ ConvertIRFragment (mc.body , bindings, expr, args, num_args, ctx);
50515052}
50525053
50535054std::string Converter::GetMappedAsString (clang::Expr *expr, clang::Expr **args,
50545055 unsigned num_args,
50555056 TempMaterializationCtx *ctx) {
5056- auto * tgt_ir = RuleRegistry::GetExprRule (ctx_, expr);
5057+ auto [ tgt_ir, bindings] = RuleRegistry::Search (ctx_, expr);
50575058 if (!tgt_ir)
50585059 return {};
50595060
@@ -5062,8 +5063,8 @@ std::string Converter::GetMappedAsString(clang::Expr *expr, clang::Expr **args,
50625063 auto saved_borrows = std::exchange (mut_borrows_, {});
50635064 auto *operand = tgt_ir->refExprOperand ();
50645065 bool lvalue = operand && !isAddrOf ();
5065- auto result = ConvertIRFragment (lvalue ? *operand : tgt_ir->body , expr, args ,
5066- num_args, ctx);
5066+ auto result = ConvertIRFragment (lvalue ? *operand : tgt_ir->body , bindings ,
5067+ expr, args, num_args, ctx);
50675068 if (tgt_ir->multi_statement ) {
50685069 result = ' {' + result + ' }' ;
50695070 }
@@ -5077,21 +5078,28 @@ std::string Converter::GetMappedAsString(clang::Expr *expr, clang::Expr **args,
50775078
50785079std::string Converter::ConvertIRFragment (
50795080 const std::vector<TranslationRule::BodyFragment> &fragments,
5080- clang::Expr *expr , clang::Expr **args, unsigned num_args ,
5081- TempMaterializationCtx *ctx) {
5081+ llvm::ArrayRef< clang::TemplateArgument> bindings , clang::Expr *expr ,
5082+ clang::Expr **args, unsigned num_args, TempMaterializationCtx *ctx) {
50825083 using namespace TranslationRule ;
50835084
5084- auto all_args = BuildUnifiedArgs (expr, args, num_args);
5085+ std::vector<clang::Expr *> all_args;
5086+ if (expr) {
5087+ all_args = BuildUnifiedArgs (expr, args, num_args);
5088+ }
50855089
50865090 std::string result;
50875091 for (auto &frag : fragments) {
50885092 if (auto *t = std::get_if<TextFragment>(&frag)) {
50895093 result += t->text ;
50905094 } else if (auto *g = std::get_if<GenericFragment>(&frag)) {
5091- result += Mapper::InstantiateTemplate (* this , expr, g->n );
5095+ result += GetTemplateArgumentAsString (bindings[ g->n - 1 ] );
50925096 } else if (auto *d = std::get_if<DefaultFragment>(&frag)) {
5093- result += Mapper::InstantiateTemplateDefault (*this , expr, d->n );
5097+ auto &arg = bindings[d->n - 1 ];
5098+ assert (arg.getKind () == clang::TemplateArgument::Type &&
5099+ " default of a non-type generic" );
5100+ result += GetUnboxedDefaultAsString (arg.getAsType ());
50945101 } else if (auto *ph = std::get_if<PlaceholderFragment>(&frag)) {
5102+ assert (expr && " placeholder outside an expression rule" );
50955103 auto arg_idx = ph->n ;
50965104 assert (arg_idx < all_args.size ());
50975105 auto *arg = all_args[arg_idx];
@@ -5116,16 +5124,20 @@ std::string Converter::ConvertIRFragment(
51165124 };
51175125 result += ConvertPlaceholder (expr, arg, ph_ctx);
51185126 } else if (std::get_if<TranslationRule::VaArgsFragment>(&frag)) {
5127+ assert (expr && " variadic arguments outside an expression rule" );
51195128 result += ConvertVariadicTail (expr, all_args);
51205129 } else if (std::get_if<TranslationRule::InitFragment>(&frag)) {
5130+ assert (expr && " init outside an expression rule" );
51215131 result += ConvertInitFragment (expr, all_args);
51225132 } else if (auto *mc =
51235133 std::get_if<std::unique_ptr<MethodCallFragment>>(&frag)) {
5124- result += ConvertMappedMethodCall (expr, **mc, args, num_args, ctx);
5134+ result +=
5135+ ConvertMappedMethodCall (expr, **mc, bindings, args, num_args, ctx);
51255136 } else if (auto *re =
51265137 std::get_if<std::unique_ptr<RefExprFragment>>(&frag)) {
51275138 result += (*re)->prefix + ' ' +
5128- ConvertIRFragment ((*re)->inner , expr, args, num_args, ctx);
5139+ ConvertIRFragment ((*re)->inner , bindings, expr, args, num_args,
5140+ ctx);
51295141 }
51305142 }
51315143
0 commit comments