/* Verify that calls to non-modifying built-ins aren't considered
   potentially modifying.
   { dg-do compile }
   { dg-options "-O2 -Wall" }
   { dg-require-effective-target alloca } */

typedef __SIZE_TYPE__ size_t;

void* alloca (size_t);
void* calloc (size_t, size_t);
void* malloc (size_t);
int printf (const char *, ...);
int scanf (const char *, ...);
int sprintf (char *, const char *, ...);
int snprintf (char *, size_t, const char *, ...);
int puts (const char *);
char* strcpy (char*, const char*);
size_t strlen (const char*);

void noproto ();

void sink (int, ...);

extern char a[];

void nowarn_noproto (const char *fmt)
{
  int i;
  noproto (&i);
  sink (i);
}

void nowarn_scanf (const char *fmt)
{
  int i;
  scanf ("%i", &i);
  sink (i);
}

void test_puts_sprintf_alloca (const char *fmt)
{
  char *p;
  {
    p = alloca (8);
    sprintf (a, fmt, p);                // fmt might contain %n
    puts (p);
  }

  {
    p = alloca (8);
    snprintf (0, 0, fmt, p);            // same as above
    puts (p);
  }
}

void test_puts_alloca (const char *s)
{
  char *p = alloca (8);

  {
    char a[] = "foo";
    puts (a);
  }

  puts (p);                             // { dg-warning "-Wuninitialized" }

  {
    p = alloca (strlen (s) + 1);
    strcpy (p, s);
    puts (p);
  }

  {
    /* Verify that the puts() calls above isn't considered to have
       potentially modified *P, and same for the one below.  */
    p = alloca (strlen (s));
    puts (p);                           // { dg-warning "-Wuninitialized" }
    puts (p + 1);                       // { dg-warning "-Wuninitialized" }
  }
}


void test_puts_malloc (const char *s, const char *t)
{
  char *p;

  {
    p = malloc (strlen (s) + 1);
    strcpy (p, s);
    puts (p);
  }

  {
    p = malloc (strlen (t));
    puts (p);                           // { dg-warning "-Wuninitialized" }
  }
}


void test_puts_vla (const char *s, const char *t)
{
  {
    char a[strlen (s) + 1];
    strcpy (a, s);
    puts (a);
  }

  {
    char b[strlen (t)];
    puts (b);                           // { dg-warning "-Wuninitialized" }
  }
}


void test_printf_puts (const char *s)
{
  char *p = __builtin_malloc (1);

  printf ("%s", s);

  puts (p);                             // { dg-warning "-Wuninitialized" }
}
