1 /* PR middle-end/19551 */
2 /* { dg-options "-O2" } */
3 /* { dg-do link } */
4
5 extern void abort ();
6
7 #define T(type, name) \
8 extern __attribute__((pure)) _Complex type \
9 foo_c##name (int x); \
10 \
11 void \
12 bar_c##name (type *x) \
13 { \
14 type f = __real foo_c##name (5); \
15 if (0) *x = f; \
16 } \
17 \
18 void \
19 baz_c##name (type *x) \
20 { \
21 type f = __imag foo_c##name (5); \
22 if (0) *x = f; \
23 } \
24 \
25 extern __attribute__((pure)) type \
26 foo_##name (int x); \
27 \
28 void \
29 bar_##name (type *x) \
30 { \
31 type f = foo_##name (5); \
32 if (0) *x = f; \
33 }
34
35 typedef long double ldouble_t;
36 typedef long long llong;
37
T(float,float)38 T (float, float)
39 T (double, double)
40 T (long double, ldouble_t)
41 T (char, char)
42 T (short, short)
43 T (int, int)
44 T (long, long)
45 T (long long, llong)
46 #undef T
47
48 int
49 main (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