1  /* { dg-options "-O -fgraphite-identity" } */
       2  /* { dg-require-effective-target nonlocal_goto } */
       3  
       4  #include <setjmp.h>
       5  
       6  struct x;
       7  
       8  typedef struct x **(*a)(struct x *);
       9  void d (const char *);
      10  
      11  struct x {
      12      union {
      13  	struct {
      14  	    union {
      15  		a *i;
      16  	    } l;
      17  	    int s;
      18  	} y;
      19      } e;
      20  };
      21  
      22  jmp_buf c;
      23  
      24  void
      25  b(struct x *r)
      26  {
      27    int f;
      28    static int w = 0;
      29    volatile jmp_buf m;
      30    f = (*(((struct x *)r)->e.y.l.i[2]((struct x *)r)))->e.y.s;
      31    if (w++ != 0)
      32      __builtin_memcpy((char *)m, (const char *)c, sizeof(jmp_buf));
      33    if (setjmp (c) == 0) {
      34        int z;
      35        for (z = 0; z < 0; ++z)
      36  	;
      37    }
      38    d((const char *)m);
      39  }