| /* PR middle-end/19551 */ |
| |
| extern void abort (); |
| |
| #define T(type, name) \ |
| __attribute__((pure)) _Complex type \ |
| foo_##name (int x) \ |
| { \ |
| _Complex type r; \ |
| __real r = x + 1; \ |
| __imag r = x - 1; \ |
| return r; \ |
| } \ |
| \ |
| void \ |
| bar_##name (type *x) \ |
| { \ |
| *x = __real foo_##name (5); \ |
| } \ |
| \ |
| void \ |
| baz_##name (type *x) \ |
| { \ |
| *x = __imag foo_##name (5); \ |
| } |
| |
| typedef long double ldouble_t; |
| typedef long long llong; |
| |
| T (float, float) |
| T (double, double) |
| T (long double, ldouble_t) |
| T (char, char) |
| T (short, short) |
| T (int, int) |
| T (long, long) |
| T (long long, llong) |
| #undef T |
| |
| int |
| main (void) |
| { |
| #define T(type, name) \ |
| { \ |
| type var = 0; \ |
| bar_##name (&var); \ |
| if (var != 6) \ |
| abort (); \ |
| var = 0; \ |
| baz_##name (&var); \ |
| if (var != 4) \ |
| abort (); \ |
| } |
| T (float, float) |
| T (double, double) |
| T (long double, ldouble_t) |
| T (char, char) |
| T (short, short) |
| T (int, int) |
| T (long, long) |
| T (long long, llong) |
| return 0; |
| } |