/* 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; }