1/* PR middle-end/19551 */ 2/* { dg-options "-O2" } */ 3/* { dg-do link } */ 4 5extern void abort (); 6 7#define T(type, name) \ 8extern __attribute__((pure)) _Complex type \ 9foo_c##name (int x); \ 10 \ 11void \ 12bar_c##name (type *x) \ 13{ \ 14 type f = __real foo_c##name (5); \ 15 if (0) *x = f; \ 16} \ 17 \ 18void \ 19baz_c##name (type *x) \ 20{ \ 21 type f = __imag foo_c##name (5); \ 22 if (0) *x = f; \ 23} \ 24 \ 25extern __attribute__((pure)) type \ 26foo_##name (int x); \ 27 \ 28void \ 29bar_##name (type *x) \ 30{ \ 31 type f = foo_##name (5); \ 32 if (0) *x = f; \ 33} 34 35typedef long double ldouble_t; 36typedef long long llong; 37 38T (float, float) 39T (double, double) 40T (long double, ldouble_t) 41T (char, char) 42T (short, short) 43T (int, int) 44T (long, long) 45T (long long, llong) 46#undef T 47 48int 49main (void) 50{ 51#define T(type, name) \ 52 { \ 53 type var = 0; \ 54 bar_c##name (&var); \ 55 baz_c##name (&var); \ 56 bar_##name (&var); \ 57 } 58 T (float, float) 59 T (double, double) 60 T (long double, ldouble_t) 61 T (char, char) 62 T (short, short) 63 T (int, int) 64 T (long, long) 65 T (long long, llong) 66 return 0; 67} 68