diff --git a/src/las.c b/src/las.c
index 3cd8b1d8671eaffee8d5c997fa297a9f17fc6157..c17889f13ff10a00d5d1b9ed8587bf3944ae164b 100644
--- a/src/las.c
+++ b/src/las.c
@@ -2962,7 +2962,7 @@ static int depend_p2(node *a, node *b)
 
 static int depend_p3(node *a,node *b)
 {
-  if(!b) return 0;
+  if(!b || !a) return 0;
 #if 0
   if(!(b->tree_info & OPT_SIDE_EFFECT) && 
      (b->tree_info & OPT_EXTERNAL_DEPEND))
diff --git a/src/treeopt.in b/src/treeopt.in
index 4115308a46c769dc2f77dceb470e643cb637b86f..26c6c5fe69298a6ee2a0f6549b3c0a478fbf9449 100644
--- a/src/treeopt.in
+++ b/src/treeopt.in
@@ -1634,7 +1634,7 @@ F_LOOP(0 = +[ !depend_p($$, $$)]
 // also change the code for F_ASSIGN_SELF in docode.c.
 //
 // It _knows_ what the nodes look like.
-F_ADD_EQ(0,1) :
+F_ADD_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1642,7 +1642,7 @@ F_ADD_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`+", $0, $1 )), $0 );
 };
 
-F_SUB_EQ(0,1) :
+F_SUB_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1650,7 +1650,7 @@ F_SUB_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`-", $0, $1 )), $0 );
 };
 
-F_AND_EQ(0,1) :
+F_AND_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1658,7 +1658,7 @@ F_AND_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`&", $0, $1 )), $0 );
 };
 
-F_OR_EQ(0,1)  :
+F_OR_EQ(0 = +, 1)  :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1666,7 +1666,7 @@ F_OR_EQ(0,1)  :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`|", $0, $1 )), $0 );
 };
 
-F_XOR_EQ(0,1) :
+F_XOR_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1674,14 +1674,14 @@ F_XOR_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`^", $0, $1 )), $0 );
 };
 
-F_LSH_EQ(0,1) :
+F_LSH_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
 	      depend_p($0, $1)) ? F_ASSIGN_SELF : F_ASSIGN;
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`<<", $0, $1)), $0 );
 };
-F_RSH_EQ(0,1) :
+F_RSH_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1689,7 +1689,7 @@ F_RSH_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`>>", $0, $1)), $0 );
 };
 
-F_MULT_EQ(0,1):
+F_MULT_EQ(0 = +, 1):
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1697,7 +1697,7 @@ F_MULT_EQ(0,1):
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`*", $0, $1 )), $0 );
 };
 
-F_MOD_EQ(0,1) :
+F_MOD_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||
@@ -1705,7 +1705,7 @@ F_MOD_EQ(0,1) :
   $$ = mknode( oper, mksoftcastnode(type,mkopernode( "`%", $0, $1 )), $0 );
 };
 
-F_DIV_EQ(0,1) :
+F_DIV_EQ(0 = +, 1) :
 {
   struct pike_type *type = $0->type;
   int oper = (($0->tree_info&(OPT_SIDE_EFFECT|OPT_ASSIGNMENT)) ||