(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
binary-constants-1.c
       1  /* Test for binary integer constants.  */
       2  
       3  /* Derived from: c99-intconst-1.c, bye Joseph Myers <jsm28@cam.ac.uk>.  */
       4  /* Origin: Joerg Wunsch <j.gnu@uriah.heep.sax.de>.  */
       5  /* { dg-do compile } */
       6  /* { dg-options "-std=gnu99" } */
       7  
       8  #include <limits.h>
       9  
      10  /* Assertion that constant C is of type T.  */
      11  #define ASSERT_CONST_TYPE(C, T)			\
      12  	do {					\
      13  	  typedef T type;			\
      14  	  typedef type **typepp;		\
      15  	  typedef __typeof__((C)) ctype;	\
      16  	  typedef ctype **ctypepp;		\
      17  	  typepp x = 0;				\
      18  	  ctypepp y = 0;			\
      19  	  x = y;				\
      20  	  y = x;				\
      21  	} while (0)
      22  
      23  /* (T *) if E is zero, (void *) otherwise.  */
      24  #define type_if_not(T, E) __typeof__(0 ? (T *)0 : (void *)(E))
      25  
      26  /* (T *) if E is nonzero, (void *) otherwise.  */
      27  #define type_if(T, E) type_if_not(T, !(E))
      28  
      29  /* Combine pointer types, all but one (void *).  */
      30  #define type_comb2(T1, T2) __typeof__(0 ? (T1)0 : (T2)0)
      31  #define type_comb3(T1, T2, T3) type_comb2(T1, type_comb2(T2, T3))
      32  #define type_comb4(T1, T2, T3, T4)				\
      33  	type_comb2(T1, type_comb2(T2, type_comb2(T3, T4)))
      34  #define type_comb6(T1, T2, T3, T4, T5, T6)				   \
      35  	type_comb2(T1,							   \
      36  		   type_comb2(T2,					   \
      37  			      type_comb2(T3,				   \
      38  					 type_comb2(T4,			   \
      39  						    type_comb2(T5, T6)))))
      40  
      41  /* (T1 *) if E1, otherwise (T2 *) if E2.  */
      42  #define first_of2p(T1, E1, T2, E2) type_comb2(type_if(T1, (E1)),	   \
      43  					     type_if(T2, (!(E1) && (E2))))
      44  /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3.  */
      45  #define first_of3p(T1, E1, T2, E2, T3, E3)			\
      46  	type_comb3(type_if(T1, (E1)),				\
      47  		   type_if(T2, (!(E1) && (E2))),		\
      48  		   type_if(T3, (!(E1) && !(E2) && (E3))))
      49  /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3, otherwise
      50     (T4 *) if E4.  */
      51  #define first_of4p(T1, E1, T2, E2, T3, E3, T4, E4)			\
      52  	type_comb4(type_if(T1, (E1)),					\
      53  		   type_if(T2, (!(E1) && (E2))),			\
      54  		   type_if(T3, (!(E1) && !(E2) && (E3))),		\
      55  		   type_if(T4, (!(E1) && !(E2) && !(E3) && (E4))))
      56  /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3, otherwise
      57     (T4 *) if E4, otherwise (T5 *) if E5, otherwise (T6 *) if E6.  */
      58  #define first_of6p(T1, E1, T2, E2, T3, E3, T4, E4, T5, E5, T6, E6)	    \
      59  	type_comb6(type_if(T1, (E1)),					    \
      60  		   type_if(T2, (!(E1) && (E2))),			    \
      61  		   type_if(T3, (!(E1) && !(E2) && (E3))),		    \
      62  		   type_if(T4, (!(E1) && !(E2) && !(E3) && (E4))),	    \
      63  		   type_if(T5, (!(E1) && !(E2) && !(E3) && !(E4) && (E5))), \
      64  		   type_if(T6, (!(E1) && !(E2) && !(E3)			    \
      65  				&& !(E4) && !(E5) && (E6))))
      66  
      67  /* Likewise, but return the original type rather than a pointer type.  */
      68  #define first_of2(T1, E1, T2, E2)			\
      69  	__typeof__(*((first_of2p(T1, (E1), T2, (E2)))0))
      70  #define first_of3(T1, E1, T2, E2, T3, E3)				\
      71  	__typeof__(*((first_of3p(T1, (E1), T2, (E2), T3, (E3)))0))
      72  #define first_of4(T1, E1, T2, E2, T3, E3, T4, E4)			    \
      73  	__typeof__(*((first_of4p(T1, (E1), T2, (E2), T3, (E3), T4, (E4)))0))
      74  #define first_of6(T1, E1, T2, E2, T3, E3, T4, E4, T5, E5, T6, E6)	\
      75  	__typeof__(*((first_of6p(T1, (E1), T2, (E2), T3, (E3),		\
      76  				 T4, (E4), T5, (E5), T6, (E6)))0))
      77  
      78  /* Types of constants according to the C99 rules.  */
      79  #define C99_UNSUF_TYPE(C)					\
      80  	first_of6(int, (C) <= INT_MAX,				\
      81  		  unsigned int, (C) <= UINT_MAX,		\
      82  		  long int, (C) <= LONG_MAX,			\
      83  		  unsigned long int, (C) <= ULONG_MAX,		\
      84  		  long long int, (C) <= LLONG_MAX,		\
      85  		  unsigned long long int, (C) <= ULLONG_MAX)
      86  #define C99_SUFu_TYPE(C)					\
      87  	first_of3(unsigned int, (C) <= UINT_MAX,		\
      88  		  unsigned long int, (C) <= ULONG_MAX,		\
      89  		  unsigned long long int, (C) <= ULLONG_MAX)
      90  #define C99_SUFl_TYPE(C)					\
      91  	first_of4(long int, (C) <= LONG_MAX,			\
      92  		  unsigned long int, (C) <= ULONG_MAX,		\
      93  		  long long int, (C) <= LLONG_MAX,		\
      94  		  unsigned long long int, (C) <= ULLONG_MAX)
      95  #define C99_SUFul_TYPE(C)					\
      96  	first_of2(unsigned long int, (C) <= ULONG_MAX,		\
      97  		  unsigned long long int, (C) <= ULLONG_MAX)
      98  #define C99_SUFll_TYPE(C)					\
      99  	first_of2(long long int, (C) <= LLONG_MAX,		\
     100  		  unsigned long long int, (C) <= ULLONG_MAX)
     101  
     102  /* Checks that constants have correct type.  */
     103  #define CHECK_UNSUF_TYPE(C)				\
     104  	ASSERT_CONST_TYPE((C), C99_UNSUF_TYPE((C)))
     105  #define CHECK_SUFu_TYPE(C) ASSERT_CONST_TYPE((C), C99_SUFu_TYPE((C)))
     106  #define CHECK_SUFl_TYPE(C)				\
     107  	ASSERT_CONST_TYPE((C), C99_SUFl_TYPE((C)))
     108  #define CHECK_SUFul_TYPE(C) ASSERT_CONST_TYPE((C), C99_SUFul_TYPE((C)))
     109  #define CHECK_SUFll_TYPE(C)				\
     110  	ASSERT_CONST_TYPE((C), C99_SUFll_TYPE((C)))
     111  #define CHECK_SUFull_TYPE(C) ASSERT_CONST_TYPE((C), unsigned long long int)
     112  
     113  /* Check an octal or hexadecimal value, with all suffixes.  */
     114  #define CHECK_CONST(C)                  	\
     115  	CHECK_UNSUF_TYPE(C);                    \
     116  	CHECK_SUFu_TYPE(C##u);			\
     117  	CHECK_SUFu_TYPE(C##U);			\
     118  	CHECK_SUFl_TYPE(C##l);                  \
     119  	CHECK_SUFl_TYPE(C##L);                  \
     120  	CHECK_SUFul_TYPE(C##ul);		\
     121  	CHECK_SUFul_TYPE(C##uL);		\
     122  	CHECK_SUFul_TYPE(C##Ul);		\
     123  	CHECK_SUFul_TYPE(C##UL);		\
     124  	CHECK_SUFll_TYPE(C##ll);		\
     125  	CHECK_SUFll_TYPE(C##LL);		\
     126  	CHECK_SUFull_TYPE(C##ull);		\
     127  	CHECK_SUFull_TYPE(C##uLL);		\
     128  	CHECK_SUFull_TYPE(C##Ull);		\
     129  	CHECK_SUFull_TYPE(C##ULL);
     130  
     131  #define CHECK_BIN_CONST(C)			\
     132  	CHECK_CONST(0b##C);                     \
     133  	CHECK_CONST(0B##C);
     134  
     135  /* True iff "long long" is at least B bits.  This presumes that (B-2)/3 is at
     136     most 63.  */
     137  #define LLONG_AT_LEAST(B)			\
     138  	(LLONG_MAX >> ((B)-2)/3 >> ((B)-2)/3	\
     139  	 >> ((B)-2 - ((B)-2)/3 - ((B)-2)/3))
     140  
     141  #define LLONG_HAS_BITS(B) (LLONG_AT_LEAST((B)) && !LLONG_AT_LEAST((B) + 1))
     142  
     143  #define FOO 0b1101
     144  #if !FOO
     145  # error "preprocessor does not accept binary constants"
     146  #endif
     147  
     148  void
     149  foo (void)
     150  {
     151    /* Check all 2^n and 2^n - 1 up to 2^72 - 1.  */
     152    CHECK_BIN_CONST(1);
     153    CHECK_BIN_CONST(10);
     154    CHECK_BIN_CONST(11);
     155    CHECK_BIN_CONST(100);
     156    CHECK_BIN_CONST(111);
     157    CHECK_BIN_CONST(1000);
     158    CHECK_BIN_CONST(1111);
     159    CHECK_BIN_CONST(10000);
     160    CHECK_BIN_CONST(11111);
     161    CHECK_BIN_CONST(100000);
     162    CHECK_BIN_CONST(111111);
     163    CHECK_BIN_CONST(1000000);
     164    CHECK_BIN_CONST(1111111);
     165    CHECK_BIN_CONST(10000000);
     166    CHECK_BIN_CONST(11111111);
     167    CHECK_BIN_CONST(100000000);
     168    CHECK_BIN_CONST(111111111);
     169    CHECK_BIN_CONST(1000000000);
     170    CHECK_BIN_CONST(1111111111);
     171    CHECK_BIN_CONST(10000000000);
     172    CHECK_BIN_CONST(11111111111);
     173    CHECK_BIN_CONST(100000000000);
     174    CHECK_BIN_CONST(111111111111);
     175    CHECK_BIN_CONST(1000000000000);
     176    CHECK_BIN_CONST(1111111111111);
     177    CHECK_BIN_CONST(10000000000000);
     178    CHECK_BIN_CONST(11111111111111);
     179    CHECK_BIN_CONST(100000000000000);
     180    CHECK_BIN_CONST(111111111111111);
     181    CHECK_BIN_CONST(1000000000000000);
     182    CHECK_BIN_CONST(1111111111111111);
     183    CHECK_BIN_CONST(10000000000000000);
     184    CHECK_BIN_CONST(11111111111111111);
     185    CHECK_BIN_CONST(100000000000000000);
     186    CHECK_BIN_CONST(111111111111111111);
     187    CHECK_BIN_CONST(1000000000000000000);
     188    CHECK_BIN_CONST(1111111111111111111);
     189    CHECK_BIN_CONST(10000000000000000000);
     190    CHECK_BIN_CONST(11111111111111111111);
     191    CHECK_BIN_CONST(100000000000000000000);
     192    CHECK_BIN_CONST(111111111111111111111);
     193    CHECK_BIN_CONST(1000000000000000000000);
     194    CHECK_BIN_CONST(1111111111111111111111);
     195    CHECK_BIN_CONST(10000000000000000000000);
     196    CHECK_BIN_CONST(11111111111111111111111);
     197    CHECK_BIN_CONST(100000000000000000000000);
     198    CHECK_BIN_CONST(111111111111111111111111);
     199    CHECK_BIN_CONST(1000000000000000000000000);
     200    CHECK_BIN_CONST(1111111111111111111111111);
     201    CHECK_BIN_CONST(10000000000000000000000000);
     202    CHECK_BIN_CONST(11111111111111111111111111);
     203    CHECK_BIN_CONST(100000000000000000000000000);
     204    CHECK_BIN_CONST(111111111111111111111111111);
     205    CHECK_BIN_CONST(1000000000000000000000000000);
     206    CHECK_BIN_CONST(1111111111111111111111111111);
     207    CHECK_BIN_CONST(10000000000000000000000000000);
     208    CHECK_BIN_CONST(11111111111111111111111111111);
     209    CHECK_BIN_CONST(100000000000000000000000000000);
     210    CHECK_BIN_CONST(111111111111111111111111111111);
     211    CHECK_BIN_CONST(1000000000000000000000000000000);
     212    CHECK_BIN_CONST(1111111111111111111111111111111);
     213    CHECK_BIN_CONST(10000000000000000000000000000000);
     214    CHECK_BIN_CONST(11111111111111111111111111111111);
     215    CHECK_BIN_CONST(100000000000000000000000000000000);
     216    CHECK_BIN_CONST(111111111111111111111111111111111);
     217    CHECK_BIN_CONST(1000000000000000000000000000000000);
     218    CHECK_BIN_CONST(1111111111111111111111111111111111);
     219    CHECK_BIN_CONST(10000000000000000000000000000000000);
     220    CHECK_BIN_CONST(11111111111111111111111111111111111);
     221    CHECK_BIN_CONST(100000000000000000000000000000000000);
     222    CHECK_BIN_CONST(111111111111111111111111111111111111);
     223    CHECK_BIN_CONST(1000000000000000000000000000000000000);
     224    CHECK_BIN_CONST(1111111111111111111111111111111111111);
     225    CHECK_BIN_CONST(10000000000000000000000000000000000000);
     226    CHECK_BIN_CONST(11111111111111111111111111111111111111);
     227    CHECK_BIN_CONST(100000000000000000000000000000000000000);
     228    CHECK_BIN_CONST(111111111111111111111111111111111111111);
     229    CHECK_BIN_CONST(1000000000000000000000000000000000000000);
     230    CHECK_BIN_CONST(1111111111111111111111111111111111111111);
     231    CHECK_BIN_CONST(10000000000000000000000000000000000000000);
     232    CHECK_BIN_CONST(11111111111111111111111111111111111111111);
     233    CHECK_BIN_CONST(100000000000000000000000000000000000000000);
     234    CHECK_BIN_CONST(111111111111111111111111111111111111111111);
     235    CHECK_BIN_CONST(1000000000000000000000000000000000000000000);
     236    CHECK_BIN_CONST(1111111111111111111111111111111111111111111);
     237    CHECK_BIN_CONST(10000000000000000000000000000000000000000000);
     238    CHECK_BIN_CONST(11111111111111111111111111111111111111111111);
     239    CHECK_BIN_CONST(100000000000000000000000000000000000000000000);
     240    CHECK_BIN_CONST(111111111111111111111111111111111111111111111);
     241    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000);
     242    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111);
     243    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000);
     244    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111);
     245    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000);
     246    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111);
     247    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000);
     248    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111);
     249    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000);
     250    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111);
     251    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000);
     252    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111);
     253    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000);
     254    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111);
     255    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000);
     256    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111);
     257    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000);
     258    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111);
     259    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000);
     260    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111);
     261    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000);
     262    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111);
     263    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000);
     264    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111);
     265    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000);
     266    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111);
     267    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000);
     268    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111);
     269    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000);
     270    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111);
     271    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000);
     272    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111);
     273    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000);
     274    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111);
     275    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000);
     276    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111);
     277    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000);
     278    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111);
     279  #if LLONG_AT_LEAST(65)
     280    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000);
     281    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111);
     282  #endif
     283  #if LLONG_AT_LEAST(66)
     284    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000);
     285    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111);
     286  #endif
     287  #if LLONG_AT_LEAST(67)
     288    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000000);
     289    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111111);
     290  #endif
     291  #if LLONG_AT_LEAST(68)
     292    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000000);
     293    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111111);
     294  #endif
     295  #if LLONG_AT_LEAST(69)
     296    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000000);
     297    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111111);
     298  #endif
     299  #if LLONG_AT_LEAST(70)
     300    CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000000000);
     301    CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111111111);
     302  #endif
     303  #if LLONG_AT_LEAST(71)
     304    CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000000000);
     305    CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111111111);
     306  #endif
     307  #if LLONG_AT_LEAST(72)
     308    CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000000000);
     309    CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111111111);
     310  #endif
     311  }
     312