Skip to content

Commit c9545d0

Browse files
committed
C: Fix struct members deep copy
1 parent 8ec43f8 commit c9545d0

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

src/libasr/codegen/asr_to_c.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,12 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
146146
void allocate_array_members_of_struct(ASR::StructType_t* der_type_t, std::string& sub,
147147
std::string indent, std::string name) {
148148
for( auto itr: der_type_t->m_symtab->get_scope() ) {
149-
if( ASR::is_a<ASR::UnionType_t>(*itr.second) ||
150-
ASR::is_a<ASR::StructType_t>(*itr.second) ) {
149+
ASR::symbol_t *sym = ASRUtils::symbol_get_past_external(itr.second);
150+
if( ASR::is_a<ASR::UnionType_t>(*sym) ||
151+
ASR::is_a<ASR::StructType_t>(*sym) ) {
151152
continue ;
152153
}
153-
ASR::ttype_t* mem_type = ASRUtils::symbol_type(itr.second);
154+
ASR::ttype_t* mem_type = ASRUtils::symbol_type(sym);
154155
if( ASRUtils::is_character(*mem_type) ) {
155156
sub += indent + name + "->" + itr.first + " = NULL;\n";
156157
} else if( ASRUtils::is_array(mem_type) &&

src/libasr/codegen/c_utils.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -843,26 +843,28 @@ class CCPPDSUtils {
843843
+ struct_type_str + "* dest)";
844844
func_decls += "inline " + signature + ";\n";
845845
generated_code += indent + signature + " {\n";
846-
for( auto item: struct_type_t->m_symtab->get_scope() ) {
847-
ASR::ttype_t* member_type_asr = ASRUtils::symbol_type(item.second);
846+
for(size_t i=0; i < struct_type_t->n_members; i++) {
847+
std::string mem_name = std::string(struct_type_t->m_members[i]);
848+
ASR::symbol_t* member = struct_type_t->m_symtab->get_symbol(mem_name);
849+
ASR::ttype_t* member_type_asr = ASRUtils::symbol_type(member);
848850
if( CUtils::is_non_primitive_DT(member_type_asr) ||
849851
ASR::is_a<ASR::Character_t>(*member_type_asr) ) {
850-
generated_code += indent + tab + get_deepcopy(member_type_asr, "&(src->" + item.first + ")",
851-
"&(dest->" + item.first + ")") + ";\n";
852+
generated_code += indent + tab + get_deepcopy(member_type_asr, "&(src->" + mem_name + ")",
853+
"&(dest->" + mem_name + ")") + ";\n";
852854
} else if( ASRUtils::is_array(member_type_asr) ) {
853855
ASR::dimension_t* m_dims = nullptr;
854856
size_t n_dims = ASRUtils::extract_dimensions_from_ttype(member_type_asr, m_dims);
855857
if( ASRUtils::is_fixed_size_array(m_dims, n_dims) ) {
856858
std::string array_size = std::to_string(ASRUtils::get_fixed_size_of_array(m_dims, n_dims));
857859
array_size += "*sizeof(" + CUtils::get_c_type_from_ttype_t(member_type_asr) + ")";
858-
generated_code += indent + tab + "memcpy(dest->" + item.first + ", src->" + item.first +
860+
generated_code += indent + tab + "memcpy(dest->" + mem_name + ", src->" + mem_name +
859861
", " + array_size + ");\n";
860862
} else {
861-
generated_code += indent + tab + get_deepcopy(member_type_asr, "src->" + item.first,
862-
"dest->" + item.first) + ";\n";
863+
generated_code += indent + tab + get_deepcopy(member_type_asr, "src->" + mem_name,
864+
"dest->" + mem_name) + ";\n";
863865
}
864866
} else {
865-
generated_code += indent + tab + "dest->" + item.first + " = " + " src->" + item.first + ";\n";
867+
generated_code += indent + tab + "dest->" + mem_name + " = " + " src->" + mem_name + ";\n";
866868
}
867869
}
868870
generated_code += indent + "}\n\n";

0 commit comments

Comments
 (0)