blob: 8987c34801534a3b037b76dbba5e4cd3e3817cf7 [file] [log] [blame]
// PR ipa/90939
// { dg-lto-do link }
// { dg-lto-options { { -flto -O3 } } }
typedef char uint8_t;
template <class T> class A {
public:
A(T *);
};
template <typename Derived, typename Base> const Derived &To(Base &p1) {
return static_cast<const Derived &>(p1);
}
class H;
template <typename, typename Base> const H *To(Base *p1) {
return p1 ? &To<H>(*p1) : nullptr;
}
enum TextDirection : uint8_t;
enum WritingMode : unsigned;
class B {
public:
WritingMode m_fn1();
};
class C {
public:
int &m_fn2();
};
class D { double d;};
class H : public D {};
class F {
public:
F(C, A<const int>, B *, WritingMode, TextDirection);
};
class G {
public:
C NGLayoutAlgorithm_node;
B NGLayoutAlgorithm_space;
TextDirection NGLayoutAlgorithm_direction;
H NGLayoutAlgorithm_break_token;
G(A<const int> p1) __attribute__((noinline))
: break_token_(&NGLayoutAlgorithm_break_token),
container_builder_(NGLayoutAlgorithm_node, p1, &NGLayoutAlgorithm_space,
NGLayoutAlgorithm_space.m_fn1(),
NGLayoutAlgorithm_direction) {}
G(C p1, const H *) : G(&p1.m_fn2()) {}
A<H> break_token_;
F container_builder_;
};
class I : G {
public:
I(const D *) __attribute__((noinline));
};
C a;
I::I(const D *p1) : G(a, To<H>(p1)) {}
D gd[10];
int main (int argc, char *argv[])
{
I i(&(gd[argc%2]));
return 0;
}