/* Test C2x deprecated attribute: valid uses.  */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */

/* Similar to tests from gnu2x-attrs-1.c, but using the standard
   attribute instead of gnu::deprecated, and sometimes using
   __deprecated__ or a string-literal argument.  */

[[deprecated]] void f1 (void);

[[deprecated]] typedef int dep_int;

dep_int dv; /* { dg-warning "deprecated" } */

void
g (void)
{
  f1 (); /* { dg-warning "deprecated" } */
}

int
f2 (void)
{
  [[deprecated ("for this reason")]] int a = 1;
  return a; /* { dg-warning "for this reason" } */
}

int
f3 (void)
{
  int a [[__deprecated__]] = 1;
  return a; /* { dg-warning "deprecated" } */
}

struct s2 { [[__deprecated__("some other message")]] int a; int b [[deprecated]]; } x;

int
f4 (void)
{
  return x.a; /* { dg-warning "some other message" } */
}

int
f5 (void)
{
  return x.b; /* { dg-warning "deprecated" } */
}

enum e { E1 [[deprecated("third message")]] };

enum e
f6 (void)
{
  return E1; /* { dg-warning "third message" } */
}

int
f7 ([[deprecated]] int y)
{
  return y; /* { dg-warning "deprecated" } */
}

union [[__deprecated__]] u { int x; };

void
f8 (void)
{
  union u var; /* { dg-warning "deprecated" } */
}

enum [[deprecated("edep reason")]] edep { E2 };

void
f9 (void)
{
  enum edep var; /* { dg-warning "edep reason" } */
}

union u2 { [[__deprecated__]] int a; int b [[deprecated]]; } y;

int
f10 (void)
{
  return y.a; /* { dg-warning "deprecated" } */
}

int
f11 (void)
{
  return y.b; /* { dg-warning "deprecated" } */
}

struct [[deprecated]] s { int x; };

void
f12 (void)
{
  struct s var; /* { dg-warning "deprecated" } */
}
