Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 8135d4c79504a6c3047246007261186efa5ba4c9)
+++ src/GenPoly/Lvalue.cc	(revision 1ae39f6ef81b096e92a97cbb3424c6cd48b4414b)
@@ -70,6 +70,8 @@
 		};
 
-		struct FixIntrinsicResult final {
+		struct FixIntrinsicResult final : public WithGuards {
 			Expression * postmutate( ApplicationExpr * appExpr );
+			void premutate( FunctionDecl * funcDecl );
+			bool inIntrinsic = false;
 		};
 
@@ -162,10 +164,20 @@
 				appExpr->set_result( result->stripReferences()->clone() );
 				appExpr->get_result()->set_lvalue( true );
-				Expression * ret = new CastExpr( appExpr, result );
-				ret->set_env( appExpr->get_env() );
-				appExpr->set_env( nullptr );
-				return ret;
+				if ( ! inIntrinsic ) {
+					// when not in an intrinsic function, add a cast to
+					// don't add cast when in an intrinsic function, since they already have the cast
+					Expression * ret = new CastExpr( appExpr, result );
+					ret->set_env( appExpr->get_env() );
+					appExpr->set_env( nullptr );
+					return ret;
+				}
+				delete result;
 			}
 			return appExpr;
+		}
+
+		void FixIntrinsicResult::premutate( FunctionDecl * funcDecl ) {
+			GuardValue( inIntrinsic );
+			inIntrinsic =  funcDecl->linkage == LinkageSpec::Intrinsic;
 		}
 
