diff --git a/src/treeopt.in b/src/treeopt.in
index cb7f9f086d540aab8dab82072dd316ef2491dddd..d500457736c74f4cf184bb51b1289674f52d0bfa 100644
--- a/src/treeopt.in
+++ b/src/treeopt.in
@@ -1612,14 +1612,69 @@ F_LOOP(0 = +[ !depend_p($$, $$)]
 }
 ;
 
-// convert all X_EQ(1,2) to $1 = $1 X $2
-F_ADD_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`+", $0, $1 ), $0 ); };
-F_AND_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`&", $0, $1 ), $0 ); };
-F_OR_EQ(0,1)  : {  $$ = mknode( F_ASSIGN, mkopernode( "`|", $0, $1 ), $0 ); };
-F_XOR_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`^", $0, $1 ), $0 ); };
-F_LSH_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`<<", $0, $1 ), $0 ); };
-F_RSH_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`>>", $0, $1 ), $0 ); };
-F_SUB_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`-", $0, $1 ), $0 ); };
-F_MULT_EQ(0,1): {  $$ = mknode( F_ASSIGN, mkopernode( "`*", $0, $1 ), $0 ); };
-F_MOD_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`%", $0, $1 ), $0 ); };
-F_DIV_EQ(0,1) : {  $$ = mknode( F_ASSIGN, mkopernode( "`/", $0, $1 ), $0 ); };
+// convert all X_EQ(1,2) to $1 = $1 X $2 
+F_ADD_EQ(0,1) : {
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`+", $0, $1 )), $0 );
+};
+
+F_SUB_EQ(0,1) : {
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`-", $0, $1 )), $0 );
+};
+
+F_AND_EQ(0,1) : {
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`&", $0, $1 )), $0 );
+};
+
+F_OR_EQ(0,1)  : {
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`|", $0, $1 )), $0 );
+};
+
+F_XOR_EQ(0,1) :
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`^", $0, $1 )), $0 );
+};
+
+F_LSH_EQ(0,1) :
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`<<", $0, $1)), $0 );
+};
+
+F_RSH_EQ(0,1) :
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`>>", $0, $1)), $0 );
+};
+
+F_MULT_EQ(0,1):
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`*", $0, $1 )), $0 );
+};
+
+F_MOD_EQ(0,1) :
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`%", $0, $1 )), $0 );
+};
+
+F_DIV_EQ(0,1) :
+{
+  struct pike_type *type = $0->type;
+  add_ref(type);
+  $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`/", $0, $1 )), $0 );
+};