view gcc/testsuite/g++.dg/cpp1y/constexpr-89652.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

// PR c++/89652
// { dg-do compile { target c++14 } }
// { dg-options "" }

template <typename T> constexpr auto foo (T &e) { return e.foo (); }
template <typename T> constexpr auto bar (T &e) { return foo (e); }
template <typename T, int N> struct A { typedef T a[N]; };
template <typename T, unsigned long N> struct B {
  typedef T *b;
  typename A<T, N>::a d;
  constexpr b foo () { return d; }
};
template <typename> struct C { long m; };
struct D { long n; };
template <typename, unsigned long> struct E {
  B<C<int>, 1>::b p;
  constexpr D operator* () { return {p->m}; }
  constexpr E operator++ (int) { auto a{*this}; ++p; return a; }
};
template <typename T, unsigned long N>
constexpr bool operator!= (E<T, N> a, E<T, N>) { return a.p; }
template <unsigned long N, typename T, unsigned long M>
constexpr auto baz (B<T, M> s, B<D, N>)
{
  B<D, M> t{};
  auto q{foo (t)};
  using u = E<T, M>;
  auto v = u{bar (s)};
  auto w = u{};
  while (v != w)
    *q++ = *v++;
  return t;
}
constexpr auto a = B<C<int>, 5>{};
auto b = B<D, 0>{};
auto c = baz (a, b);