blob: 49102e6c1a19a71982a726347d5b423abc6a84d0 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-require-effective-target c++11 } */
/* { dg-additional-options "-O3" } */
/* { dg-additional-options "-march=z13" { target s390x-*-* } } */
template <int a> struct k { static constexpr int c = a; };
template <bool, bool, typename...> struct o;
template <typename f, typename... g> struct o<false, false, f, g...> {
typedef decltype(0) h;
};
template <typename... g> struct p : o<k<false>::c, k<false>::c, g...> {};
class q;
class r {
public:
void ap(q);
};
template <typename, typename aw> void ax(aw ay) { ay(); }
template <typename az> void ba(az bb) {
using bc = p<az>;
using bd = typename bc::h;
ax<bd>(bb);
}
template <unsigned> class s;
class t {
public:
s<8> br();
template <typename...> void operator()() { ba(br()); }
};
class q {
public:
template <typename az> q(az) { H(); }
struct H {
t cc;
H() { cc(); }
};
};
template <unsigned long> struct I {};
template <unsigned long cl, typename j> void cm(j cn, I<cl>) {
cm(cn, I<cl - 1>());
cn(cl);
}
template <typename j> void cm(j, I<0>) {}
template <unsigned co> struct u {
long cp[co];
void cq(const u &);
void cs(int);
void operator<(u);
};
template <unsigned co> void u<co>::cq(const u &l) {
cm([&](int i) { cp[i] &= l.cp[i]; }, I<co>());
}
template <unsigned co> void u<co>::cs(int m) {
cm([&](int i) { cp[i] >>= m; }, I<co - 2>());
}
template <unsigned> class K;
template <unsigned co> class v {
int cv;
friend K<co>;
public:
void cx(int, unsigned char *, unsigned long long);
};
template <unsigned co> class K {
public:
static void cx(v<co> &);
};
template <unsigned co>
void v<co>::cx(int, unsigned char *, unsigned long long) {
K<co>::cx(*this);
}
template <unsigned co> void K<co>::cx(v<co> &cz) {
u<co> a, b, d;
int e, n = cz.cv;
for (; e;)
if (cz.cv)
a.cs(cz.cv);
a.cq(d);
a < b;
}
template <unsigned co> class s {
v<co> *dh;
public:
void operator()();
};
template <unsigned co> void s<co>::operator()() {
int f;
unsigned char g;
long h;
dh->cx(f, &g, h);
}
void d() {
r i;
t j;
i.ap(j);
}