Skip to content

Commit 9ea4f58

Browse files
authored
Merge pull request #1829 from Smit-create/i-1785-1
C: Implement allocatable
2 parents b2b2053 + 842bb88 commit 9ea4f58

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

integration_tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ RUN(NAME array_size_01 LABELS cpython llvm c)
296296
RUN(NAME array_size_02 LABELS cpython llvm c)
297297
RUN(NAME array_01 LABELS cpython llvm wasm c)
298298
RUN(NAME array_02 LABELS cpython wasm c)
299-
RUN(NAME array_03 LABELS cpython llvm)
299+
RUN(NAME array_03 LABELS cpython llvm c)
300300
RUN(NAME bindc_01 LABELS cpython llvm c)
301301
RUN(NAME bindc_02 LABELS cpython llvm c)
302302
RUN(NAME bindc_04 LABELS llvm c)

integration_tests/array_03.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ def f():
77
i: i32
88
for i in range(n):
99
a[i] = f64(i+1)
10+
for i in range(n):
11+
assert abs(a[i] - f64(i + 1)) < 1e-12
1012
b: Allocatable[i32[:]]
1113
n = 10
1214
b = empty((n,), dtype=int32)
1315
for i in range(n):
1416
b[i] = i+1
15-
print(a)
1617
for i in range(n):
1718
assert b[i] == i+1
1819

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,23 +1811,56 @@ R"(#include <stdio.h>
18111811

18121812
void visit_Allocate(const ASR::Allocate_t &x) {
18131813
std::string indent(indentation_level*indentation_spaces, ' ');
1814-
std::string out = indent + "// FIXME: allocate(";
1814+
std::string out = "";
18151815
for (size_t i=0; i<x.n_args; i++) {
18161816
ASR::symbol_t* tmp_sym = nullptr;
1817+
ASR::ttype_t* type = nullptr;
18171818
ASR::expr_t* tmp_expr = x.m_args[i].m_a;
18181819
if( ASR::is_a<ASR::Var_t>(*tmp_expr) ) {
18191820
const ASR::Var_t* tmp_var = ASR::down_cast<ASR::Var_t>(tmp_expr);
18201821
tmp_sym = tmp_var->m_v;
1822+
type = ASRUtils::expr_type(tmp_expr);
18211823
} else {
18221824
throw CodeGenError("Cannot deallocate variables in expression " +
18231825
std::to_string(tmp_expr->type),
18241826
tmp_expr->base.loc);
18251827
}
1826-
//ASR::dimension_t* dims = x.m_args[i].m_dims;
1827-
//size_t n_dims = x.m_args[i].n_dims;
1828-
out += std::string(ASRUtils::symbol_name(tmp_sym)) + ", ";
1828+
std::string sym = ASRUtils::symbol_name(tmp_sym);
1829+
if (ASRUtils::is_array(type)) {
1830+
std::string size_str = "1";
1831+
out += indent + sym + "->n_dims = " + std::to_string(x.m_args[i].n_dims) + ";\n";
1832+
for (size_t j=0; j<x.m_args[i].n_dims; j++) {
1833+
std::string st, l;
1834+
if (x.m_args[i].m_dims[j].m_start) {
1835+
self().visit_expr(*x.m_args[i].m_dims[j].m_start);
1836+
st = src;
1837+
} else {
1838+
st = "0";
1839+
}
1840+
if (x.m_args[i].m_dims[j].m_length) {
1841+
self().visit_expr(*x.m_args[i].m_dims[j].m_length);
1842+
l = src;
1843+
} else {
1844+
l = "1";
1845+
}
1846+
size_str += "*" + l;
1847+
out += indent + sym + "->dims[" + std::to_string(j) + "].lower_bound = ";
1848+
out += st + ";\n";
1849+
out += indent + sym + "->dims[" + std::to_string(j) + "].length = ";
1850+
out += l + ";\n";
1851+
}
1852+
std::string ty = CUtils::get_c_type_from_ttype_t(type);
1853+
size_str += "*sizeof(" + ty + ")";
1854+
out += indent + sym + "->data = (" + ty + "*) _lfortran_malloc(" + size_str + ")";
1855+
out += ";\n";
1856+
out += indent + sym + "->is_allocated = true;\n";
1857+
} else {
1858+
std::string ty = CUtils::get_c_type_from_ttype_t(type), size_str;
1859+
size_str = "sizeof(" + ty + ")";
1860+
out += indent + sym + " = (" + ty + "*) _lfortran_malloc(" + size_str + ")";
1861+
out += ";\n";
1862+
}
18291863
}
1830-
out += ");\n";
18311864
src = out;
18321865
}
18331866

0 commit comments

Comments
 (0)