--- /dev/null
+// { dg-do compile }
+
+typedef float __m128 __attribute__ ((__vector_size__ (16)));
+const int a = 0;
+enum
+{
+ ReadOnlyAccessors
+};
+template <typename> struct traits;
+struct A
+{
+ enum
+ {
+ value = 1
+ };
+};
+template <typename> struct EigenBase;
+template <typename> class J;
+template <typename, int = A::value> class DenseCoeffsBase;
+template <typename, int, int, int = 0, int = 0, int = 0> class K;
+template <typename> class N;
+template <typename, typename> class CwiseUnaryOp;
+template <typename> class L;
+template <typename> class P;
+template <typename> struct B;
+template <typename> struct C;
+template <typename Derived> struct dense_xpr_base
+{
+ typedef N<Derived> type;
+};
+template <typename Packet> void padd (Packet);
+template <> struct C<float>
+{
+ typedef __m128 type;
+};
+struct D
+{
+ void
+ packetOp (C<float>::type)
+ {
+ __m128 b = { m_other };
+ padd (b);
+ }
+ float m_other;
+};
+template <typename Derived>
+class DenseCoeffsBase<Derived, ReadOnlyAccessors> : public EigenBase<Derived>
+{
+public:
+ typedef typename C<typename traits<Derived>::Scalar>::type PacketScalar;
+};
+template <typename Derived>
+class DenseCoeffsBase<Derived>
+ : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
+{
+public:
+ template <typename OtherDerived, int, int LoadMode>
+ void
+ copyPacket (typename traits<Derived>::Index, J<OtherDerived> p2)
+ {
+ p2.derived ().template packet<LoadMode> (0);
+ }
+};
+template <typename Derived> class J : public DenseCoeffsBase<Derived>
+{
+public:
+ using DenseCoeffsBase<Derived>::derived;
+ template <typename OtherDerived>
+ Derived &lazyAssign (const J<OtherDerived> &);
+};
+template <typename Derived> class N : public J<Derived>
+{
+public:
+ template <typename OtherDerived>
+ typename B<OtherDerived>::Type operator*(N<OtherDerived>);
+ L<Derived> array ();
+};
+template <typename Derived> struct EigenBase
+{
+ Derived
+ derived () const
+ {
+ return *static_cast<const Derived *> (this);
+ }
+};
+template <typename Derived1, typename Derived2> struct F
+{
+ static void
+ run (Derived1 p1, Derived2 p2)
+ {
+ enum
+ {
+ srcAlignment
+ };
+ for (;;)
+ p1.template copyPacket<Derived2, 0, srcAlignment> (0, p2);
+ }
+};
+template <typename Derived>
+template <typename OtherDerived>
+Derived &
+J<Derived>::lazyAssign (const J<OtherDerived> &p1)
+{
+ F<Derived, OtherDerived>::run (derived (), p1.derived ());
+}
+template <typename Derived, typename OtherDerived> struct G
+{
+ static Derived
+ run (Derived p1, OtherDerived p2)
+ {
+ p1.lazyAssign (p2);
+ }
+};
+class H
+{
+public:
+ H (int, int, int);
+};
+template <typename Derived> class M : public dense_xpr_base<Derived>::type
+{
+public:
+ typedef typename traits<Derived>::Index Index;
+ H m_storage;
+ M (Index, Index, Index) : m_storage (0, 0, 0) {}
+ template <typename OtherDerived>
+ void
+ _set_noalias (J<OtherDerived> p1)
+ {
+ G<Derived, OtherDerived>::run (this->derived (), p1.derived ());
+ }
+};
+template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
+ int _MaxCols>
+struct traits<K<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+ typedef _Scalar Scalar;
+ typedef int StorageKind;
+ typedef int Index;
+};
+template <typename, int _Rows, int _Cols, int, int, int>
+class K : public M<K<float, _Rows, _Cols> >
+{
+public:
+ typedef M<K> Base;
+ typedef K Nested;
+ template <typename T0, typename T1> K (T0, T1);
+ template <typename OtherDerived> K (N<OtherDerived> p1) : Base (0, 0, 0)
+ {
+ Base::_set_noalias (p1);
+ }
+};
+template <typename UnaryOp, typename XprType>
+struct traits<CwiseUnaryOp<UnaryOp, XprType> > : traits<XprType>
+{
+};
+template <typename, typename, typename> class I;
+template <typename, typename XprType>
+class CwiseUnaryOp
+ : public I<D, XprType, typename traits<XprType>::StorageKind>
+{
+public:
+ D
+ functor ()
+ {
+ return m_functor;
+ }
+ typename XprType::Nested nestedExpression ();
+ D m_functor;
+};
+template <typename UnaryOp, typename XprType>
+class I<UnaryOp, XprType, int>
+ : public dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type
+{
+public:
+ typedef CwiseUnaryOp<UnaryOp, XprType> Derived;
+ typedef typename dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type Base;
+ typedef Derived Nested;
+ using Base::derived;
+ template <int LoadMode> void packet (typename traits<Derived>::Index)
+ {
+ derived ().functor ().packetOp (
+ derived ().nestedExpression ().template packet<LoadMode> (0));
+ }
+};
+template <typename> struct B
+{
+ typedef P<CwiseUnaryOp<D, L<K<float, 0, 1> > > > Type;
+};
+template <typename Derived> class O : public J<Derived>
+{
+public:
+ P<Derived> matrix ();
+};
+template <typename ExpressionType>
+struct traits<L<ExpressionType> > : traits<typename ExpressionType::Nested>
+{
+};
+template <typename ExpressionType> class L : public O<L<ExpressionType> >
+{
+public:
+ typedef L Nested;
+ template <int>
+ typename O<L>::PacketScalar packet (typename traits<L>::Index);
+};
+template <typename ExpressionType>
+struct traits<P<ExpressionType> > : traits<typename ExpressionType::Nested>
+{
+};
+template <typename ExpressionType> class P : public N<P<ExpressionType> >
+{
+public:
+ N<P> Base;
+ template <int LoadMode> void packet (typename traits<P>::Index)
+ {
+ m_expression.template packet<LoadMode> (0);
+ }
+ ExpressionType m_expression;
+};
+int
+main ()
+{
+ K<float, 0, a> m (0, 0);
+ K<float, 0, 1> c (0, 0);
+ c = m.array ().matrix () * m;
+}