// PR target/70098 // { dg-do compile } // { dg-options -O2 } // { dg-require-effective-target c++11 } template < typename > struct traits; template < typename, int _Rows, int _Cols, int = 0, int = _Rows, int = _Cols > class Matrix; template < typename > class G; template < typename Derived > struct A { typedef G < Derived > type; }; template < typename Derived > class C { public: enum { RowsAtCompileTime = traits < Derived >::RowsAtCompileTime } static Zero; }; template < typename Derived > class G:public C < Derived > { }; template < int _Rows > class D { public: long rows() { return _Rows; } }; template < typename Derived > class PlainObjectBase:public A < Derived >::type { typedef typename A < Derived >::type Base; D < Base::RowsAtCompileTime > m_storage; public: long rows() { return m_storage.rows(); } }; int fn1(); struct B { static long run(long x, long) { int offset(fn1()); return x + offset; }}; long fn2(int x) { return B::run(x, 0); } template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols > struct traits > { enum { RowsAtCompileTime = _Rows }; }; template < typename, int, int, int, int _MaxRows, int _MaxCols > class Matrix:public PlainObjectBase < Matrix < double, _MaxRows, _MaxCols >> { public: template < typename OtherDerived > Matrix(OtherDerived); }; struct F { static Matrix < double, 2, 2 > run(long size) { Matrix < double, 2, 2 > diag = Matrix < double, 2, 2 >::Zero; long i = 0; while (i < size) { long randomInt = fn2(-1); if (randomInt == 0) ++i; else { double alpha(randomInt); diag = alpha; i = 2; } } return diag; } }; void fn3(Matrix < double, 2, 2 > m) { long size = m.rows(); F::run(size); }