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