summaryrefslogtreecommitdiff
path: root/src/trans/codegen_c.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-04 17:35:21 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-04 17:35:21 +0800
commitbfd2f5bc3b94142e2b5228e13ab8e1547269afb7 (patch)
tree11e5224170028c10ec6be1627bdd936cba2c6df9 /src/trans/codegen_c.cpp
parent7c253cf4cc0e0fb4508362dbfe5389d7054198dc (diff)
downloadmrust-bfd2f5bc3b94142e2b5228e13ab8e1547269afb7.tar.gz
Trans C - Handle indexing slices
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r--src/trans/codegen_c.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 6fca8016..28c312df 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -21,6 +21,7 @@ namespace {
const ::HIR::Crate& m_crate;
::StaticTraitResolve m_resolve;
::std::ofstream m_of;
+ const ::MIR::TypeResolve* m_mir_res;
public:
CodeGenerator_C(const ::HIR::Crate& crate, const ::std::string& outfile):
m_crate(crate),
@@ -212,6 +213,7 @@ namespace {
::HIR::TypeRef ret_type = params.monomorph(m_crate, item.m_return);
::MIR::TypeResolve mir_res { sp, m_crate, ret_type, arg_types, *code };
+ m_mir_res = &mir_res;
m_of << "// " << p << "\n";
emit_function_header(p, item, params);
@@ -515,6 +517,7 @@ namespace {
}
m_of << "}\n";
m_of.flush();
+ m_mir_res = nullptr;
}
private:
void emit_function_header(const ::HIR::Path& p, const ::HIR::Function& item, const Trans_Params& params)
@@ -565,8 +568,18 @@ namespace {
m_of << ")";
),
(Index,
+ ::HIR::TypeRef tmp;
+ const auto& ty = m_mir_res->get_lvalue_type(tmp, *e.val);
m_of << "(";
- emit_lvalue(*e.val);
+ if( ty.m_data.is_Slice() ) {
+ assert(e.val->is_Deref());
+ m_of << "("; emit_ctype(*ty.m_data.as_Slice().inner); m_of << ")";
+ emit_lvalue(*e.val->as_Deref().val);
+ m_of << ".PTR";
+ }
+ else {
+ emit_lvalue(*e.val);
+ }
m_of << ")[";
emit_lvalue(*e.idx);
m_of << "]";