diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-17 19:04:47 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-17 19:04:47 +0800 |
commit | 6700924f946b0694f1d96885f6137548d589aa8d (patch) | |
tree | a6f340396902c088f5c35eed2d8599c14cb128a1 | |
parent | f84af161775b96a4efec410d1cf43303cd25b1ee (diff) | |
download | mrust-6700924f946b0694f1d96885f6137548d589aa8d.tar.gz |
Trans C - Fix ordering in memcpy/memmove
-rw-r--r-- | src/trans/codegen_c.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index 2ae6b27a..ed29a7eb 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -791,11 +791,18 @@ namespace { else if( name == "transmute" ) { m_of << "memcpy( &"; emit_lvalue(e.ret_val); m_of << ", &"; emit_lvalue(e.args.at(0)); m_of << ", sizeof("; emit_ctype(params.m_types.at(0)); m_of << "))"; } - else if( name == "copy_nonoverlapping" ) { - m_of << "memcpy( "; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", "; emit_lvalue(e.args.at(2)); m_of << ")"; - } - else if( name == "copy" ) { - m_of << "memmove( "; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", "; emit_lvalue(e.args.at(2)); m_of << ")"; + else if( name == "copy_nonoverlapping" || name == "copy" ) { + if( name == "copy" ) { + m_of << "memmove"; + } + else { + m_of << "memcpy"; + } + // 0: Source, 1: Destination, 2: Count + m_of << "( "; emit_lvalue(e.args.at(1)); + m_of << ", "; emit_lvalue(e.args.at(0)); + m_of << ", "; emit_lvalue(e.args.at(2)); m_of << " * sizeof("; emit_ctype(params.m_types.at(0)); m_of << ")"; + m_of << ")"; } else if( name == "forget" ) { // Nothing needs to be done, this just stops the destructor from running. |