xref: /minix3/external/bsd/llvm/dist/clang/test/Sema/128bitint.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1f4a2713aSLionel Sambuc // RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-apple-darwin9 -fms-extensions %s -DHAVE
2f4a2713aSLionel Sambuc // RUN: %clang_cc1 -fsyntax-only -verify -triple i686-linux-gnu -fms-extensions %s -DHAVE_NOT
3f4a2713aSLionel Sambuc 
4f4a2713aSLionel Sambuc #ifdef HAVE
5f4a2713aSLionel Sambuc typedef int i128 __attribute__((__mode__(TI)));
6f4a2713aSLionel Sambuc typedef unsigned u128 __attribute__((__mode__(TI)));
7f4a2713aSLionel Sambuc 
8f4a2713aSLionel Sambuc int a[((i128)-1 ^ (i128)-2) == 1 ? 1 : -1];
9f4a2713aSLionel Sambuc int a[(u128)-1 > 1LL ? 1 : -1];
10f4a2713aSLionel Sambuc int a[__SIZEOF_INT128__ == 16 ? 1 : -1];
11f4a2713aSLionel Sambuc 
12f4a2713aSLionel Sambuc // PR5435
13f4a2713aSLionel Sambuc __uint128_t b = (__uint128_t)-1;
14f4a2713aSLionel Sambuc 
15f4a2713aSLionel Sambuc // PR11916: Support for libstdc++ 4.7
16f4a2713aSLionel Sambuc __int128 i = (__int128)0;
17f4a2713aSLionel Sambuc unsigned __int128 u = (unsigned __int128)-1;
18f4a2713aSLionel Sambuc 
19*0a6a1f1dSLionel Sambuc long long SignedTooBig = 123456789012345678901234567890; // expected-error {{integer literal is too large to be represented in any integer type}}
20f4a2713aSLionel Sambuc __int128_t Signed128 = 123456789012345678901234567890i128;
21f4a2713aSLionel Sambuc long long Signed64 = 123456789012345678901234567890i128; // expected-warning {{implicit conversion from '__int128' to 'long long' changes value from 123456789012345678901234567890 to -4362896299872285998}}
22*0a6a1f1dSLionel Sambuc unsigned long long UnsignedTooBig = 123456789012345678901234567890; // expected-error {{integer literal is too large to be represented in any integer type}}
23f4a2713aSLionel Sambuc __uint128_t Unsigned128 = 123456789012345678901234567890Ui128;
24f4a2713aSLionel Sambuc unsigned long long Unsigned64 = 123456789012345678901234567890Ui128; // expected-warning {{implicit conversion from 'unsigned __int128' to 'unsigned long long' changes value from 123456789012345678901234567890 to 14083847773837265618}}
25f4a2713aSLionel Sambuc 
26f4a2713aSLionel Sambuc // Ensure we don't crash when user passes 128-bit values to type safety
27f4a2713aSLionel Sambuc // attributes.
28f4a2713aSLionel Sambuc void pointer_with_type_tag_arg_num_1(void *buf, int datatype)
29f4a2713aSLionel Sambuc     __attribute__(( pointer_with_type_tag(mpi,0x10000000000000001i128,1) )); // expected-error {{attribute parameter 2 is out of bounds}}
30f4a2713aSLionel Sambuc 
31f4a2713aSLionel Sambuc void pointer_with_type_tag_arg_num_2(void *buf, int datatype)
32f4a2713aSLionel Sambuc     __attribute__(( pointer_with_type_tag(mpi,1,0x10000000000000001i128) )); // expected-error {{attribute parameter 3 is out of bounds}}
33f4a2713aSLionel Sambuc 
34f4a2713aSLionel Sambuc void MPI_Send(void *buf, int datatype) __attribute__(( pointer_with_type_tag(mpi,1,2) ));
35f4a2713aSLionel Sambuc 
36f4a2713aSLionel Sambuc static const __uint128_t mpi_int_wrong __attribute__(( type_tag_for_datatype(mpi,int) )) = 0x10000000000000001i128; // expected-error {{'type_tag_for_datatype' attribute requires the initializer to be an integer constant expression that can be represented by a 64 bit integer}}
37f4a2713aSLionel Sambuc static const int mpi_int __attribute__(( type_tag_for_datatype(mpi,int) )) = 10;
38f4a2713aSLionel Sambuc 
test(int * buf)39f4a2713aSLionel Sambuc void test(int *buf)
40f4a2713aSLionel Sambuc {
41f4a2713aSLionel Sambuc   MPI_Send(buf, 0x10000000000000001i128); // expected-warning {{implicit conversion from '__int128' to 'int' changes value}}
42f4a2713aSLionel Sambuc }
43f4a2713aSLionel Sambuc #else
44f4a2713aSLionel Sambuc 
45f4a2713aSLionel Sambuc __int128 n; // expected-error {{__int128 is not supported on this target}}
46f4a2713aSLionel Sambuc 
47f4a2713aSLionel Sambuc #if defined(__SIZEOF_INT128__)
48f4a2713aSLionel Sambuc #error __SIZEOF_INT128__ should not be defined
49f4a2713aSLionel Sambuc #endif
50f4a2713aSLionel Sambuc 
51f4a2713aSLionel Sambuc #endif
52