summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-02-26 17:04:01 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-02-26 17:04:01 +0800
commit177040dd129bccdc275831e3423af2efab6e948e (patch)
treeff95c73ff00a4d83bbb65357a358dbb527b8aff8 /src
parent12c012c69235fd90c855881f2c07c91dbb052635 (diff)
downloadmrust-177040dd129bccdc275831e3423af2efab6e948e.tar.gz
Codegen C - Fix transmute on constants
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 5e365ceb..f44c9980 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -2046,7 +2046,16 @@ namespace {
emit_lvalue(e.ret_val); m_of << ".META = " << s.size() << "";
}
else if( name == "transmute" ) {
- m_of << "memcpy( &"; emit_lvalue(e.ret_val); m_of << ", &"; emit_param(e.args.at(0)); m_of << ", sizeof("; emit_ctype(params.m_types.at(0)); m_of << "))";
+ if( e.args.at(0).is_Constant() )
+ {
+ m_of << "{ "; emit_ctype(params.m_types.at(1), FMT_CB(s, s << "v";)); m_of << " = "; emit_param(e.args.at(0)); m_of << ";";
+ m_of << "memcpy( &"; emit_lvalue(e.ret_val); m_of << ", &v, sizeof("; emit_ctype(params.m_types.at(0)); m_of << ")); ";
+ m_of << "}";
+ }
+ else
+ {
+ m_of << "memcpy( &"; emit_lvalue(e.ret_val); m_of << ", &"; emit_param(e.args.at(0)); m_of << ", sizeof("; emit_ctype(params.m_types.at(0)); m_of << "))";
+ }
}
else if( name == "copy_nonoverlapping" || name == "copy" ) {
if( name == "copy" ) {