PR117546 was fixed by Eric's r14-10693-gadab597af288d6 change, but
the testcase here is sufficiently different to be worth including
in torture/.

gcc/testsuite/ChangeLog:
        PR ipa/117546
        * gcc.dg/torture/pr117546.c: New test.
---
 gcc/testsuite/gcc.dg/torture/pr117546.c | 84 +++++++++++++++++++++++++
 1 file changed, 84 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr117546.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr117546.c 
b/gcc/testsuite/gcc.dg/torture/pr117546.c
new file mode 100644
index 000000000000..21e2aef18b9a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr117546.c
@@ -0,0 +1,84 @@
+/* { dg-do run } */
+
+typedef struct {
+  int a;
+  int b;
+} c;
+
+typedef struct {
+  int a;
+  int b;
+  int d;
+} e;
+
+typedef struct {
+  int f;
+  int g;
+} h;
+
+typedef struct {
+  h i[1];
+  e coords[100];
+} j;
+
+struct k {
+  j glyf;
+} l;
+
+int m, n;
+double o;
+e *q;
+e r;
+
+int s(c *v) {
+  if (v[0].a == m)
+    __builtin_abort();
+  int t = v[0].a + v[2].b * (v[2].b - v[0].b),
+      u = (2. + v[4].b - v[2].b) * (v[4].b - v[2].b);
+  if (t <= 3 * u) {
+    v[0] = v[4];
+    return 1;
+  }
+  return 0;
+}
+
+void w(struct k *v) {
+  c p[5];
+  e *a = &v->glyf.coords[0];
+  if (a->d)
+    p[0].a = p[0].b = a->b;
+  q = &r;
+  o = p[0].b;
+  while (v->glyf.i[0].g--) {
+    q = q == &r ? a : q + 1;
+    if (q->d)
+      switch (n) {
+      case 2:
+        p[4].a = q->a;
+        p[4].b = q->b;
+        n = s(p);
+      }
+    else
+      switch (n) {
+      case 0:
+        n = 1;
+        break;
+      case 1:
+        p[2].b = q->b;
+        n = 2;
+        break;
+      case 2:
+        if (s(p))
+          n = 1;
+      }
+  }
+}
+
+int main() {
+  l.glyf.i[0] = (h){0, 26};
+  l.glyf.coords[0] = (e){4, 2, 3};
+  l.glyf.coords[3] = (e){2, 126, 3};
+  l.glyf.coords[4] = (e){2, 206};
+  l.glyf.coords[6] = (e){0, 308, 5};
+  w(&l);
+}

base-commit: 26ca00eeedb01f9d5102586b76ae2a6e787111af
-- 
2.47.1

Reply via email to