@@ -2453,23 +2453,35 @@ static inline ASR::dimension_t* duplicate_dimensions(Allocator& al, ASR::dimensi
2453
2453
static inline ASR::asr_t * make_StructType_t_util (Allocator& al, Location loc, ASR::symbol_t * der){
2454
2454
ASR::Struct_t* st = ASR::down_cast<ASR::Struct_t>(ASRUtils::symbol_get_past_external (der));
2455
2455
Vec<ASR::ttype_t *> members;
2456
- members.reserve (al, st->n_members );
2456
+ members.reserve (al, 1 );
2457
+ Vec<ASR::ttype_t *> member_functions;
2458
+ member_functions.reserve (al, 1 );
2457
2459
SymbolTable* current_scope = st->m_symtab ;
2458
2460
for (size_t i = 0 ; i < st->n_members ; i++){
2459
2461
ASR::symbol_t * temp = current_scope->get_symbol (st->m_members [i]);
2460
2462
if (ASR::is_a<ASR::Variable_t>(*temp)){
2461
2463
ASR::Variable_t* var = ASR::down_cast<ASR::Variable_t>(
2462
2464
ASRUtils::symbol_get_past_external (temp));
2463
- members.push_back (al,var->m_type );
2465
+ members.push_back (al,var->m_type );
2464
2466
}
2465
2467
}
2466
- return ASR::make_StructType_t (al,
2467
- loc,
2468
- members.p ,
2468
+ for (size_t i = 0 ; i < st->n_member_functions ; i++){
2469
+ ASR::symbol_t * sym = current_scope->get_symbol (st->m_member_functions [i]);
2470
+ if (sym && ASR::is_a<ASR::Function_t>(*sym)){
2471
+ ASR::Function_t *f = ASR::down_cast<ASR::Function_t>(
2472
+ ASRUtils::symbol_get_past_external (sym));
2473
+ ASR::ttype_t * f_type = f->m_function_signature ;
2474
+ member_functions.push_back (al, f_type);
2475
+ }
2476
+ }
2477
+ bool is_cstruct = member_functions.n == 0 ;
2478
+ return ASR::make_StructType_t (al,
2479
+ loc,
2480
+ members.p ,
2469
2481
members.n ,
2470
- nullptr , // Correct this when mem fn added to Struct_t
2471
- 0 , // Correct this when mem fn added to Struct_t
2472
- true , // Correct this when mem fn added to Struct_t
2482
+ member_functions. p ,
2483
+ member_functions. n ,
2484
+ is_cstruct,
2473
2485
der);
2474
2486
2475
2487
}
@@ -2530,12 +2542,12 @@ static inline ASR::ttype_t* duplicate_type(Allocator& al, const ASR::ttype_t* t,
2530
2542
}
2531
2543
case ASR::ttypeType::StructType: {
2532
2544
ASR::StructType_t* tnew = ASR::down_cast<ASR::StructType_t>(t);
2533
- t_ = ASRUtils::TYPE (ASR::make_StructType_t (al, t->base .loc ,
2534
- tnew->m_data_member_types ,
2545
+ t_ = ASRUtils::TYPE (ASR::make_StructType_t (al, t->base .loc ,
2546
+ tnew->m_data_member_types ,
2535
2547
tnew->n_data_member_types ,
2536
2548
tnew->m_member_function_types ,
2537
2549
tnew->n_member_function_types ,
2538
- tnew->m_is_cstruct ,
2550
+ tnew->m_is_cstruct ,
2539
2551
tnew->m_derived_type ));
2540
2552
break ;
2541
2553
}
@@ -2686,12 +2698,12 @@ static inline ASR::ttype_t* duplicate_type_without_dims(Allocator& al, const ASR
2686
2698
}
2687
2699
case ASR::ttypeType::StructType: {
2688
2700
ASR::StructType_t* tstruct = ASR::down_cast<ASR::StructType_t>(t);
2689
- return ASRUtils::TYPE (ASR::make_StructType_t (al, t->base .loc ,
2690
- tstruct->m_data_member_types ,
2701
+ return ASRUtils::TYPE (ASR::make_StructType_t (al, t->base .loc ,
2702
+ tstruct->m_data_member_types ,
2691
2703
tstruct->n_data_member_types ,
2692
2704
tstruct->m_member_function_types ,
2693
2705
tstruct->n_member_function_types ,
2694
- tstruct->m_is_cstruct ,
2706
+ tstruct->m_is_cstruct ,
2695
2707
tstruct->m_derived_type ));
2696
2708
}
2697
2709
case ASR::ttypeType::Pointer: {
@@ -4299,7 +4311,9 @@ class SymbolDuplicator {
4299
4311
return ASR::down_cast<ASR::symbol_t >(ASR::make_Struct_t (
4300
4312
al, struct_type_t ->base .base .loc , struct_type_symtab,
4301
4313
struct_type_t ->m_name , struct_type_t ->m_dependencies , struct_type_t ->n_dependencies ,
4302
- struct_type_t ->m_members , struct_type_t ->n_members , struct_type_t ->m_abi ,
4314
+ struct_type_t ->m_members , struct_type_t ->n_members ,
4315
+ struct_type_t ->m_member_functions , struct_type_t ->n_member_functions ,
4316
+ struct_type_t ->m_abi ,
4303
4317
struct_type_t ->m_access , struct_type_t ->m_is_packed , struct_type_t ->m_is_abstract ,
4304
4318
struct_type_t ->m_initializers , struct_type_t ->n_initializers , struct_type_t ->m_alignment ,
4305
4319
struct_type_t ->m_parent ));
0 commit comments