// { dg-do compile } // { dg-options "-fno-tree-dse -O1 -ftrivial-auto-var-init=pattern" } class A; template class B { public: _Tp val[m * n]; }; class C { public: C(A); }; struct D { D(); unsigned long &operator[](int); unsigned long *p; }; class A { public: template A(const B<_Tp, m, n> &, bool); int rows, cols; unsigned char *data; unsigned char *datastart; unsigned char *dataend; unsigned char *datalimit; D step; }; template A::A(const B<_Tp, m, n> &p1, bool) : rows(m), cols(n) { step[0] = cols * sizeof(_Tp); datastart = data = (unsigned char *)p1.val; datalimit = dataend = datastart + rows * step[0]; } class F { public: static void compute(C); template static void compute(const B<_Tp, m, n> &, B<_Tp, nm, 1> &, B<_Tp, m, nm> &, B<_Tp, n, nm> &); }; D::D() {} unsigned long &D::operator[](int p1) { return p[p1]; } template void F::compute(const B<_Tp, m, n> &, B<_Tp, nm, 1> &, B<_Tp, m, nm> &, B<_Tp, n, nm> &p4) { A a(p4, false); compute(a); } void fn1() { B b, c, e; B d; F::compute(b, d, c, e); }