@@ -172,6 +172,11 @@ bool ConverterRefCount::VisitPointerType(clang::PointerType *type) {
172172 return false ;
173173 }
174174
175+ if (IsVaListType (ctx_, clang::QualType (type, 0 ))) {
176+ StrCat (" VaList" );
177+ return false ;
178+ }
179+
175180 if (type->isVoidPointerType ()) {
176181 StrCat (" AnyPtr" );
177182 return false ;
@@ -472,6 +477,17 @@ void ConverterRefCount::EmitFunctionPreamble(clang::FunctionDecl *decl) {
472477 }
473478}
474479
480+ void ConverterRefCount::ConvertVaListVarDecl (clang::VarDecl *decl) {
481+ if (clang::isa<clang::ParmVarDecl>(decl)) {
482+ // va_list parameter (decayed to __va_list_tag *): emit "mut ap: VaList"
483+ } else {
484+ // va_list local variable: emit "let mut ap: VaList"
485+ StrCat (keyword::kLet );
486+ }
487+
488+ StrCat (GetNamedDeclAsString (decl), token::kColon , " Value<VaList>" );
489+ }
490+
475491bool ConverterRefCount::ConvertLambdaVarDecl (clang::VarDecl *decl) {
476492 return false ;
477493}
@@ -775,6 +791,11 @@ void ConverterRefCount::ConvertPrintf(clang::CallExpr *expr) {
775791}
776792
777793bool ConverterRefCount::VisitCallExpr (clang::CallExpr *expr) {
794+ if (IsBuiltinVaStart (expr) || IsBuiltinVaEnd (expr) || IsBuiltinVaCopy (expr)) {
795+ ConvertVAArgCall (expr);
796+ return false ;
797+ }
798+
778799 if (expr->isCallToStdMove ()) {
779800 if (IsUniquePtr (expr->getArg (0 )->getType ())) {
780801 StrCat (std::format (" {}.take()" , ConvertLValue (expr->getArg (0 ))));
@@ -912,6 +933,10 @@ bool ConverterRefCount::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
912933 }
913934
914935 if (expr->getCastKind () == clang::CastKind::CK_ArrayToPointerDecay) {
936+ if (IsVaListType (ctx_, sub_expr->getType ())) {
937+ Convert (sub_expr);
938+ return false ;
939+ }
915940 if (clang::isa<clang::StringLiteral>(sub_expr) ||
916941 clang::isa<clang::PredefinedExpr>(sub_expr)) {
917942 StrCat (std::format (" Ptr::from_string_literal({})" , ToString (sub_expr)));
@@ -1366,6 +1391,18 @@ bool ConverterRefCount::VisitImplicitValueInitExpr(
13661391 return Converter::VisitImplicitValueInitExpr (expr);
13671392}
13681393
1394+ bool ConverterRefCount::VisitVAArgExpr (clang::VAArgExpr *expr) {
1395+ auto va_list_expr = expr->getSubExpr ();
1396+ if (auto *cast = clang::dyn_cast<clang::ImplicitCastExpr>(va_list_expr)) {
1397+ va_list_expr = cast->getSubExpr ();
1398+ }
1399+ StrCat (ConvertLValue (va_list_expr));
1400+ StrCat (" .arg::<" );
1401+ Convert (expr->getType ());
1402+ StrCat (" >()" );
1403+ return false ;
1404+ }
1405+
13691406bool ConverterRefCount::VisitCXXDefaultArgExpr (clang::CXXDefaultArgExpr *expr) {
13701407 return Converter::VisitCXXDefaultArgExpr (expr);
13711408}
0 commit comments