| /* { dg-do run } */ |
| /* { dg-options "-std=gnu99" } */ |
| |
| /* C99 6.5.2.2 Function calls. |
| Test structure passing and return values involving fixed-point types. |
| Based on the test from ../dfp/. */ |
| |
| extern void abort (void); |
| |
| struct example |
| { |
| short _Fract sf; |
| char dummy1; |
| _Fract f; |
| char dummy2; |
| long _Fract lf; |
| char dummy3; |
| long long _Fract llf; |
| char dummy4; |
| unsigned short _Fract usf; |
| char dummy5; |
| unsigned _Fract uf; |
| char dummy6; |
| unsigned long _Fract ulf; |
| char dummy7; |
| unsigned long long _Fract ullf; |
| char dummy8; |
| _Sat short _Fract Ssf; |
| char dummy9; |
| _Sat _Fract Sf; |
| char dummy10; |
| _Sat long _Fract Slf; |
| char dummy11; |
| _Sat long long _Fract Sllf; |
| char dummy12; |
| _Sat unsigned short _Fract Susf; |
| char dummy13; |
| _Sat unsigned _Fract Suf; |
| char dummy14; |
| _Sat unsigned long _Fract Sulf; |
| char dummy15; |
| _Sat unsigned long long _Fract Sullf; |
| char dummy16; |
| short _Accum sa; |
| char dummya1; |
| _Accum a; |
| char dummya2; |
| long _Accum la; |
| char dummya3; |
| long long _Accum lla; |
| char dummya4; |
| unsigned short _Accum usa; |
| char dummya5; |
| unsigned _Accum ua; |
| char dummya6; |
| unsigned long _Accum ula; |
| char dummya7; |
| unsigned long long _Accum ulla; |
| char dummya8; |
| _Sat short _Accum Ssa; |
| char dummya9; |
| _Sat _Accum Sa; |
| char dummya10; |
| _Sat long _Accum Sla; |
| char dummya11; |
| _Sat long long _Accum Slla; |
| char dummya12; |
| _Sat unsigned short _Accum Susa; |
| char dummya13; |
| _Sat unsigned _Accum Sua; |
| char dummya14; |
| _Sat unsigned long _Accum Sula; |
| char dummya15; |
| _Sat unsigned long long _Accum Sulla; |
| char dummya16; |
| } nums = { 0.1hr, 'a', |
| 0.2r, 'b', |
| 0.3lr, 'c', |
| 0.4llr, 'd', |
| 0.5uhr, 'e', |
| 0.6ur, 'f', |
| 0.7ulr, 'g', |
| 0.8ullr, 'h', |
| 0.11r, 'i', |
| 0.22r, 'j', |
| 0.33lr, 'k', |
| 0.44llr, 'l', |
| 0.55uhr, 'm', |
| 0.66ur, 'n', |
| 0.77ulr, 'o', |
| 0.88ullr, 'p', |
| 0.1hk, 'q', |
| 0.2k, 'r', |
| 0.3lk, 's', |
| 0.4llk, 't', |
| 0.5uhk, 'u', |
| 0.6uk, 'v', |
| 0.7ulk, 'w', |
| 0.8ullk, 'x', |
| 0.11k, 'y', |
| 0.22k, 'z', |
| 0.33lk, '0', |
| 0.44llk, '1', |
| 0.55uhk, '2', |
| 0.66uk, '3', |
| 0.77ulk, '4', |
| 0.88ullk, '5' |
| }; |
| |
| /* A handful of functions that return the Nth argument of |
| an incoming array. */ |
| |
| #define FUNC(TYPE,NAME) \ |
| TYPE NAME ## _func (struct example s) \ |
| { return s. NAME; } |
| |
| FUNC (short _Fract, sf) |
| FUNC (_Fract, f) |
| FUNC (long _Fract, lf) |
| FUNC (long long _Fract, llf) |
| FUNC (unsigned short _Fract, usf) |
| FUNC (unsigned _Fract, uf) |
| FUNC (unsigned long _Fract, ulf) |
| FUNC (unsigned long long _Fract, ullf) |
| FUNC (_Sat short _Fract, Ssf) |
| FUNC (_Sat _Fract, Sf) |
| FUNC (_Sat long _Fract, Slf) |
| FUNC (_Sat long long _Fract, Sllf) |
| FUNC (_Sat unsigned short _Fract, Susf) |
| FUNC (_Sat unsigned _Fract, Suf) |
| FUNC (_Sat unsigned long _Fract, Sulf) |
| FUNC (_Sat unsigned long long _Fract, Sullf) |
| FUNC (short _Accum, sa) |
| FUNC (_Accum, a) |
| FUNC (long _Accum, la) |
| FUNC (long long _Accum, lla) |
| FUNC (unsigned short _Accum, usa) |
| FUNC (unsigned _Accum, ua) |
| FUNC (unsigned long _Accum, ula) |
| FUNC (unsigned long long _Accum, ulla) |
| FUNC (_Sat short _Accum, Ssa) |
| FUNC (_Sat _Accum, Sa) |
| FUNC (_Sat long _Accum, Sla) |
| FUNC (_Sat long long _Accum, Slla) |
| FUNC (_Sat unsigned short _Accum, Susa) |
| FUNC (_Sat unsigned _Accum, Sua) |
| FUNC (_Sat unsigned long _Accum, Sula) |
| FUNC (_Sat unsigned long long _Accum, Sulla) |
| |
| int main() |
| { |
| #define TEST(TYPE,NAME,VALUE) \ |
| { \ |
| if (NAME ## _func (nums) != VALUE) abort (); \ |
| } |
| |
| TEST (short _Fract, sf, 0.1hr) |
| TEST (_Fract, f, 0.2r) |
| TEST (long _Fract, lf, 0.3lr) |
| TEST (long long _Fract, llf, 0.4llr) |
| TEST (unsigned short _Fract, usf, 0.5uhr) |
| TEST (unsigned _Fract, uf, 0.6ur) |
| TEST (unsigned long _Fract, ulf, 0.7ulr) |
| TEST (unsigned long long _Fract, ullf, 0.8ullr) |
| TEST (_Sat short _Fract, Ssf, 0.11hr) |
| TEST (_Sat _Fract, Sf, 0.22r) |
| TEST (_Sat long _Fract, Slf, 0.33lr) |
| TEST (_Sat long long _Fract, Sllf, 0.44llr) |
| TEST (_Sat unsigned short _Fract, Susf, 0.55uhr) |
| TEST (_Sat unsigned _Fract, Suf, 0.66ur) |
| TEST (_Sat unsigned long _Fract, Sulf, 0.77ulr) |
| TEST (_Sat unsigned long long _Fract, Sullf, 0.88ullr) |
| TEST (short _Accum, sa, 0.1hk) |
| TEST (_Accum, a, 0.2k) |
| TEST (long _Accum, la, 0.3lk) |
| TEST (long long _Accum, lla, 0.4llk) |
| TEST (unsigned short _Accum, usa, 0.5uhk) |
| TEST (unsigned _Accum, ua, 0.6uk) |
| TEST (unsigned long _Accum, ula, 0.7ulk) |
| TEST (unsigned long long _Accum, ulla, 0.8ullk) |
| TEST (_Sat short _Accum, Ssa, 0.11hk) |
| TEST (_Sat _Accum, Sa, 0.22k) |
| TEST (_Sat long _Accum, Sla, 0.33lk) |
| TEST (_Sat long long _Accum, Slla, 0.44llk) |
| TEST (_Sat unsigned short _Accum, Susa, 0.55uhk) |
| TEST (_Sat unsigned _Accum, Sua, 0.66uk) |
| TEST (_Sat unsigned long _Accum, Sula, 0.77ulk) |
| TEST (_Sat unsigned long long _Accum, Sulla, 0.88ullk) |
| |
| return 0; |
| } |