diff gcc/testsuite/c-c++-common/pr44715.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/c-c++-common/pr44715.c	Thu Feb 13 11:34:05 2020 +0900
@@ -0,0 +1,171 @@
+/* PR c/44715 */
+/* { dg-do run } */
+/* { dg-options "" } */
+
+void
+foo (int x, int y)
+{
+  int z;
+  switch (x)
+    {
+    case 0:
+      while (({ if (y) break; 0; }))
+	;
+      __builtin_abort ();
+      break;
+    case 1:
+      do
+	;
+      while (({ if (y) break; 0; }));
+      __builtin_abort ();
+      break;
+    case 2:
+      for (z = ({ if (y) break; 0; }); z < 5; z++)
+	;
+      __builtin_abort ();
+      break;
+    case 3:
+      for (z = 0; z < ({ if (y) break; 5; }); z++)
+	;
+      __builtin_abort ();
+      break;
+    case 4:
+      for (z = 0; z < 5; z += ({ if (y) break; 1; }))
+	;
+      __builtin_abort ();
+      break;
+    case 5:
+      switch (({ if (y) break; 1; }))
+	{
+	default: break;
+	}
+      __builtin_abort ();
+      break;
+    default:
+      __builtin_abort ();
+      break;
+    }
+}
+
+void
+bar (int x, int y)
+{
+  int z;
+  while (x >= 0)
+    {
+      if (x == 0)
+	{
+	  while (({ if (y) break; 0; }))
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 1)
+	{
+	  do
+	    ;
+	  while (({ if (y) break; 0; }));
+	  __builtin_abort ();
+	}
+      if (x == 2)
+	{
+	  for (z = ({ if (y) break; 0; }); z < 5; z++)
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 3)
+	{
+	  for (z = 0; z < ({ if (y) break; 5; }); z++)
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 4)
+	{
+	  for (z = 0; z < 5; z += ({ if (y) break; 1; }))
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 5)
+	{
+	  switch (({ if (y) break; 1; }))
+	    {
+	    default: break;
+	    }
+	  __builtin_abort ();
+	}
+    }
+}
+
+void
+baz (int x, int y)
+{
+  int z;
+  while (x >= 0)
+    {
+      if (++y == 2)
+	return;
+      if (x == 0)
+	{
+	  while (({ if (y) continue; 0; }))
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 1)
+	{
+	  do
+	    ;
+	  while (({ if (y) continue; 0; }));
+	  __builtin_abort ();
+	}
+      if (x == 2)
+	{
+	  for (z = ({ if (y) continue; 0; }); z < 5; z++)
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 3)
+	{
+	  for (z = 0; z < ({ if (y) continue; 5; }); z++)
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 4)
+	{
+	  for (z = 0; z < 5; z += ({ if (y) continue; 1; }))
+	    ;
+	  __builtin_abort ();
+	}
+      if (x == 5)
+	{
+	  switch (({ if (y) continue; 1; }))
+	    {
+	    default: break;
+	    }
+	  __builtin_abort ();
+	}
+    }
+  __builtin_abort ();
+}
+
+int
+main ()
+{
+  foo (0, 1);
+  foo (1, 1);
+  foo (2, 1);
+  foo (3, 1);
+  foo (4, 1);
+  foo (5, 1);
+  bar (0, 1);
+  bar (1, 1);
+  bar (2, 1);
+  bar (3, 1);
+  bar (4, 1);
+  bar (5, 1);
+  baz (0, 0);
+  baz (1, 0);
+  baz (2, 0);
+  baz (3, 0);
+  baz (4, 0);
+  baz (5, 0);
+  return 0;
+}