1 /* { dg-do compile } */
2 // { dg-additional-options "-Wno-return-type" }
3
4 template < typename > class basic_stringstream;
5
6 struct basic_string {
7 basic_string();
8 };
9
10 struct ios_base {
11 virtual ~ios_base();
12 };
13
14 class ostream:ios_base {};
15 class istream:virtual ios_base {};
16
17 template < typename > struct basic_iostream:public istream, ostream {
~basic_iostreambasic_iostream18 ~basic_iostream () {}
19 };
20 extern template class basic_iostream < char >;
21
22 template < typename > struct basic_stringstream:public basic_iostream < char > {
23 basic_string _M_stringbuf;
~basic_stringstreambasic_stringstream24 ~basic_stringstream () {}
25 };
26 extern template class basic_stringstream < char >;
27
28 template < typename > struct AnyMatrixBase;
29 template < typename, int _Rows, int _Cols, int = _Rows, int = _Cols > class Matrix;
30 template < typename > class CwiseNullaryOp;
31
32 template < typename Derived > struct MatrixBase:public AnyMatrixBase < Derived > {
33 typedef CwiseNullaryOp < Derived > ConstantReturnType;
34 ConstantReturnType Constant ();
35 template < typename > Derived cast ();
36 static CwiseNullaryOp < Derived > Random (int);
37 };
38
39 template < typename Derived > struct AnyMatrixBase {
derivedAnyMatrixBase40 Derived derived () {}
derivedAnyMatrixBase41 Derived & derived () const {}
42 };
43
44 template < typename, int > struct ei_matrix_storage {};
45
46 template < typename _Scalar, int, int, int _MaxRows, int _MaxCols > struct Matrix:MatrixBase < Matrix < _Scalar, _MaxRows, _MaxCols > > {
47 typedef MatrixBase < Matrix > Base;
48 ei_matrix_storage < int, _MaxCols > m_storage;
49 Matrix operator= (const Matrix other) {
50 _resize_to_match (other);
51 lazyAssign (other.derived ());
52 }
lazyAssignMatrix53 template < typename OtherDerived > Matrix lazyAssign (MatrixBase < OtherDerived > other) {
54 _resize_to_match (other);
55 return Base (other.derived ());
56 }
57 Matrix ();
MatrixMatrix58 template < typename OtherDerived > Matrix (const MatrixBase < OtherDerived > &other) {
59 *this = other;
60 }
_resize_to_matchMatrix61 template < typename OtherDerived > void _resize_to_match (const MatrixBase < OtherDerived > &) {
62 throw 1;
63 }
64 };
65
66 template < typename MatrixType > class CwiseNullaryOp:
67 public MatrixBase < CwiseNullaryOp < MatrixType > > {};
68
f()69 int f()
70 {
71 bool align_cols;
72 if (align_cols) {
73 basic_stringstream<char> sstr;
74 f();
75 }
76 }
77
78 template < typename > struct AutoDiffScalar;
79 template < typename Functor > struct AutoDiffJacobian:Functor {
80 AutoDiffJacobian (Functor);
81 typedef typename Functor::InputType InputType;
82 typedef typename Functor::ValueType ValueType;
83 typedef Matrix < int, Functor::InputsAtCompileTime, 1 > DerivativeType;
84 typedef AutoDiffScalar < DerivativeType > ActiveScalar;
85 typedef Matrix < ActiveScalar, Functor::InputsAtCompileTime, 1 > ActiveInput;
operatorAutoDiffJacobian86 void operator () (InputType x, ValueType *) {
87 ActiveInput ax = x.template cast < ActiveScalar > ();
88 }
89 };
90
91 template < int NX, int NY > struct TestFunc1 {
92 enum {
93 InputsAtCompileTime = NX
94 };
95 typedef Matrix < float, NX, 1 > InputType;
96 typedef Matrix < float, NY, 1 > ValueType;
97 typedef Matrix < float, NY, NX > JacobianType;
98 int inputs ();
99 };
100
forward_jacobian(Func f)101 template < typename Func > void forward_jacobian (Func f) {
102 typename Func::InputType x = Func::InputType::Random (f.inputs ());
103 typename Func::ValueType y;
104 typename Func::JacobianType jref = jref.Constant ();
105 AutoDiffJacobian < Func > autoj (f);
106 autoj (x, &y);
107 }
108
test_autodiff_scalar()109 void test_autodiff_scalar ()
110 {
111 forward_jacobian (TestFunc1 < 2, 2 > ());
112 forward_jacobian (TestFunc1 < 3, 2 > ());
113 }
114