Skip to content

Commit 14db663

Browse files
committed
Consume is_va_arg attr from IR
1 parent e85dcbf commit 14db663

4 files changed

Lines changed: 35 additions & 1 deletion

File tree

cpp2rust/converter/converter.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4132,6 +4132,8 @@ std::string Converter::ConvertIRFragment(
41324132
.is_index_base = ph->is_index_base,
41334133
};
41344134
result += ConvertPlaceholder(expr, arg, ph_ctx);
4135+
} else if (std::get_if<TranslationRule::VaArgsFragment>(&frag)) {
4136+
result += ConvertVariadicTail(expr, all_args);
41354137
} else if (auto *mc =
41364138
std::get_if<std::unique_ptr<MethodCallFragment>>(&frag)) {
41374139
result += ConvertMappedMethodCall(expr, **mc, args, num_args, ctx);
@@ -4141,6 +4143,25 @@ std::string Converter::ConvertIRFragment(
41414143
return result;
41424144
}
41434145

4146+
std::string
4147+
Converter::ConvertVariadicTail(clang::Expr *expr,
4148+
const std::vector<clang::Expr *> &all_args) {
4149+
const auto *tgt_ir = Mapper::GetExprRule(GetCalleeOrExpr(expr));
4150+
unsigned fixed = tgt_ir ? tgt_ir->params.size() : 0;
4151+
4152+
Buffer buf(*this);
4153+
StrCat("&[");
4154+
for (unsigned i = fixed; i < all_args.size(); ++i) {
4155+
{
4156+
PushParen p(*this);
4157+
ConvertVariadicArg(all_args[i]);
4158+
}
4159+
StrCat(".into()", token::kComma);
4160+
}
4161+
StrCat("]");
4162+
return std::move(buf).str();
4163+
}
4164+
41444165
std::string Converter::AccessLValueObject(clang::MemberExpr *member) {
41454166
auto *object = member->getBase();
41464167
auto type = object->getType();

cpp2rust/converter/converter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,9 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
563563
std::string ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg,
564564
const PlaceholderCtx &ph_ctx);
565565

566+
std::string ConvertVariadicTail(clang::Expr *expr,
567+
const std::vector<clang::Expr *> &all_args);
568+
566569
virtual std::string ConvertMappedMethodCall(
567570
clang::Expr *expr, const TranslationRule::MethodCallFragment &mc,
568571
clang::Expr **args, unsigned num_args, TempMaterializationCtx *ctx);

cpp2rust/converter/translation_rule.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ std::vector<BodyFragment> ParseBodyFragmentsJSON(const llvm::json::Array &arr) {
8080
} else if (auto *mc = frag_obj->getObject("method_call")) {
8181
result.push_back(std::make_unique<MethodCallFragment>(
8282
ParseMethodCallFragmentJSON(*mc)));
83+
} else if (frag_obj->get("va_args")) {
84+
result.push_back(VaArgsFragment{});
8385
}
8486
}
8587
return result;
@@ -222,6 +224,8 @@ void BodyFragmentDump(const BodyFragment &frag) {
222224
p->dump();
223225
} else if (auto *g = std::get_if<GenericFragment>(&frag)) {
224226
g->dump();
227+
} else if (auto *v = std::get_if<VaArgsFragment>(&frag)) {
228+
v->dump();
225229
} else if (auto *mc =
226230
std::get_if<std::unique_ptr<MethodCallFragment>>(&frag)) {
227231
(*mc)->dump();
@@ -232,6 +236,8 @@ void BodyFragmentDump(const BodyFragment &frag) {
232236

233237
void TextFragment::dump() const { log() << " text: \"" << text << "\"\n"; }
234238

239+
void VaArgsFragment::dump() const { log() << " va_args\n"; }
240+
235241
void PlaceholderFragment::dump() const {
236242
log() << " placeholder: " << n;
237243
switch (access) {

cpp2rust/converter/translation_rule.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,15 @@ struct GenericFragment {
3939
void dump() const;
4040
};
4141

42+
struct VaArgsFragment {
43+
void dump() const;
44+
};
45+
4246
struct MethodCallFragment; // forward declaration
4347

4448
using BodyFragment =
4549
std::variant<TextFragment, PlaceholderFragment, GenericFragment,
46-
std::unique_ptr<MethodCallFragment>>;
50+
VaArgsFragment, std::unique_ptr<MethodCallFragment>>;
4751

4852
struct MethodCallFragment {
4953
std::vector<BodyFragment> receiver;

0 commit comments

Comments
 (0)