@@ -650,6 +650,10 @@ bool Converter::RecordDerivesDefault(const clang::RecordDecl *decl) {
650650 }
651651
652652 for (auto f : decl->fields ()) {
653+ if (f->hasInClassInitializer ()) {
654+ return false ;
655+ }
656+
653657 // Records that contain function pointer do not derive Default
654658 if (auto ptr_ty = f->getType ()->getAs <clang::PointerType>()) {
655659 if (ptr_ty->getPointeeType ()->isFunctionType ()) {
@@ -1062,9 +1066,17 @@ std::string Converter::GetMethodName(const clang::CXXMethodDecl *decl) {
10621066 if (clang::isa<clang::CXXDestructorDecl>(decl)) {
10631067 return kDestructorName ;
10641068 }
1069+ if (const char *name = GetCopyOrMoveName (decl);
1070+ name && CanUseCopyOrMoveName (decl, name)) {
1071+ return name;
1072+ }
10651073 if (IsOverloadedMethod (decl)) {
10661074 return GetOverloadedFunctionName (decl);
10671075 }
1076+ if (auto *conversion = clang::dyn_cast<clang::CXXConversionDecl>(decl)) {
1077+ return GetConversionName (
1078+ conversion, GetUnsafeTypeAsString (conversion->getConversionType ()));
1079+ }
10681080 return GetNamedDeclAsString (decl);
10691081}
10701082
@@ -1107,12 +1119,15 @@ std::string Converter::GetSelfMaybeWithMut(const clang::CXXMethodDecl *decl) {
11071119
11081120std::string Converter::GetCtorName (clang::CXXConstructorDecl *decl) {
11091121 if (decl->isCopyOrMoveConstructor ()) {
1122+ if (const char *name = GetCopyOrMoveName (decl);
1123+ CanUseCopyOrMoveName (decl, name)) {
1124+ return name;
1125+ }
11101126 return GetOverloadedFunctionName (decl);
11111127 }
1112- return GetRecordName (decl->getParent ()) +
1113- (GetNumberOfConvertingCtors (decl->getParent ()) != 1
1114- ? std::to_string (GetCtorIndex (decl))
1115- : " " );
1128+ return GetNumberOfConvertingCtors (decl->getParent ()) != 1
1129+ ? std::format (" new_{}" , GetCtorIndex (decl))
1130+ : " new" ;
11161131}
11171132
11181133bool Converter::VisitCXXConstructorDecl (clang::CXXConstructorDecl *decl) {
@@ -1332,7 +1347,12 @@ bool Converter::VisitIfStmt(clang::IfStmt *stmt) {
13321347 return false ;
13331348 }
13341349 StrCat (keyword::kIf );
1335- ConvertCondition (stmt->getCond ());
1350+ if (auto *cond = clang::dyn_cast<clang::ConstantExpr>(stmt->getCond ());
1351+ cond && stmt->isConstexpr ()) {
1352+ StrCat (cond->getResultAsAPSInt () != 0 ? keyword::kTrue : keyword::kFalse );
1353+ } else {
1354+ ConvertCondition (stmt->getCond ());
1355+ }
13361356 ConvertBody (stmt->getThen ());
13371357 if (stmt->hasElseStorage ()) {
13381358 StrCat (keyword::kElse );
@@ -3298,7 +3318,7 @@ void Converter::ConvertMemberExpr(clang::MemberExpr *expr) {
32983318 if (auto *method = clang::dyn_cast<clang::CXXMethodDecl>(member);
32993319 method && IsOverloadedMethod (method)) {
33003320 StrCat (token::kDot );
3301- StrCat (GetOverloadedFunctionName (method));
3321+ StrCat (GetMethodName (method));
33023322 } else if (!name_override.empty ()) {
33033323 StrCat (token::kDot , name_override);
33043324 } else if (member->getDeclName ().isIdentifier () ||
@@ -3346,6 +3366,7 @@ bool Converter::VisitArrayInitLoopExpr(clang::ArrayInitLoopExpr *expr) {
33463366}
33473367
33483368bool Converter::VisitInitListExpr (clang::InitListExpr *expr) {
3369+ auto *syntactic = expr->isSyntacticForm () ? expr : expr->getSyntacticForm ();
33493370 if (auto form = expr->getSemanticForm ())
33503371 expr = form;
33513372
@@ -3371,6 +3392,13 @@ bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
33713392 return false ;
33723393 }
33733394
3395+ auto *cxx = clang::dyn_cast<clang::CXXRecordDecl>(record);
3396+ if (syntactic->getNumInits () == 0 && !(cxx && cxx->isLambda ())) {
3397+ StrCat (GetDefaultAsString (qual_type));
3398+ SetFreshType (qual_type);
3399+ return false ;
3400+ }
3401+
33743402 StrCat (GetUnsafeTypeAsString (qual_type));
33753403 PushBrace brace (*this );
33763404 int i = 0 ;
@@ -4100,18 +4128,6 @@ std::string Converter::GetDefaultAsStringFallback(clang::QualType qual_type) {
41004128 return getTypedLiteral (" 0.0" , ToString (qual_type));
41014129 }
41024130
4103- if (auto record = qual_type->getAsRecordDecl ();
4104- record && in_const_initializer_) {
4105- if (auto cxx = clang::dyn_cast<clang::CXXRecordDecl>(record)) {
4106- ENSURE (GetUserDefinedDefaultConstructor (cxx) == nullptr &&
4107- " Default initializing globals using default constructor is not "
4108- " supported" );
4109- }
4110- Buffer buf (*this );
4111- EmitDefaultStructLiteral (record);
4112- return std::move (buf).str ();
4113- }
4114-
41154131 if (auto record = qual_type->getAsRecordDecl ()) {
41164132 if (ctx_.getSourceManager ().isInSystemHeader (record->getLocation ()) &&
41174133 qual_type.isPODType (ctx_)) {
@@ -4138,6 +4154,10 @@ std::string Converter::ConvertVarDefaultInit(clang::QualType qual_type) {
41384154std::string
41394155Converter::GetOverloadedFunctionName (const clang::FunctionDecl *decl) {
41404156 auto name = GetFunctionBaseName (decl);
4157+ if (auto *conversion = clang::dyn_cast<clang::CXXConversionDecl>(decl)) {
4158+ name = GetConversionName (
4159+ conversion, GetUnsafeTypeAsString (conversion->getConversionType ()));
4160+ }
41414161 if (auto *ctor = clang::dyn_cast<clang::CXXConstructorDecl>(decl);
41424162 ctor && !ctor->getParent ()->getIdentifier ()) {
41434163 name = GetRecordName (ctor->getParent ());
@@ -4207,19 +4227,7 @@ Converter::GetOverloadedFunctionName(const clang::FunctionDecl *decl) {
42074227 }
42084228 }
42094229
4210- ReplaceAll (name, " [" , " arr" );
4211- ReplaceAll (name, " ]" , " arr" );
4212- ReplaceAll (name, " ;" , " _" );
4213- ReplaceAll (name, " ," , " _" );
4214- name.erase (std::remove_if (name.begin (), name.end (),
4215- [](char c) {
4216- return c == ' <' || c == ' >' || c == ' ' ||
4217- c == ' :' || c == ' (' || c == ' )' ||
4218- c == ' -' ;
4219- }),
4220- name.end ());
4221- std::replace (name.begin (), name.end (), ' *' , ' p' );
4222-
4230+ ToIdentifier (name);
42234231 return name;
42244232}
42254233
@@ -4769,8 +4777,13 @@ void Converter::EmitDefaultStructLiteral(const clang::RecordDecl *decl) {
47694777 StrCat (GetRecordName (decl));
47704778 PushBrace brace (*this );
47714779 for (auto *field : decl->fields ()) {
4772- StrCat (GetNamedDeclAsString (field), token::kColon ,
4773- GetDefaultAsString (field->getType ()), token::kComma );
4780+ StrCat (GetNamedDeclAsString (field), token::kColon );
4781+ if (auto *init = field->getInClassInitializer ()) {
4782+ ConvertVarInit (field->getType (), init);
4783+ } else {
4784+ StrCat (GetDefaultAsString (field->getType ()));
4785+ }
4786+ StrCat (token::kComma );
47744787 }
47754788}
47764789
0 commit comments