@@ -7145,6 +7145,45 @@ class CommonVisitor : public AST::BaseVisitor<Derived> {
71457145 source_bits.assign(reinterpret_cast<uint8_t*>(&val),
71467146 reinterpret_cast<uint8_t*>(&val) + sizeof(val));
71477147 }
7148+ } else if (ASRUtils::is_array(ASRUtils::expr_type(source)) && ASRUtils::is_value_constant(source_value)) {
7149+ ASR::ArrayConstant_t* const_source = ASR::down_cast<ASR::ArrayConstant_t>(ASRUtils::expr_value(source_value));
7150+ ASR::ttype_t* source_type = ASRUtils::expr_type(source_value);
7151+ int kind = ASRUtils::extract_kind_from_ttype_t(source_type);
7152+ size_t n_elements = ASRUtils::get_fixed_size_of_array(source_type);
7153+
7154+ if (ASRUtils::is_integer(*source_type)) {
7155+ if (kind == 4) {
7156+ for (size_t i=0; i < n_elements; i++) {
7157+ int32_t val = ASR::down_cast<ASR::IntegerConstant_t>(ASRUtils::fetch_ArrayConstant_value(al, const_source, i))->m_n;
7158+ source_bits.insert(source_bits.end(),
7159+ reinterpret_cast<uint8_t*>(&val),
7160+ reinterpret_cast<uint8_t*>(&val) + sizeof(val));
7161+ }
7162+ } else {
7163+ for (size_t i=0; i < n_elements; i++) {
7164+ int64_t val = ASR::down_cast<ASR::IntegerConstant_t>(ASRUtils::fetch_ArrayConstant_value(al, const_source, i))->m_n;
7165+ source_bits.insert(source_bits.end(),
7166+ reinterpret_cast<uint8_t*>(&val),
7167+ reinterpret_cast<uint8_t*>(&val) + sizeof(val));
7168+ }
7169+ }
7170+ } else if (ASRUtils::is_real(*source_type)) {
7171+ if (kind == 4) {
7172+ for (size_t i=0; i < n_elements; i++) {
7173+ float val = ASR::down_cast<ASR::RealConstant_t>(ASRUtils::fetch_ArrayConstant_value(al, const_source, i))->m_r;
7174+ source_bits.insert(source_bits.end(),
7175+ reinterpret_cast<uint8_t*>(&val),
7176+ reinterpret_cast<uint8_t*>(&val) + sizeof(val));
7177+ }
7178+ } else {
7179+ for (size_t i=0; i < n_elements; i++) {
7180+ double val = ASR::down_cast<ASR::RealConstant_t>(ASRUtils::fetch_ArrayConstant_value(al, const_source, i))->m_r;
7181+ source_bits.insert(source_bits.end(),
7182+ reinterpret_cast<uint8_t*>(&val),
7183+ reinterpret_cast<uint8_t*>(&val) + sizeof(val));
7184+ }
7185+ }
7186+ }
71487187 } else {
71497188 return ASR::make_BitCast_t(al, x.base.base.loc, source, mold, size, type, nullptr);
71507189 }
0 commit comments