/* { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */

/* Disable this test for 16-bit targets.  */

#include <limits.h>

#if !(defined __GNUC__) || (INT_MAX > 32767)

#include "compat-common.h"
#include "struct-align-2.h"

#define TEST(NAME)						\
struct outer_##NAME {						\
  int i;							\
  struct epoll_event_##NAME ee;					\
};								\
								\
extern unsigned int v1_##NAME;					\
extern unsigned int v2_##NAME;					\
extern unsigned long long v3_##NAME;				\
								\
extern struct outer_##NAME s_##NAME[2];				\
								\
extern void pass_##NAME (struct outer_##NAME);			\
extern struct outer_##NAME return_##NAME (void);		\
								\
void								\
checkp_##NAME (struct outer_##NAME *p)				\
{								\
  if (p->i != v1_##NAME)					\
    DEBUG_CHECK;						\
  if (p->ee.events != v2_##NAME)				\
    DEBUG_CHECK;						\
  if (p->ee.data != v3_##NAME)					\
    DEBUG_CHECK;						\
}								\
								\
void								\
test_##NAME (void)						\
{								\
  struct outer_##NAME s;					\
  DEBUG_FPUTS (DESC_##NAME);					\
  DEBUG_NL;							\
  DEBUG_FPUTS ("  global array");				\
  checkp_##NAME (&s_##NAME[0]);					\
  checkp_##NAME (&s_##NAME[1]);					\
  DEBUG_NL;							\
  DEBUG_FPUTS ("  argument");					\
  pass_##NAME (s_##NAME[0]);					\
  DEBUG_NL;							\
  DEBUG_FPUTS ("  function result");				\
  s = return_##NAME ();						\
  checkp_##NAME (&s);						\
  DEBUG_NL;							\
}

TEST (orig)
#ifndef SKIP_ATTRIBUTE
TEST (structmax)
TEST (struct4)
TEST (struct8)
TEST (data4)
TEST (data8)
TEST (p)
TEST (pstruct4)
TEST (pstruct8)
TEST (pdata4)
TEST (pdata8)
#endif

#else

int i;  /* prevent compiling an empty file */

#endif  /* INT_MAX */
