summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-17 19:04:47 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-17 19:04:47 +0800
commit6700924f946b0694f1d96885f6137548d589aa8d (patch)
treea6f340396902c088f5c35eed2d8599c14cb128a1
parentf84af161775b96a4efec410d1cf43303cd25b1ee (diff)
downloadmrust-6700924f946b0694f1d96885f6137548d589aa8d.tar.gz
Trans C - Fix ordering in memcpy/memmove
-rw-r--r--src/trans/codegen_c.cpp17
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.