| /* { dg-do compile } */ |
| // { dg-additional-options "-Wno-return-type" } |
| |
| template < typename > class basic_stringstream; |
| |
| struct basic_string { |
| basic_string(); |
| }; |
| |
| struct ios_base { |
| virtual ~ios_base(); |
| }; |
| |
| class ostream:ios_base {}; |
| class istream:virtual ios_base {}; |
| |
| template < typename > struct basic_iostream:public istream, ostream { |
| ~basic_iostream () {} |
| }; |
| extern template class basic_iostream < char >; |
| |
| template < typename > struct basic_stringstream:public basic_iostream < char > { |
| basic_string _M_stringbuf; |
| ~basic_stringstream () {} |
| }; |
| extern template class basic_stringstream < char >; |
| |
| template < typename > struct AnyMatrixBase; |
| template < typename, int _Rows, int _Cols, int = _Rows, int = _Cols > class Matrix; |
| template < typename > class CwiseNullaryOp; |
| |
| template < typename Derived > struct MatrixBase:public AnyMatrixBase < Derived > { |
| typedef CwiseNullaryOp < Derived > ConstantReturnType; |
| ConstantReturnType Constant (); |
| template < typename > Derived cast (); |
| static CwiseNullaryOp < Derived > Random (int); |
| }; |
| |
| template < typename Derived > struct AnyMatrixBase { |
| Derived derived () {} |
| Derived & derived () const {} |
| }; |
| |
| template < typename, int > struct ei_matrix_storage {}; |
| |
| template < typename _Scalar, int, int, int _MaxRows, int _MaxCols > struct Matrix:MatrixBase < Matrix < _Scalar, _MaxRows, _MaxCols > > { |
| typedef MatrixBase < Matrix > Base; |
| ei_matrix_storage < int, _MaxCols > m_storage; |
| Matrix operator= (const Matrix other) { |
| _resize_to_match (other); |
| lazyAssign (other.derived ()); |
| } |
| template < typename OtherDerived > Matrix lazyAssign (MatrixBase < OtherDerived > other) { |
| _resize_to_match (other); |
| return Base (other.derived ()); |
| } |
| Matrix (); |
| template < typename OtherDerived > Matrix (const MatrixBase < OtherDerived > &other) { |
| *this = other; |
| } |
| template < typename OtherDerived > void _resize_to_match (const MatrixBase < OtherDerived > &) { |
| throw 1; |
| } |
| }; |
| |
| template < typename MatrixType > class CwiseNullaryOp: |
| public MatrixBase < CwiseNullaryOp < MatrixType > > {}; |
| |
| int f() |
| { |
| bool align_cols; |
| if (align_cols) { |
| basic_stringstream<char> sstr; |
| f(); |
| } |
| } |
| |
| template < typename > struct AutoDiffScalar; |
| template < typename Functor > struct AutoDiffJacobian:Functor { |
| AutoDiffJacobian (Functor); |
| typedef typename Functor::InputType InputType; |
| typedef typename Functor::ValueType ValueType; |
| typedef Matrix < int, Functor::InputsAtCompileTime, 1 > DerivativeType; |
| typedef AutoDiffScalar < DerivativeType > ActiveScalar; |
| typedef Matrix < ActiveScalar, Functor::InputsAtCompileTime, 1 > ActiveInput; |
| void operator () (InputType x, ValueType *) { |
| ActiveInput ax = x.template cast < ActiveScalar > (); |
| } |
| }; |
| |
| template < int NX, int NY > struct TestFunc1 { |
| enum { |
| InputsAtCompileTime = NX |
| }; |
| typedef Matrix < float, NX, 1 > InputType; |
| typedef Matrix < float, NY, 1 > ValueType; |
| typedef Matrix < float, NY, NX > JacobianType; |
| int inputs (); |
| }; |
| |
| template < typename Func > void forward_jacobian (Func f) { |
| typename Func::InputType x = Func::InputType::Random (f.inputs ()); |
| typename Func::ValueType y; |
| typename Func::JacobianType jref = jref.Constant (); |
| AutoDiffJacobian < Func > autoj (f); |
| autoj (x, &y); |
| } |
| |
| void test_autodiff_scalar () |
| { |
| forward_jacobian (TestFunc1 < 2, 2 > ()); |
| forward_jacobian (TestFunc1 < 3, 2 > ()); |
| } |