@@ -122,6 +122,10 @@ std::string Converter::GetUnboxedTypeAsString(clang::QualType qual_type) {
122122 return ToString (qual_type);
123123}
124124
125+ std::string Converter::GetUnboxedDefaultAsString (clang::QualType qual_type) {
126+ return GetDefaultAsString (qual_type);
127+ }
128+
125129std::string
126130Converter::GetTemplateArgumentAsString (const clang::TemplateArgument &arg) {
127131 switch (arg.getKind ()) {
@@ -5041,15 +5045,16 @@ std::string Converter::ConvertTake(clang::Expr *arg) {
50415045
50425046std::string Converter::ConvertMappedMethodCall (
50435047 clang::Expr *expr, const TranslationRule::MethodCallFragment &mc,
5044- clang::Expr **args, unsigned num_args, TempMaterializationCtx *ctx) {
5045- return ConvertIRFragment (mc.receiver , expr, args, num_args, ctx) +
5046- 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);
50475052}
50485053
50495054std::string Converter::GetMappedAsString (clang::Expr *expr, clang::Expr **args,
50505055 unsigned num_args,
50515056 TempMaterializationCtx *ctx) {
5052- auto * tgt_ir = RuleRegistry::GetExprRule (ctx_, expr);
5057+ auto [ tgt_ir, bindings] = RuleRegistry::Search (ctx_, expr);
50535058 if (!tgt_ir)
50545059 return {};
50555060
@@ -5058,8 +5063,8 @@ std::string Converter::GetMappedAsString(clang::Expr *expr, clang::Expr **args,
50585063 auto saved_borrows = std::exchange (mut_borrows_, {});
50595064 auto *operand = tgt_ir->refExprOperand ();
50605065 bool lvalue = operand && !isAddrOf ();
5061- auto result = ConvertIRFragment (lvalue ? *operand : tgt_ir->body , expr, args ,
5062- num_args, ctx);
5066+ auto result = ConvertIRFragment (lvalue ? *operand : tgt_ir->body , bindings ,
5067+ expr, args, num_args, ctx);
50635068 if (tgt_ir->multi_statement ) {
50645069 result = ' {' + result + ' }' ;
50655070 }
@@ -5073,19 +5078,28 @@ std::string Converter::GetMappedAsString(clang::Expr *expr, clang::Expr **args,
50735078
50745079std::string Converter::ConvertIRFragment (
50755080 const std::vector<TranslationRule::BodyFragment> &fragments,
5076- clang::Expr *expr , clang::Expr **args, unsigned num_args ,
5077- TempMaterializationCtx *ctx) {
5081+ llvm::ArrayRef< clang::TemplateArgument> bindings , clang::Expr *expr ,
5082+ clang::Expr **args, unsigned num_args, TempMaterializationCtx *ctx) {
50785083 using namespace TranslationRule ;
50795084
5080- 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+ }
50815089
50825090 std::string result;
50835091 for (auto &frag : fragments) {
50845092 if (auto *t = std::get_if<TextFragment>(&frag)) {
50855093 result += t->text ;
50865094 } else if (auto *g = std::get_if<GenericFragment>(&frag)) {
5087- result += Mapper::InstantiateTemplate (*this , expr, g->n );
5095+ result += GetTemplateArgumentAsString (bindings[g->n - 1 ]);
5096+ } else if (auto *d = std::get_if<DefaultFragment>(&frag)) {
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 ());
50885101 } else if (auto *ph = std::get_if<PlaceholderFragment>(&frag)) {
5102+ assert (expr && " placeholder outside an expression rule" );
50895103 auto arg_idx = ph->n ;
50905104 assert (arg_idx < all_args.size ());
50915105 auto *arg = all_args[arg_idx];
@@ -5110,16 +5124,20 @@ std::string Converter::ConvertIRFragment(
51105124 };
51115125 result += ConvertPlaceholder (expr, arg, ph_ctx);
51125126 } else if (std::get_if<TranslationRule::VaArgsFragment>(&frag)) {
5127+ assert (expr && " variadic arguments outside an expression rule" );
51135128 result += ConvertVariadicTail (expr, all_args);
51145129 } else if (std::get_if<TranslationRule::InitFragment>(&frag)) {
5130+ assert (expr && " init outside an expression rule" );
51155131 result += ConvertInitFragment (expr, all_args);
51165132 } else if (auto *mc =
51175133 std::get_if<std::unique_ptr<MethodCallFragment>>(&frag)) {
5118- result += ConvertMappedMethodCall (expr, **mc, args, num_args, ctx);
5134+ result +=
5135+ ConvertMappedMethodCall (expr, **mc, bindings, args, num_args, ctx);
51195136 } else if (auto *re =
51205137 std::get_if<std::unique_ptr<RefExprFragment>>(&frag)) {
5121- result += (*re)->prefix + ' ' +
5122- ConvertIRFragment ((*re)->inner , expr, args, num_args, ctx);
5138+ result +=
5139+ (*re)->prefix + ' ' +
5140+ ConvertIRFragment ((*re)->inner , bindings, expr, args, num_args, ctx);
51235141 }
51245142 }
51255143
0 commit comments