@@ -1323,13 +1323,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
13231323 args.p [i].m_value = arg_new_i;
13241324 }
13251325 for (size_t i = args.size (); i < StructType->n_members ; i++) {
1326- std::string member_name = StructType->m_members [i];
1327- ASR::Variable_t* member_var = ASR::down_cast<ASR::Variable_t>(
1328- StructType->m_symtab ->resolve_symbol (member_name));
1329- ASR::call_arg_t arg;
1330- arg.loc = loc;
1331- arg.m_value = member_var->m_value ;
1332- args.push_back (al, arg);
1326+ args.push_back (al, StructType->m_initializers [i]);
13331327 }
13341328 ASR::ttype_t * der_type = ASRUtils::TYPE (ASR::make_Struct_t (al, loc, stemp));
13351329 return ASR::make_StructTypeConstructor_t (al, loc, stemp, args.p , args.size (), der_type, nullptr );
@@ -2775,8 +2769,10 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
27752769 }
27762770
27772771 void visit_AnnAssignUtil (const AST::AnnAssign_t& x, std::string& var_name,
2772+ ASR::expr_t * &init_expr,
27782773 bool wrap_derived_type_in_pointer=false ,
2779- ASR::expr_t * init_expr=nullptr , ASR::abiType abi=ASR::abiType::Source) {
2774+ ASR::abiType abi=ASR::abiType::Source,
2775+ bool inside_struct=false ) {
27802776 bool is_allocatable = false ;
27812777 ASR::ttype_t *type = ast_expr_to_asr_type (x.base .base .loc , *x.m_annotation , is_allocatable);
27822778 ASR::ttype_t * ann_assign_target_type_copy = ann_assign_target_type;
@@ -2846,8 +2842,13 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28462842 }
28472843
28482844 if ( !is_c_p_pointer_call ) {
2849- create_add_variable_to_scope (var_name, init_expr, type,
2850- x.base .base .loc , abi, storage_type);
2845+ if (inside_struct && !ASR::is_a<ASR::Const_t>(*type)) {
2846+ create_add_variable_to_scope (var_name, nullptr , type,
2847+ x.base .base .loc , abi, storage_type);
2848+ } else {
2849+ create_add_variable_to_scope (var_name, init_expr, type,
2850+ x.base .base .loc , abi, storage_type);
2851+ }
28512852 }
28522853
28532854 if (is_allocatable && x.m_value && AST::is_a<AST::Call_t>(*x.m_value )) {
@@ -2866,6 +2867,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28662867
28672868 void visit_ClassMembers (const AST::ClassDef_t& x,
28682869 Vec<char *>& member_names, SetChar& struct_dependencies,
2870+ Vec<ASR::call_arg_t > &member_init,
28692871 bool is_enum_scope=false , ASR::abiType abi=ASR::abiType::Source) {
28702872 int64_t prev_value = 1 ;
28712873 for ( size_t i = 0 ; i < x.n_body ; i++ ) {
@@ -2899,8 +2901,12 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
28992901 ASR::ttype_t * i64_type = ASRUtils::TYPE (ASR::make_Integer_t (al, x.base .base .loc , 8 ));
29002902 init_expr = ASRUtils::EXPR (ASR::make_IntegerConstant_t (al, x.base .base .loc , -1 , i64_type));
29012903 }
2902- visit_AnnAssignUtil (*ann_assign, var_name, false , init_expr , abi);
2904+ visit_AnnAssignUtil (*ann_assign, var_name, init_expr, false , abi, true );
29032905 ASR::symbol_t * var_sym = current_scope->resolve_symbol (var_name);
2906+ ASR::call_arg_t c_arg;
2907+ c_arg.loc = var_sym->base .loc ;
2908+ c_arg.m_value = init_expr;
2909+ member_init.push_back (al, c_arg);
29042910 if ( is_enum_scope ) {
29052911 if ( AST::is_a<AST::Call_t>(*ann_assign->m_value ) ) {
29062912 AST::Call_t* auto_call_cand = AST::down_cast<AST::Call_t>(ann_assign->m_value );
@@ -2966,20 +2972,19 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
29662972
29672973 void visit_ClassDef (const AST::ClassDef_t& x) {
29682974 std::string x_m_name = x.m_name ;
2969- if ( current_scope->resolve_symbol (x_m_name) ) {
2970- return ;
2971- }
29722975 if ( is_enum (x.m_bases , x.n_bases ) ) {
29732976 ASR::abiType enum_abi = get_abi_from_decorators (x.m_decorator_list , x.n_decorator_list );
29742977 SymbolTable *parent_scope = current_scope;
29752978 current_scope = al.make_new <SymbolTable>(parent_scope);
29762979 Vec<char *> member_names;
2980+ Vec<ASR::call_arg_t > member_init;
29772981 member_names.reserve (al, x.n_body );
2982+ member_init.reserve (al, 1 );
29782983 Vec<ASR::stmt_t *>* current_body_copy = current_body;
29792984 current_body = nullptr ;
29802985 SetChar struct_dependencies;
29812986 struct_dependencies.reserve (al, 1 );
2982- visit_ClassMembers (x, member_names, struct_dependencies, true , enum_abi);
2987+ visit_ClassMembers (x, member_names, struct_dependencies, member_init, true , enum_abi);
29832988 current_body = current_body_copy;
29842989 ASR::ttype_t * common_type = nullptr ;
29852990 for ( auto sym: current_scope->get_scope () ) {
@@ -3052,24 +3057,27 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30523057 enum_abi, ASR::accessType::Public, enum_value_type,
30533058 common_type, nullptr ));
30543059 current_scope = parent_scope;
3055- current_scope->add_symbol (std::string (x.m_name ), enum_type);
3060+ current_scope->add_or_overwrite_symbol (std::string (x.m_name ), enum_type);
30563061 return ;
30573062 } else if ( is_union (x.m_bases , x.n_bases ) ) {
30583063 SymbolTable *parent_scope = current_scope;
30593064 current_scope = al.make_new <SymbolTable>(parent_scope);
30603065 Vec<char *> member_names;
3066+ Vec<ASR::call_arg_t > member_init;
30613067 member_names.reserve (al, x.n_body );
3068+ member_init.reserve (al, x.n_body );
30623069 SetChar struct_dependencies;
30633070 struct_dependencies.reserve (al, 1 );
3064- visit_ClassMembers (x, member_names, struct_dependencies);
3071+ visit_ClassMembers (x, member_names, struct_dependencies, member_init);
3072+ LCOMPILERS_ASSERT (member_init.size () == member_names.size ());
30653073 ASR::symbol_t * union_type = ASR::down_cast<ASR::symbol_t >(ASR::make_UnionType_t (al,
30663074 x.base .base .loc , current_scope, x.m_name ,
30673075 struct_dependencies.p , struct_dependencies.size (),
30683076 member_names.p , member_names.size (),
30693077 ASR::abiType::Source, ASR::accessType::Public,
3070- nullptr ));
3078+ member_init. p , member_init. size (), nullptr ));
30713079 current_scope = parent_scope;
3072- current_scope->add_symbol (std::string (x.m_name ), union_type);
3080+ current_scope->add_or_overwrite_symbol (std::string (x.m_name ), union_type);
30733081 return ;
30743082 }
30753083 ASR::expr_t * algined_expr = nullptr ;
@@ -3088,23 +3096,26 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
30883096 SymbolTable *parent_scope = current_scope;
30893097 current_scope = al.make_new <SymbolTable>(parent_scope);
30903098 Vec<char *> member_names;
3099+ Vec<ASR::call_arg_t > member_init;
30913100 member_names.reserve (al, x.n_body );
3101+ member_init.reserve (al, x.n_body );
30923102 SetChar struct_dependencies;
30933103 struct_dependencies.reserve (al, 1 );
30943104 ASR::abiType class_abi = ASR::abiType::Source;
30953105 if ( is_bindc_class (x.m_decorator_list , x.n_decorator_list ) ) {
30963106 class_abi = ASR::abiType::BindC;
30973107 }
3098- visit_ClassMembers (x, member_names, struct_dependencies, false , class_abi);
3108+ visit_ClassMembers (x, member_names, struct_dependencies, member_init, false , class_abi);
3109+ LCOMPILERS_ASSERT (member_init.size () == member_names.size ());
30993110 ASR::symbol_t * class_type = ASR::down_cast<ASR::symbol_t >(ASR::make_StructType_t (al,
31003111 x.base .base .loc , current_scope, x.m_name ,
31013112 struct_dependencies.p , struct_dependencies.size (),
31023113 member_names.p , member_names.size (),
31033114 class_abi, ASR::accessType::Public,
3104- is_packed, false , algined_expr,
3115+ is_packed, false , member_init. p , member_init. size (), algined_expr,
31053116 nullptr ));
31063117 current_scope = parent_scope;
3107- current_scope->add_symbol (std::string (x.m_name ), class_type);
3118+ current_scope->add_or_overwrite_symbol (std::string (x.m_name ), class_type);
31083119 }
31093120
31103121 void add_name (const Location &loc) {
@@ -4851,8 +4862,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
48514862 }));
48524863 }
48534864 }
4854-
4855- visit_AnnAssignUtil (x, var_name);
4865+ ASR:: expr_t *init_expr = nullptr ;
4866+ visit_AnnAssignUtil (x, var_name, init_expr );
48564867 assign_ast_target = assign_ast_target_copy;
48574868 }
48584869
0 commit comments