Skip to content

Commit d00b40e

Browse files
committed
Use template syntax to declare rules for variadic functions
This allows writing ```cpp template <typename... Args> int f1(int a0, int a1, Args... args) { return fcntl(a0, a1, args...); } ``` Which becomes `f1: int fcntl(int, int, ...)`
1 parent 30f66a9 commit d00b40e

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

cpp2rust/converter/mapper.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,12 @@ std::string ToString(const clang::NamedDecl *decl) {
804804
}
805805
os << ToString(func_decl->getParamDecl(i)->getType());
806806
}
807+
if (func_decl->isVariadic()) {
808+
if (func_decl->getNumParams()) {
809+
os << ", ";
810+
}
811+
os << "...";
812+
}
807813
os << ')';
808814

809815
if (const auto *method_decl =

cpp2rust/cpp_rule_preprocessor.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,10 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
349349
createTemplateArguments(clang::TemplateDecl *decl,
350350
llvm::SmallVectorImpl<clang::TemplateArgument> &out) {
351351
for (clang::NamedDecl *param : *decl->getTemplateParameters()) {
352-
if (llvm::isa<clang::TemplateTypeParmDecl>(param)) {
352+
if (param->isTemplateParameterPack()) {
353+
out.emplace_back(
354+
clang::TemplateArgument::CreatePackCopy(sema_->Context, {}));
355+
} else if (llvm::isa<clang::TemplateTypeParmDecl>(param)) {
353356
clang::RecordDecl *rdecl = createRecordDecl(param->getName());
354357
clang::QualType type =
355358
sema_->Context.getTagType(clang::ElaboratedTypeKeyword::None,
@@ -409,7 +412,14 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
409412
clang::OverloadCandidateSet &candidates) {
410413
clang::LookupResult decls(*sema_, name, loc_,
411414
clang::Sema::LookupOrdinaryName);
412-
sema_->LookupQualifiedName(decls, sema_->getStdNamespace());
415+
if (clang::NamespaceDecl *std_ns = sema_->getStdNamespace()) {
416+
sema_->LookupQualifiedName(decls, std_ns);
417+
}
418+
if (decls.empty()) {
419+
decls.clear();
420+
sema_->LookupQualifiedName(decls,
421+
sema_->Context.getTranslationUnitDecl());
422+
}
413423
for (auto *ndecl : decls) {
414424
if (auto *candidate = createCandidate(ndecl, callArgs, explicitTArgs)) {
415425
sema_->AddOverloadCandidate(
@@ -573,6 +583,7 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
573583
cxxConstructorNameLookup(rule->getReturnType(), callArgs, candidates);
574584
break;
575585
case LookupKind::ADL:
586+
regularNameLookup(callArgs, &explicitTArgs, name, candidates);
576587
adlLookup(callArgs, name, candidates);
577588
break;
578589
}

0 commit comments

Comments
 (0)