https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64568

--- Comment #7 from Markus Trippelsdorf <trippels at gcc dot gnu.org> ---
trippels@gcc2-power8 status % cat test22.ii
namespace std
{
typedef long unsigned size_t;
}
class H;
namespace std
{
template <typename> struct complex;
template <typename _Tp>
complex<_Tp> operator+(complex<_Tp> &__x, complex<_Tp> __y)
{
  complex<_Tp> a = __x;
  a += __y;
  return a;
}
template <> struct complex<double>
{
  int
  imag ()
  {
    return __imag__ _M_value;
  }
  void operator+=(complex __z) { _M_value += _M_value; _M_value  += __z.imag
(); }
  _Complex double _M_value;
};
}
struct A
{
  typedef std::complex<double> &const_reference;
};
class B
{
public:
  B (int);
  std::complex<double> &operator[](int i) { return data_[i]; }
  std::complex<double> *data_;
};
struct C
{
  static std::complex<double>
  apply (A::const_reference t1, std::complex<double> t2)
  {
    return t1 + t2;
  }
  typedef std::complex<double> result_type;
};
template <class T1, class> struct D
{
  static void
  apply (T1 t1, std::complex<double> t2)
  {
    t1 = t2;
  }
};
class ublas_expression
{
public:
  ~ublas_expression ();
};
template <class> class F
{
};
template <class E> class matrix_expression : ublas_expression
{
public:
  E &operator()() {}
};
class I : public F<int>
{
public:
  typedef int value_type;
  I (int);
};
template <class E1, class E2> matrix_expression<int> outer_prod (F<E1>, F<E2>);
template <class E1, class F> class J : public matrix_expression<J<E1, F> >
{
public:
  typedef typename F::result_type value_type;
  value_type operator()(int i, int)
  {
    return F::apply (e1_ (i, 0), e2_ (0, 0));
  }
  E1 e1_;
  E1 e2_;
};
template <class E1, class E2>
J<H, C> operator+(matrix_expression<E1>, matrix_expression<E2>);
template <template <class, class> class F, class M, class E>
void
indexing_matrix_assign (M m, matrix_expression<E> e, int)
{
  for (int i; i; ++i)
    F<typename M::reference, typename E::value_type>::apply (m (0, 0),
                                                             e ()(i, 0));
}
template <template <class, class> class F, class, class M, class E, class C>
void
matrix_assign (M m, matrix_expression<E> e, int, C)
{
  indexing_matrix_assign<F> (m, e, 0);
}
template <template <class, class> class F, class M, class E>
void
matrix_assign (M m, matrix_expression<E> e)
{
  matrix_assign<F, int> (m, e, 0, typename M::orientation_category ());
}
class H : matrix_expression<int>
{
public:
  typedef std::complex<double> &reference;
  typedef int orientation_category;
  H (int, int) : data_ (0) {}
  template <class AE> H (matrix_expression<AE> ae) : data_ (0)
  {
    matrix_assign<D> (*this, ae);
  }
  B &
  data ()
  {
  }
  std::complex<double> &operator()(int i, int) { return data ()[i]; }
  void operator+=(matrix_expression ae) { H (*this + ae); }
  B data_;
};
template <class M, class T, class V1, class V2>
void
sr2 (M m, T, V1 v1, V2 v2)
{
  m += outer_prod (v2, v1);
}
template <class, class, unsigned long> struct G
{
  void test ();
};
template struct G<I, H, 3>;
template <class V, class M, std::size_t N>
void
G<V, M, N>::test ()
{
  V b (0), c (0);
  M m (0, 0);
  sr2 (m, typename V::value_type (), b, c);
}

trippels@gcc2-power8 status % g++ -c -O2 -std=c++11 test22.ii
test22.ii: In member function ‘void G< <template-parameter-1-1>,
<template-parameter-1-2>, <anonymous> >::test() [with <template-parameter-1-1>
= I; <template-parameter-1-2> = H; long unsigned int <anonymous> = 3ul]’:
test22.ii:139:1: error: invalid reference prefix
 G<V, M, N>::test ()
 ^
MEM[base: _44, offset: 0]
cc1plus: note: in statement
# VUSE <.MEM_59>
_26 = IMAGPART_EXPR <MEM[base: _44, offset: 0]>;
test22.ii:139:1: error: invalid reference prefix
MEM[base: _44, offset: 0]
cc1plus: note: in statement
# VUSE <.MEM_59>
_51 = REALPART_EXPR <MEM[base: _44, offset: 0]>;
test22.ii:139:1: internal compiler error: verify_gimple failed

Reply via email to