/* PR middle-end/19551 */ /* { dg-options "-O2" } */ /* { dg-do link } */ extern void abort (); #define T(type, name) \ extern __attribute__((pure)) _Complex type \ foo_c##name (int x); \ \ void \ bar_c##name (type *x) \ { \ type f = __real foo_c##name (5); \ if (0) *x = f; \ } \ \ void \ baz_c##name (type *x) \ { \ type f = __imag foo_c##name (5); \ if (0) *x = f; \ } \ \ extern __attribute__((pure)) type \ foo_##name (int x); \ \ void \ bar_##name (type *x) \ { \ type f = foo_##name (5); \ if (0) *x = f; \ } 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_c##name (&var); \ baz_c##name (&var); \ bar_##name (&var); \ } 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; }