Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/torture/pr64568.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// { dg-do compile } // { dg-additional-options "-std=c++11" } namespace std { typedef long unsigned size_t; template <typename> class complex; template <typename _Tp> complex<_Tp> operator+(complex<_Tp>, complex<_Tp>) { complex<_Tp> a = 0; a += 0; return a; } template <> struct complex<double> { complex (int __i) : _M_value{ __i } {} int imag (); void operator+=(complex __z) { _M_value = __z.imag (); } _Complex double _M_value; }; } class A { public: A (int); std::complex<double> &operator[](int i) { return data_[i]; } std::complex<double> *data_; }; struct B { static std::complex<double> apply (std::complex<double> t1, std::complex<double> t2) { return t1 + t2; } }; template <class T1, class> struct C { static void apply (T1 t1, std::complex<double> t2) { t1 = t2; } }; template <class E> class D { public: E operator()(); }; class G : public D<G> { public: typedef std::complex<double> value_type; value_type operator()(int) { return B::apply (0, 0); } }; template <class E1, class E2> G operator+(D<E1>, D<E2>); template <template <class, class> class F, class V, class E> void indexing_vector_assign (V v, D<E> e) { for (int i;; ++i) F<typename V::reference, typename E::value_type>::apply (v (i), e ()(0)); } template <template <class, class> class F, class V, class E> void vector_assign (V v, D<E> e, int) { indexing_vector_assign<F> (v, e); } template <template <class, class> class F, class V, class E> void vector_assign (V v, D<E> e) { vector_assign<F> (v, e, typename V::storage_category ()); } class H : public D<int> { public: typedef std::complex<double> &reference; typedef int storage_category; H (int); template <class AE> H (D<AE> ae) : data_ (0) { vector_assign<C> (*this, ae); } A data () { return data_; } reference operator()(int i) { return data ()[i]; } A data_; }; template <class T1, class V1, class T2, class V2> void rot (T1, V1 v1, T2, V2 v2) { H (v1 + v2); } template <class, unsigned long> struct F { void test (); }; template struct F<H, 3>; template <class V, std::size_t N> void F<V, N>::test () { V b (0), c (0); rot (0, b, 0, c); }