1/* { dg-do run { target int128 } } */
2/* { dg-options "-std=gnu99" { target c } } */
3/* { dg-options "" { target c++ } } */
4
5#include <stdarg.h>
6
7#ifndef __cplusplus
8extern void abort (void);
9#else
10extern "C" void abort (void);
11#endif
12
13#define MK_CONST128(A,B,C,D) \
14        ( (((unsigned __int128) (unsigned int) A) << 96) \
15         | (((unsigned __int128) (unsigned int) B) << 64) \
16         | (((unsigned __int128) (unsigned int) C) << 32) \
17         | ((unsigned __int128) (unsigned int) D) )
18
19#define MK_CONST128_SIGNED(A,B,C,D) \
20        ((__int128) MK_CONST128(A, B, C, D))
21
22void foo(int i, ...)
23{
24  __int128 q;
25  va_list va;
26
27  va_start(va, i);
28  q = va_arg(va, __int128);
29  va_end(va);
30
31  if (q != MK_CONST128_SIGNED (0xfeffffffU, 2U, 3U, 4U))
32    abort();
33}
34
35int main(void)
36{
37  __int128 q = MK_CONST128_SIGNED (0xfeffffffU, 2U, 3U, 4U);
38
39  foo(1, q);
40  return 0;
41}
42