diff --git a/src/language.yacc b/src/language.yacc
index 467df33fcd31d9adb85ab42ac6df56c07be1a4e2..b4c1a00949096b8f46d95e9b4e165e0d32ee16a4 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -3610,7 +3610,7 @@ expr4: string
     /* A?[X] to ((tmp=A) && tmp[X]) */
     if( $1->token == F_LOCAL )
     {
-      $$=mknode(F_LAND, $1, mknode(F_INDEX,  $1, $4));
+      $$=mknode(F_LAND, copy_node($1), mknode(F_INDEX,  $1, $4));
     }
     else
     {
@@ -3642,7 +3642,7 @@ expr4: string
     node *range = mknode(':',$4,$6);
     if( $1->token == F_LOCAL )
     {
-      $$ = mknode( F_LAND, $1, mknode(F_RANGE, $1, range) );
+      $$ = mknode( F_LAND, copy_node($1), mknode(F_RANGE, $1, range) );
     }
     else
     {
@@ -3666,10 +3666,6 @@ expr4: string
     }
     COPY_LINE_NUMBER_INFO($$, $3);
     free_node ($3);
-
-
-    COPY_LINE_NUMBER_INFO($$, $3);
-    free_node ($3);
   }
   | expr4 open_bracket_with_line_info error ']'
   {
@@ -3760,7 +3756,7 @@ expr4: string
     int temporary;
     if( $1->token == F_LOCAL )
     {
-      $$=mknode(F_LAND, $1, mknode(F_ARROW,  $1, $4));
+      $$=mknode(F_LAND, copy_node($1), mknode(F_ARROW, $1, $4));
     }
     else
     {