@@ -94,7 +94,7 @@ void Converter::EmitGlobalInits(Model model, std::string &out) {
9494
9595void Converter::EmitOpaqueRecords (std::string &out) {
9696 record_decls_.ForEachUndefined ([&](const std::string &name) {
97- out += " #[derive(Clone, Copy, Default, ByteRepr)]" ;
97+ out += " #[derive(Clone, Copy, Default, ByteRepr, VaArg, FnPtrArg )]" ;
9898 out += " pub struct " ;
9999 out += name;
100100 out += " ;\n " ;
@@ -1113,7 +1113,7 @@ std::string Converter::GetCtorName(clang::CXXConstructorDecl *decl) {
11131113 CanUseCopyOrMoveName (decl, name)) {
11141114 return name;
11151115 }
1116- return GetOverloadedFunctionName ( decl);
1116+ return std::format ( " new_{} " , GetCtorIndex ( decl) );
11171117 }
11181118 return GetNumberOfConvertingCtors (decl->getParent ()) != 1
11191119 ? std::format (" new_{}" , GetCtorIndex (decl))
@@ -2182,8 +2182,15 @@ Converter::ConvertCallExpr(clang::CallExpr *expr) {
21822182 } else if (IsTransparentStdCall (expr)) {
21832183 Convert (expr->getArg (0 ));
21842184 } else if (IsBuiltinConstantP (callee)) {
2185- StrCat (expr->getArg (0 )->isCXX11ConstantExpr (ctx_) ? token::kOne
2186- : token::kZero );
2185+ clang::APValue V;
2186+ StrCat (expr->getArg (0 )->isCXX11ConstantExpr (ctx_
2187+ #if CLANG_VERSION_MAJOR >= 24
2188+ ,
2189+ V
2190+ #endif
2191+ )
2192+ ? token::kOne
2193+ : token::kZero );
21872194 } else if (Mapper::Contains (ctx_, callee)) {
21882195 auto **args = expr->getArgs ();
21892196 auto num_args = expr->getNumArgs ();
@@ -4052,28 +4059,13 @@ std::string Converter::ConvertVarDefaultInit(clang::QualType qual_type) {
40524059}
40534060
40544061std::string
4055- Converter::GetOverloadedFunctionName (const clang::FunctionDecl *decl) {
4062+ Converter::GetOverloadedFunctionName (const clang::CXXMethodDecl *decl) {
40564063 auto name = GetFunctionBaseName (decl);
40574064 if (auto *conversion = clang::dyn_cast<clang::CXXConversionDecl>(decl)) {
40584065 name = GetConversionName (
40594066 conversion, GetUnsafeTypeAsString (conversion->getConversionType ()));
40604067 }
4061- if (auto *ctor = clang::dyn_cast<clang::CXXConstructorDecl>(decl);
4062- ctor && !ctor->getParent ()->getIdentifier ()) {
4063- name = GetRecordName (ctor->getParent ());
4064- }
4065-
4066- if (decl->getNumParams () != 0U ) {
4067- name += ' _' ;
4068- }
4069-
4070- for (auto *parameter : decl->parameters ()) {
4071- name += GetUnsafeTypeAsString (parameter->getType ());
4072- if (parameter->getType ()->isRValueReferenceType ()) {
4073- name += " _rv" ;
4074- }
4075- name += ' _' ;
4076- }
4068+ name += std::format (" _{}" , GetMethodIndex (decl));
40774069
40784070 if (const auto *targs = decl->getTemplateSpecializationArgs ()) {
40794071 std::vector<clang::TemplateArgument> args;
@@ -4102,31 +4094,6 @@ Converter::GetOverloadedFunctionName(const clang::FunctionDecl *decl) {
41024094 }
41034095 }
41044096
4105- auto pred = [](char ch) { return ch != ' ' && ch != ' _' ; };
4106- name.erase (std::find_if (name.rbegin (), name.rend (), pred).base (), name.end ());
4107-
4108- if (decl->isVariadic ()) {
4109- name += " _va" ;
4110- }
4111- if (const auto *method = clang::dyn_cast<clang::CXXMethodDecl>(decl)) {
4112- if (method->isConst ()) {
4113- name += " _const" ;
4114- }
4115- if (method->isVolatile ()) {
4116- name += " _volatile" ;
4117- }
4118- switch (method->getRefQualifier ()) {
4119- case clang::RQ_LValue:
4120- name += " _lref" ;
4121- break ;
4122- case clang::RQ_RValue:
4123- name += " _rref" ;
4124- break ;
4125- case clang::RQ_None:
4126- break ;
4127- }
4128- }
4129-
41304097 ToIdentifier (name);
41314098 return name;
41324099}
@@ -4156,6 +4123,10 @@ Converter::GetStructAttributes(const clang::RecordDecl *decl) {
41564123 struct_attrs.emplace_back (" Clone" );
41574124 }
41584125
4126+ if (RecordImplementsClone (decl)) {
4127+ struct_attrs.emplace_back (" VaArg" );
4128+ }
4129+
41594130 if (RecordDerivesDefault (decl)) {
41604131 struct_attrs.emplace_back (" Default" );
41614132 }
@@ -4647,6 +4618,11 @@ void Converter::AddCloneTrait(const clang::RecordDecl *decl) {
46474618 : std::format (" as *mut {}" , record_name)));
46484619}
46494620
4621+ bool Converter::RecordImplementsClone (const clang::RecordDecl *decl) {
4622+ return HasDefaultedCopyConstructor (decl) ||
4623+ GetUserDefinedCopyConstructor (decl) != nullptr ;
4624+ }
4625+
46504626void Converter::AddDefaultTraitForUnion (const clang::RecordDecl *decl) {
46514627 StrCat (std::format (" impl Default for {}" , GetRecordName (decl)));
46524628 PushBrace impl_brace (*this );
0 commit comments