@@ -1315,13 +1315,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
13151315 args.p [i].m_value = arg_new_i;
13161316 }
13171317 for (size_t i = args.size (); i < StructType->n_members ; i++) {
1318- std::string member_name = StructType->m_members [i];
1319- ASR::Variable_t* member_var = ASR::down_cast<ASR::Variable_t>(
1320- StructType->m_symtab ->resolve_symbol (member_name));
1321- ASR::call_arg_t arg;
1322- arg.loc = loc;
1323- arg.m_value = member_var->m_value ;
1324- args.push_back (al, arg);
1318+ args.push_back (al, StructType->m_initializers [i]);
13251319 }
13261320 ASR::ttype_t * der_type = ASRUtils::TYPE (ASR::make_Struct_t (al, loc, stemp));
13271321 return ASR::make_StructTypeConstructor_t (al, loc, stemp, args.p , args.size (), der_type, nullptr );
@@ -2767,8 +2761,10 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
27672761 }
27682762
27692763 void visit_AnnAssignUtil (const AST::AnnAssign_t& x, std::string& var_name,
2764+ ASR::expr_t * &init_expr,
27702765 bool wrap_derived_type_in_pointer=false ,
2771- ASR::expr_t * init_expr=nullptr , ASR::abiType abi=ASR::abiType::Source) {
2766+ ASR::abiType abi=ASR::abiType::Source,
2767+ bool inside_struct=false ) {
27722768 bool is_allocatable = false ;
27732769 ASR::ttype_t *type = ast_expr_to_asr_type (x.base .base .loc , *x.m_annotation , is_allocatable);
27742770 ASR::ttype_t * ann_assign_target_type_copy = ann_assign_target_type;
@@ -2838,8 +2834,13 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28382834 }
28392835
28402836 if ( !is_c_p_pointer_call ) {
2841- create_add_variable_to_scope (var_name, init_expr, type,
2842- x.base .base .loc , abi, storage_type);
2837+ if (inside_struct && !ASR::is_a<ASR::Const_t>(*type)) {
2838+ create_add_variable_to_scope (var_name, nullptr , type,
2839+ x.base .base .loc , abi, storage_type);
2840+ } else {
2841+ create_add_variable_to_scope (var_name, init_expr, type,
2842+ x.base .base .loc , abi, storage_type);
2843+ }
28432844 }
28442845
28452846 if (is_allocatable && x.m_value && AST::is_a<AST::Call_t>(*x.m_value )) {
@@ -2858,6 +2859,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28582859
28592860 void visit_ClassMembers (const AST::ClassDef_t& x,
28602861 Vec<char *>& member_names, SetChar& struct_dependencies,
2862+ Vec<ASR::call_arg_t > &member_init,
28612863 bool is_enum_scope=false , ASR::abiType abi=ASR::abiType::Source) {
28622864 int64_t prev_value = 1 ;
28632865 for ( size_t i = 0 ; i < x.n_body ; i++ ) {
@@ -2891,8 +2893,12 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28912893 ASR::ttype_t * i64_type = ASRUtils::TYPE (ASR::make_Integer_t (al, x.base .base .loc , 8 ));
28922894 init_expr = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, x.base .base .loc , -1 , i64_type));
28932895 }
2894- visit_AnnAssignUtil (*ann_assign, var_name, false , init_expr , abi);
2896+ visit_AnnAssignUtil (*ann_assign, var_name, init_expr, false , abi, true );
28952897 ASR::symbol_t * var_sym = current_scope->resolve_symbol (var_name);
2898+ ASR::call_arg_t c_arg;
2899+ c_arg.loc = var_sym->base .loc ;
2900+ c_arg.m_value = init_expr;
2901+ member_init.push_back (al, c_arg);
28962902 if ( is_enum_scope ) {
28972903 if ( AST::is_a<AST::Call_t>(*ann_assign->m_value ) ) {
28982904 AST::Call_t* auto_call_cand = AST::down_cast<AST::Call_t>(ann_assign->m_value );
@@ -2958,20 +2964,22 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
29582964
29592965 void visit_ClassDef (const AST::ClassDef_t& x) {
29602966 std::string x_m_name = x.m_name ;
2961- if ( current_scope->resolve_symbol (x_m_name) ) {
2962- return ;
2963- }
29642967 if ( is_enum (x.m_bases , x.n_bases ) ) {
2968+ if ( current_scope->resolve_symbol (x_m_name) ) {
2969+ return ;
2970+ }
29652971 ASR::abiType enum_abi = get_abi_from_decorators (x.m_decorator_list , x.n_decorator_list );
29662972 SymbolTable *parent_scope = current_scope;
29672973 current_scope = al.make_new <SymbolTable>(parent_scope);
29682974 Vec<char *> member_names;
2975+ Vec<ASR::call_arg_t > member_init;
29692976 member_names.reserve (al, x.n_body );
2977+ member_init.reserve (al, 1 );
29702978 Vec<ASR::stmt_t *>* current_body_copy = current_body;
29712979 current_body = nullptr ;
29722980 SetChar struct_dependencies;
29732981 struct_dependencies.reserve (al, 1 );
2974- visit_ClassMembers (x, member_names, struct_dependencies, true , enum_abi);
2982+ visit_ClassMembers (x, member_names, struct_dependencies, member_init, true , enum_abi);
29752983 current_body = current_body_copy;
29762984 ASR::ttype_t * common_type = nullptr ;
29772985 for ( auto sym: current_scope->get_scope () ) {
@@ -3050,18 +3058,28 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30503058 SymbolTable *parent_scope = current_scope;
30513059 current_scope = al.make_new <SymbolTable>(parent_scope);
30523060 Vec<char *> member_names;
3061+ Vec<ASR::call_arg_t > member_init;
30533062 member_names.reserve (al, x.n_body );
3063+ member_init.reserve (al, x.n_body );
30543064 SetChar struct_dependencies;
30553065 struct_dependencies.reserve (al, 1 );
3056- visit_ClassMembers (x, member_names, struct_dependencies);
3066+ visit_ClassMembers (x, member_names, struct_dependencies, member_init);
3067+ LCOMPILERS_ASSERT (member_init.size () == member_names.size ());
30573068 ASR::symbol_t * union_type = ASR::down_cast<ASR::symbol_t >(ASR::make_UnionType_t (al,
30583069 x.base .base .loc , current_scope, x.m_name ,
30593070 struct_dependencies.p , struct_dependencies.size (),
30603071 member_names.p , member_names.size (),
30613072 ASR::abiType::Source, ASR::accessType::Public,
3062- nullptr ));
3073+ member_init. p , member_init. size (), nullptr ));
30633074 current_scope = parent_scope;
3064- current_scope->add_symbol (std::string (x.m_name ), union_type);
3075+ if (current_scope->resolve_symbol (x_m_name)) {
3076+ ASR::symbol_t * sym = current_scope->resolve_symbol (x_m_name);
3077+ ASR::UnionType_t *ut = ASR::down_cast<ASR::UnionType_t>(sym);
3078+ ut->m_initializers = member_init.p ;
3079+ ut->n_initializers = member_init.size ();
3080+ } else {
3081+ current_scope->add_symbol (x_m_name, union_type);
3082+ }
30653083 return ;
30663084 }
30673085 ASR::expr_t * algined_expr = nullptr ;
@@ -3080,23 +3098,33 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30803098 SymbolTable *parent_scope = current_scope;
30813099 current_scope = al.make_new <SymbolTable>(parent_scope);
30823100 Vec<char *> member_names;
3101+ Vec<ASR::call_arg_t > member_init;
30833102 member_names.reserve (al, x.n_body );
3103+ member_init.reserve (al, x.n_body );
30843104 SetChar struct_dependencies;
30853105 struct_dependencies.reserve (al, 1 );
30863106 ASR::abiType class_abi = ASR::abiType::Source;
30873107 if ( is_bindc_class (x.m_decorator_list , x.n_decorator_list ) ) {
30883108 class_abi = ASR::abiType::BindC;
30893109 }
3090- visit_ClassMembers (x, member_names, struct_dependencies, false , class_abi);
3110+ visit_ClassMembers (x, member_names, struct_dependencies, member_init, false , class_abi);
3111+ LCOMPILERS_ASSERT (member_init.size () == member_names.size ());
30913112 ASR::symbol_t * class_type = ASR::down_cast<ASR::symbol_t >(ASR::make_StructType_t (al,
30923113 x.base .base .loc , current_scope, x.m_name ,
30933114 struct_dependencies.p , struct_dependencies.size (),
30943115 member_names.p , member_names.size (),
30953116 class_abi, ASR::accessType::Public,
3096- is_packed, false , algined_expr,
3117+ is_packed, false , member_init. p , member_init. size (), algined_expr,
30973118 nullptr ));
30983119 current_scope = parent_scope;
3099- current_scope->add_symbol (std::string (x.m_name ), class_type);
3120+ if (current_scope->resolve_symbol (x_m_name)) {
3121+ ASR::symbol_t * sym = current_scope->resolve_symbol (x_m_name);
3122+ ASR::StructType_t *st = ASR::down_cast<ASR::StructType_t>(sym);
3123+ st->m_initializers = member_init.p ;
3124+ st->n_initializers = member_init.size ();
3125+ } else {
3126+ current_scope->add_symbol (x_m_name, class_type);
3127+ }
31003128 }
31013129
31023130 void add_name (const Location &loc) {
@@ -4845,8 +4873,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
48454873 }));
48464874 }
48474875 }
4848-
4849- visit_AnnAssignUtil (x, var_name);
4876+ ASR:: expr_t *init_expr = nullptr ;
4877+ visit_AnnAssignUtil (x, var_name, init_expr );
48504878 assign_ast_target = assign_ast_target_copy;
48514879 }
48524880
0 commit comments