text: /* Verify that simple indirect calls are inlined even without early
     inlining..  */
  /* { dg-do run } */
  /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining"  } */
  
  extern void abort (void);
  
  struct S
  {
    int i;
    void (*f)(struct S *);
    int j,k,l;
  };
  
  struct Z
  {
    unsigned u;
    void (*f)(struct Z *, int);
    struct Z *next;
  };
  
  static struct S *gs;
  static int gr = 111;
  char gc[1024];
  
  static __attribute__ ((noinline, noclone)) struct S *
  get_s (void)
  {
    return (struct S *) &gc;
  }
  
  static void wrong_target (struct S *s)
  {
    abort ();
  }
  
  static void good_target (struct S *s)
  {
    gr = 0;
  }
  
  static void g1 (struct S *s)
  {
    s->f (s);
  }
  
  static void f2 (struct Z *z)
  {
    gs->f = good_target;
    g1 ((struct S *) z);
  }
  
  static inline __attribute__ ((flatten)) void f1 (struct S *s)
  {
    f2 ((struct Z *) s);
  }
  
  int main (int argc, char **argv)
  {
    struct S *s = get_s();
    s->i = 5678;
    s->f = wrong_target;
    s->j = 1234;
    gs = s;
    f1 (s);
  
    return gr;
  }
  
  
  /* { dg-final { scan-ipa-dump-not "wrong_target\[^\\n\]*inline copy in" "inline"  } } */
  