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