/* PR c/83656 - missing -Wbuiltin-declaration-mismatch on declaration
   without prototype
   { dg-do compile }
   { dg-options "-Wbuiltin-declaration-mismatch" } */

typedef __PTRDIFF_TYPE__ ptrdiff_t;
typedef __SIZE_TYPE__    size_t;

char c;
signed char sc;
unsigned char uc;
short si;
unsigned short usi;
int i;
unsigned ui;
long li;
unsigned long uli;

size_t szi;
typedef size_t SizeType;
SizeType szti;

ptrdiff_t diffi;

enum E { e0 } e;

float f;
double d;
long double ld;


/* Verify warnings for undefined calls to built-ins expecting integer
   arguments.  */

int abs ();         /* { dg-message "built-in .abs. declared here" } */

void test_integer_conversion_abs (void)
{
  i = abs (c);
  i = abs (sc);
  i = abs (uc);

  i = abs (si);
  i = abs (usi);    /* { dg-warning ".abs. argument 1 promotes to .unsigned int. where .int. is expected in a call to built-in function declared without prototype" "" { target short_eq_int } } */

  i = abs (i);
  i = abs (ui);     /* { dg-warning ".abs. argument 1 type is .unsigned int. where .int. is expected in a call to built-in function declared without prototype" } */

  /* Verify that the same call as above but to the built-in doesn't
     trigger a warning.  */
  i = __builtin_abs (ui);

  i = abs (li);     /* { dg-warning ".abs. argument 1 type is .long int. where .int. is expected in a call to built-in function declared without prototype" } */
  i = abs (uli);    /* { dg-warning ".abs. argument 1 type is .long unsigned int. where .int. is expected in a call to built-in function declared without prototype" } */

  i = abs (e0);
  i = abs (e);

  i = abs (-1.0);   /* { dg-warning ".abs. argument 1 type is .double. where .int. is expected in a call to built-in function declared without prototype" } */
  i = abs (f);      /* { dg-warning ".abs. argument 1 promotes to .double. where .int. is expected in a call to built-in function declared without prototype" } */
  i = abs (ld);     /* { dg-warning ".abs. argument 1 type is .long double. where .int. is expected in a call to built-in function declared without prototype" } */

  /* Verify that the same call as above but to the built-in doesn't
     trigger a warning.  */
  i = __builtin_abs (ld);
}


extern void* memset ();

void test_integer_conversion_memset (void *d)
{
  memset (d, 0, sizeof (int));
  memset (d, '\0', szi);
  memset (d, i, szti);

  /* Passing a ptrdiff_t where size_t is expected may not be unsafe
     but because GCC may emits suboptimal code for such calls warning
     for them helps improve efficiency.  */
  memset (d, 0, diffi);       /* { dg-warning ".memset. argument 3 promotes to .ptrdiff_t. {aka .\(long \)?\(int\)?\(__int20\)?.} where .\(long \)?\(__int20 \)?unsigned\( int\)?. is expected" } */

  memset (d, 0, 2.0);         /* { dg-warning ".memset. argument 3 type is .double. where '\(long \)?\(__int20 \)?unsigned\( int\)?' is expected" } */

  /* Verify that the same call as above but to the built-in doesn't
     trigger a warning.  */
  __builtin_memset (d, 0.0, 4.0);
}


/* Verify warnings for undefined calls to built-ins expecting floating
   arguments.  */

double fabs ();           /* { dg-message "built-in .fabs. declared here" } */

/* Expect a warning for fabsf below because even a float argument promotes
   to double.  Unfortunately, invalid calls to fabsf() are not diagnosed.  */
float fabsf ();           /* { dg-warning "conflicting types for built-in function .fabsf.; expected .float\\\(float\\\)." } */
long double fabsl ();     /* { dg-message "built-in .fabsl. declared here" } */

void test_real_conversion_fabs (void)
{
  d = fabs (c);     /* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" } */

  d = fabs (i);     /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */

  d = fabs (li);    /* { dg-warning ".fabs. argument 1 type is .long int. where .double. is expected in a call to built-in function declared without prototype" } */

  /* In C, the type of an enumeration constant is int.  */
  d = fabs (e0);    /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */

  d = fabs (e);     /* { dg-warning ".fabs. argument 1 type is .enum E. where .double. is expected in a call to built-in function declared without prototype" "ordinary enum" { target { ! short_enums } } } */
  /* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" "size 1 enum" { target short_enums } .-1 } */

  /* No warning here since float is promoted to double.  */
  d = fabs (f);

  d = fabs (ld);    /* { dg-warning ".fabs. argument 1 type is .long double. where .double. is expected in a call to built-in function declared without prototype" } */

  d = fabsf (c);    /* { dg-warning ".fabsf. argument 1 promotes to .int. where .float. is expected in a call to built-in function declared without prototype" "pr87890" { xfail *-*-* } } */

  d = fabsl (c);    /* { dg-warning ".fabsl. argument 1 promotes to .int. where .long double. is expected in a call to built-in function declared without prototype" } */

  d = fabsl (f);    /* { dg-warning ".fabsl. argument 1 promotes to .double. where .long double. is expected in a call to built-in function declared without prototype" } */

  /* Verify that the same call as above but to the built-in doesn't
     trigger a warning.  */
  d = __builtin_fabsl (f);
}

/* Verify warnings for calls to a two-argument real function.  */

double pow ();      /* { dg-message "built-in .pow. declared here" } */

void test_real_conversion_pow (void)
{
  d = pow (2.0, 2.0);
  d = pow (d, 3.0);
  d = pow (d, d);

  d = pow (2, 3.0); /* { dg-warning ".pow. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */
  d = pow (3.0, 2); /* { dg-warning ".pow. argument 2 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */
}


/* Verify warnings for calls that discard qualifiers.  */

extern void* memcpy ();

void test_qual_conversion_memcpy (void *d, const void *s)
{
  memcpy (d, s, sizeof (int));
  memcpy (s, d, sizeof (int));    /* { dg-warning "passing argument 1 of .memcpy. discards 'const' qualifier from pointer target type" } */
}
