(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
fixed-point/
func-struct.c
       1  /* { dg-do run } */
       2  /* { dg-options "-std=gnu99" } */
       3  
       4  /* C99 6.5.2.2 Function calls.
       5     Test structure passing and return values involving fixed-point types.
       6     Based on the test from ../dfp/.  */
       7  
       8  extern void abort (void);
       9  
      10  struct example
      11  {
      12    short _Fract sf;
      13    char dummy1;
      14    _Fract f;
      15    char dummy2;
      16    long _Fract lf;
      17    char dummy3;
      18    long long _Fract llf;
      19    char dummy4;
      20    unsigned short _Fract usf;
      21    char dummy5;
      22    unsigned _Fract uf;
      23    char dummy6;
      24    unsigned long _Fract ulf;
      25    char dummy7;
      26    unsigned long long _Fract ullf;
      27    char dummy8;
      28    _Sat short _Fract Ssf;
      29    char dummy9;
      30    _Sat _Fract Sf;
      31    char dummy10;
      32    _Sat long _Fract Slf;
      33    char dummy11;
      34    _Sat long long _Fract Sllf;
      35    char dummy12;
      36    _Sat unsigned short _Fract Susf;
      37    char dummy13;
      38    _Sat unsigned _Fract Suf;
      39    char dummy14;
      40    _Sat unsigned long _Fract Sulf;
      41    char dummy15;
      42    _Sat unsigned long long _Fract Sullf;
      43    char dummy16;
      44    short _Accum sa;
      45    char dummya1;
      46    _Accum a;
      47    char dummya2;
      48    long _Accum la;
      49    char dummya3;
      50    long long _Accum lla;
      51    char dummya4;
      52    unsigned short _Accum usa;
      53    char dummya5;
      54    unsigned _Accum ua;
      55    char dummya6;
      56    unsigned long _Accum ula;
      57    char dummya7;
      58    unsigned long long _Accum ulla;
      59    char dummya8;
      60    _Sat short _Accum Ssa;
      61    char dummya9;
      62    _Sat _Accum Sa;
      63    char dummya10;
      64    _Sat long _Accum Sla;
      65    char dummya11;
      66    _Sat long long _Accum Slla;
      67    char dummya12;
      68    _Sat unsigned short _Accum Susa;
      69    char dummya13;
      70    _Sat unsigned _Accum Sua;
      71    char dummya14;
      72    _Sat unsigned long _Accum Sula;
      73    char dummya15;
      74    _Sat unsigned long long _Accum Sulla;
      75    char dummya16;
      76  } nums = { 0.1hr, 'a',
      77  	   0.2r, 'b',
      78  	   0.3lr, 'c',
      79  	   0.4llr, 'd',
      80  	   0.5uhr, 'e',
      81  	   0.6ur, 'f',
      82  	   0.7ulr, 'g',
      83  	   0.8ullr, 'h',
      84  	   0.11r, 'i',
      85  	   0.22r, 'j',
      86  	   0.33lr, 'k',
      87  	   0.44llr, 'l',
      88  	   0.55uhr, 'm',
      89  	   0.66ur, 'n',
      90  	   0.77ulr, 'o',
      91  	   0.88ullr, 'p',
      92  	   0.1hk, 'q',
      93  	   0.2k, 'r',
      94  	   0.3lk, 's',
      95  	   0.4llk, 't',
      96  	   0.5uhk, 'u',
      97  	   0.6uk, 'v',
      98  	   0.7ulk, 'w',
      99  	   0.8ullk, 'x',
     100  	   0.11k, 'y',
     101  	   0.22k, 'z',
     102  	   0.33lk, '0',
     103  	   0.44llk, '1',
     104  	   0.55uhk, '2',
     105  	   0.66uk, '3',
     106  	   0.77ulk, '4',
     107  	   0.88ullk, '5'
     108  	 };
     109  
     110  /* A handful of functions that return the Nth argument of
     111     an incoming array.  */
     112  
     113  #define FUNC(TYPE,NAME) \
     114  TYPE NAME ## _func (struct example s) \
     115    { return s. NAME; }
     116  
     117  FUNC (short _Fract, sf)
     118  FUNC (_Fract, f)
     119  FUNC (long _Fract, lf)
     120  FUNC (long long _Fract, llf)
     121  FUNC (unsigned short _Fract, usf)
     122  FUNC (unsigned _Fract, uf)
     123  FUNC (unsigned long _Fract, ulf)
     124  FUNC (unsigned long long _Fract, ullf)
     125  FUNC (_Sat short _Fract, Ssf)
     126  FUNC (_Sat _Fract, Sf)
     127  FUNC (_Sat long _Fract, Slf)
     128  FUNC (_Sat long long _Fract, Sllf)
     129  FUNC (_Sat unsigned short _Fract, Susf)
     130  FUNC (_Sat unsigned _Fract, Suf)
     131  FUNC (_Sat unsigned long _Fract, Sulf)
     132  FUNC (_Sat unsigned long long _Fract, Sullf)
     133  FUNC (short _Accum, sa)
     134  FUNC (_Accum, a)
     135  FUNC (long _Accum, la)
     136  FUNC (long long _Accum, lla)
     137  FUNC (unsigned short _Accum, usa)
     138  FUNC (unsigned _Accum, ua)
     139  FUNC (unsigned long _Accum, ula)
     140  FUNC (unsigned long long _Accum, ulla)
     141  FUNC (_Sat short _Accum, Ssa)
     142  FUNC (_Sat _Accum, Sa)
     143  FUNC (_Sat long _Accum, Sla)
     144  FUNC (_Sat long long _Accum, Slla)
     145  FUNC (_Sat unsigned short _Accum, Susa)
     146  FUNC (_Sat unsigned _Accum, Sua)
     147  FUNC (_Sat unsigned long _Accum, Sula)
     148  FUNC (_Sat unsigned long long _Accum, Sulla)
     149  
     150  int main()
     151  {
     152  #define TEST(TYPE,NAME,VALUE) \
     153    { \
     154      if (NAME ## _func (nums) != VALUE) abort (); \
     155    }
     156  
     157    TEST (short _Fract, sf, 0.1hr)
     158    TEST (_Fract, f, 0.2r)
     159    TEST (long _Fract, lf, 0.3lr)
     160    TEST (long long _Fract, llf, 0.4llr)
     161    TEST (unsigned short _Fract, usf, 0.5uhr)
     162    TEST (unsigned _Fract, uf, 0.6ur)
     163    TEST (unsigned long _Fract, ulf, 0.7ulr)
     164    TEST (unsigned long long _Fract, ullf, 0.8ullr)
     165    TEST (_Sat short _Fract, Ssf, 0.11hr)
     166    TEST (_Sat _Fract, Sf, 0.22r)
     167    TEST (_Sat long _Fract, Slf, 0.33lr)
     168    TEST (_Sat long long _Fract, Sllf, 0.44llr)
     169    TEST (_Sat unsigned short _Fract, Susf, 0.55uhr)
     170    TEST (_Sat unsigned _Fract, Suf, 0.66ur)
     171    TEST (_Sat unsigned long _Fract, Sulf, 0.77ulr)
     172    TEST (_Sat unsigned long long _Fract, Sullf, 0.88ullr)
     173    TEST (short _Accum, sa, 0.1hk)
     174    TEST (_Accum, a, 0.2k)
     175    TEST (long _Accum, la, 0.3lk)
     176    TEST (long long _Accum, lla, 0.4llk)
     177    TEST (unsigned short _Accum, usa, 0.5uhk)
     178    TEST (unsigned _Accum, ua, 0.6uk)
     179    TEST (unsigned long _Accum, ula, 0.7ulk)
     180    TEST (unsigned long long _Accum, ulla, 0.8ullk)
     181    TEST (_Sat short _Accum, Ssa, 0.11hk)
     182    TEST (_Sat _Accum, Sa, 0.22k)
     183    TEST (_Sat long _Accum, Sla, 0.33lk)
     184    TEST (_Sat long long _Accum, Slla, 0.44llk)
     185    TEST (_Sat unsigned short _Accum, Susa, 0.55uhk)
     186    TEST (_Sat unsigned _Accum, Sua, 0.66uk)
     187    TEST (_Sat unsigned long _Accum, Sula, 0.77ulk)
     188    TEST (_Sat unsigned long long _Accum, Sulla, 0.88ullk)
     189  
     190    return 0;
     191  }