1 // PR c++/27894
2 // { dg-do compile }
3 // { dg-options "-O" }
4
5 class A;
6 struct B
7 {
8 B (unsigned long);
9 int b2 () const;
10 A *b1 () const;
11 };
12
13 enum { P = 0 };
14 enum O { Q = 75, };
15 class C;
16 struct D { A *d; };
17 struct E
18 {
19 B e1 (int) const;
20 A *e2 (const B &) const;
21 D e3[4096];
22 };
23
24 inline A *
e2(const B & x)25 E::e2 (const B & x) const
26 {
27 const D *w = &e3[x.b2 ()];
28 return (A *) w->d;
29 }
30
31 extern E *e;
32
33 inline A *
b1()34 B::b1 () const
35 {
36 extern E *e;
37 return e->e2 (*this);
38 }
39
40 template <class T> struct F : public B
41 {
42 F (const B &);
43 T *b1 () const;
44 };
45
b1()46 template < class T > inline T * F <T>::b1 () const
47 {
48 return (T *) B::b1 ();
49 };
50
51 typedef F <C> N;
52
53 class G {};
54 class H : public G {};
55 class I : public H {};
56 class J {};
57 class K {};
58 struct L
59 {
60 void l (J *, C *, int, const char *, O);
61 };
62 class M : public K, public I
63 {
64 void m (J &, int, const char *);
65 void m (J &, int, int, const char *, float);
66 };
67
68 void
m(J & x,int y,const char * z)69 M::m (J &x, int y, const char *z)
70 {
71 L *w = new L;
72 N v = e->e1 (y);
73 w->l (&x, v.b1 (), P, z, Q);
74 }
75
76 void
m(J & x,int y,int s,const char * z,float t)77 M::m (J &x, int y, int s, const char *z, float t)
78 {
79 L *w = new L;
80 N v = e->e1 (y);
81 w->l (&x, v.b1 (), s, z, (O) (int) ((t) ? (50 + 20 / (float) t) : 0));
82 }
83