/* Test C23 constexpr.  Valid code, execution test.  */
/* { dg-do run } */
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-additional-sources "c23-constexpr-2b.c" } */

extern void abort (void);
extern void exit (int);

/* constexpr objects at file scope have internal linkage.  */
constexpr int a = 2;

struct s { int a; float b; int c[3]; };
constexpr struct s s1 = { 2, 3, { 4, 5, 6 } };
constexpr struct s s2 = s1;
struct s s3 = s2;

void
check (const struct s *p)
{
  if (p->a != 2 || p->b != 3 || p->c[0] != 4 || p->c[1] != 5 || p->c[2] != 6)
    abort ();
}

int
main ()
{
  constexpr struct s s4 = s1;
  struct s s5 = s4;
  constexpr struct s s6 = { s1.a, s2.b, { 4, 5, 6 } };
  check (&s1);
  check (&s2);
  check (&s3);
  check (&s4);
  check (&s5);
  check (&s6);
  exit (0);
}
