@@ -3015,12 +3015,64 @@ bool Converter::VisitCXXStdInitializerListExpr(
30153015 return false ;
30163016}
30173017
3018+ std::string Converter::GetArrayDefaultAsString (clang::QualType qual_type) {
3019+ if (auto *array_type = clang::dyn_cast<clang::ConstantArrayType>(qual_type)) {
3020+ auto size_as_string = GetNumAsString (array_type->getSize ());
3021+ auto element_type = array_type->getElementType ();
3022+ auto element_type_as_string = GetDefaultAsString (element_type);
3023+ return std::format (" [{}; {}]" , element_type_as_string,
3024+ size_as_string.c_str ());
3025+ }
3026+ if (auto *array_type =
3027+ clang::dyn_cast<clang::IncompleteArrayType>(qual_type)) {
3028+ return GetDefaultAsString (array_type->getElementType ());
3029+ }
3030+ if (Mapper::ToString (qual_type).contains (" std::array" )) {
3031+ assert (GetTemplateArgs (qual_type).has_value ());
3032+ auto template_args = *GetTemplateArgs (qual_type);
3033+ assert (template_args.size () == 2 );
3034+ auto array_size = template_args[1 ];
3035+ unsigned size = 0 ;
3036+ switch (array_size.getKind ()) {
3037+ case clang::TemplateArgument::Expression: {
3038+ auto array_size_expr = array_size.getAsExpr ();
3039+ assert (array_size_expr && !array_size_expr->isValueDependent ());
3040+ clang::Expr::EvalResult result;
3041+ ENSURE (array_size_expr->EvaluateAsInt (result, ctx_));
3042+ size = result.Val .getInt ().getZExtValue ();
3043+ break ;
3044+ }
3045+ case clang::TemplateArgument::Integral: {
3046+ size = array_size.getAsIntegral ().getZExtValue ();
3047+ break ;
3048+ }
3049+ default :
3050+ assert (0 && " Unsupported array size kind" );
3051+ break ;
3052+ }
3053+ return std::format (
3054+ " std::array::from_fn::<_, {}, _>(|_| Default::default()).to_vec()" ,
3055+ size);
3056+ }
3057+ return {};
3058+ }
3059+
30183060std::string Converter::GetDefaultAsString (clang::QualType qual_type) {
30193061 if (IsVaListType (qual_type)) {
30203062 computed_expr_type_ = ComputedExprType::FreshValue;
30213063 return " VaList::default()" ;
30223064 }
30233065
3066+ if (auto arr = GetArrayDefaultAsString (qual_type); !arr.empty ()) {
3067+ computed_expr_type_ = ComputedExprType::FreshValue;
3068+ return arr;
3069+ }
3070+
3071+ if (auto init = Mapper::MapInitializer (qual_type); !init.empty ()) {
3072+ computed_expr_type_ = ComputedExprType::FreshValue;
3073+ return init;
3074+ }
3075+
30243076 if (qual_type->isPointerType ()) {
30253077 auto pointee = qual_type->getPointeeType ();
30263078 if (pointee->isFunctionType ()) {
@@ -3032,54 +3084,7 @@ std::string Converter::GetDefaultAsString(clang::QualType qual_type) {
30323084 }
30333085
30343086 computed_expr_type_ = ComputedExprType::FreshValue;
3035-
3036- if (auto *array_type = clang::dyn_cast<clang::ConstantArrayType>(qual_type)) {
3037- auto size_as_string = GetNumAsString (array_type->getSize ());
3038- auto element_type = array_type->getElementType ();
3039- auto element_type_as_string = GetDefaultAsString (element_type);
3040- return std::format (" [{}; {}]" , element_type_as_string,
3041- size_as_string.c_str ());
3042- } else if (auto *array_type =
3043- clang::dyn_cast<clang::IncompleteArrayType>(qual_type)) {
3044- return GetDefaultAsString (array_type->getElementType ());
3045- } else {
3046- auto qual_type_str = Mapper::ToString (qual_type);
3047- if (qual_type_str == " struct std::pair" ) {
3048- auto template_args = *GetTemplateArgs (qual_type);
3049- auto first_type = template_args[0 ].getAsType ();
3050- auto second_type = template_args[1 ].getAsType ();
3051- return std::format (" ({}, {})" , GetDefaultAsString (first_type),
3052- GetDefaultAsString (second_type));
3053- } else if (qual_type_str.contains (" std::array" )) {
3054- assert (GetTemplateArgs (qual_type).has_value ());
3055- auto template_args = *GetTemplateArgs (qual_type);
3056- assert (template_args.size () == 2 );
3057- auto array_size = template_args[1 ];
3058- unsigned size = 0 ;
3059- switch (array_size.getKind ()) {
3060- case clang::TemplateArgument::Expression: {
3061- auto array_size_expr = array_size.getAsExpr ();
3062- assert (array_size_expr && !array_size_expr->isValueDependent ());
3063- clang::Expr::EvalResult result;
3064- ENSURE (array_size_expr->EvaluateAsInt (result, ctx_));
3065- size = result.Val .getInt ().getZExtValue ();
3066- break ;
3067- }
3068- case clang::TemplateArgument::Integral: {
3069- size = array_size.getAsIntegral ().getZExtValue ();
3070- break ;
3071- }
3072- default :
3073- assert (0 && " Unsupported array size kind" );
3074- break ;
3075- }
3076- return std::format (
3077- " std::array::from_fn::<_, {}, _>(|_| Default::default()).to_vec()" ,
3078- size);
3079- } else {
3080- return GetDefaultAsStringFallback (qual_type);
3081- }
3082- }
3087+ return GetDefaultAsStringFallback (qual_type);
30833088}
30843089
30853090std::string Converter::GetDefaultAsStringFallback (clang::QualType qual_type) {
0 commit comments