From a747dfc8c574ce97e66459394b9315d1129932e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Thu, 28 Jun 2012 20:14:50 +0200
Subject: [PATCH] Compiler: Fix too aggressive optimization of empty foreach.

---
 src/treeopt.in | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/treeopt.in b/src/treeopt.in
index 58836ae9f4..cebe145de0 100644
--- a/src/treeopt.in
+++ b/src/treeopt.in
@@ -1063,8 +1063,21 @@ F_DO(-, 0 = +[node_is_true($$)]):
 
 
 // No body -- No reason to loop...
-F_FOREACH(F_VAL_LVAL(0, *), -):
-  F_POP_VALUE($0, -);
+F_FOREACH(F_VAL_LVAL(0 = +[!($$->node_info & (OPT_SIDE_EFFECT|OPT_ASSIGNMENT))],
+		     1 = +[($$->token != ':')]), -):
+{
+  // Note: We still need to set the loop variable as if the last
+  //       turn of the loop has executed, in case it is used later.
+  $$ = mknode(F_POP_VALUE,
+	      mknode('?',
+		     mkefuncallnode("sizeof", $0),
+		     mknode(':',
+			    mknode(F_ASSIGN,
+				   mknode(F_INDEX, $0, mkintnode(-1)), $1),
+			    NULL)),
+	      0);
+}
+;
 F_LOOP(0, -):
   F_POP_VALUE($0, -);
 
-- 
GitLab